NSBluetoothAlwaysUsageDescription се изисква, но bluetooth не се използва

В моето приложение за ios с нов Xcode 11 GM Seed 2 след внедряване, Apple върна грешка: ITMS-90683: Липсващ низ за цел в Info.plist с NSBluetoothAlwaysUsageDescription.

https://developer.apple.com/documentation/bundleresources/information_property_list/nsbluetoothalwaysusagedescription?language=objc прочетено.

Проблемът е, че не използвам bluetooth в приложението си. Или може би аз не знам за това. Как мога да разбера защо е необходимо това разрешение?

не използвам CoreBluetooth.framework


person Nik Kov    schedule 18.09.2019    source източник
comment
Проверете секцията „Свързани рамки и библиотеки“ за всички цели (целеви проекти, както и цели на под). За да откриете коя цел използвате функцията Bluetooth.   -  person Abhi Yaduwanshi    schedule 18.09.2019
comment
@AbhiYaduwanshi имам 30+ елемента под рамки, библиотеки и вградено съдържание. Къде пише дали използва bluetooth?   -  person Nik Kov    schedule 18.09.2019
comment
Проверете дали има някаква рамка с име CoreBluetooth.framework   -  person Abhi Yaduwanshi    schedule 18.09.2019
comment
И аз получавам същата грешка. Моят код, а също и SDK не използват bluetooth.   -  person Emre Önder    schedule 18.09.2019
comment
Това току-що започна да се случва за приложението ми днес. Вече имахме зададен NSBluetoothPeripheralUsageDescription, но изглежда, че NSBluetoothAlwaysUsageDescription вече е задължителен (не сме актуализирали никакъв код или добавки, така че това трябва да е промяна от страна на Apple)   -  person chrisfrancis27    schedule 18.09.2019
comment
Ние също започнахме да получаваме това от тази сутрин, без (доколкото ни е известно) никакви препратки към CoreBluetooth.   -  person Erik Kerber    schedule 18.09.2019
comment
Търсете неща като рекламни рамки; admob определено задейства това. Това е част от iOS 13, който ограничава компаниите, които използват Bluetooth за проследяване на потребителското местоположение, без да им казват.   -  person Paulw11    schedule 02.10.2019


Отговори (10)


Днес имах точно същия проблем. Когато направих grep търсене, открих, че има някаква препратка към CoreBluetooth.framework в моя project.pbxproj

Премахнах препратката и изграждането на приложението мина добре. Качен в Apple и мина, така че това работи за мен.

За търсене използвайте следната команда

grep -r -a CoreBluetooth.framework ProjectFolder
person Maurice    schedule 18.09.2019
comment
Ясно показва къде се споменава CoreBluetooth.framework в нашия проект. Мога да потвърдя, че е преминал след премахване на препратката. Благодаря много! - person JMiao; 19.09.2019
comment
@Maurice Не трябва ли да използваме само името на рамката (без разширение) за точен резултат: grep -r -a CoreBluetooth ProjectFolder? - person Deepak; 19.09.2019
comment
Да, ако искате да намерите всичко, свързано с CoreBluetooth, можете да го направите. Аз обаче исках да търся само с разширението. -a третира файловете като текст. -r го прави рекурсивен - person Maurice; 19.09.2019
comment
Направих търсене без .framework и не можах да намеря други неща. Но може да е различно за вашия проект. - person Maurice; 19.09.2019

Отворете своя Info.plist и добавете NSBluetoothAlwaysUsageDescription. Можете да направите това в редактора, като добавите ред като този:

„Екранна

Или можете да щракнете с десния бутон върху Info.plist и Open As -> Source Code и да поставите двата подходящи реда като xml:

<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
    ....
    <key>NSBluetoothPeripheralUsageDescription</key>
    <string>We use Bluetooth to connect to the MantisX hardware device.</string>
    ....
</dict>
</plist>
person Chase Roberts    schedule 19.09.2019
comment
Въпросът се задава, когато приложението не използва Bluetooth, така че добавянето на това описание може да доведе до объркване в бъдеще - person Daniel Benedykt; 09.10.2019

Успях да потуша използването на CoreBluetooth чрез сканиране за използване на символи, по-специално търсейки CBCentralManager. Скриптът, който написах, за да го направя:

#!/usr/bin/env bash
#
# find-bluetooth-usages.sh <app1.app> <app2.app> ...

check_references_corebluetooth() {
  nm "$1" | grep "CBCentralManager" 2>&1 >/dev/null
}

find_usages () {
  app_path=$1
  if [[ ! -d $app_path || ! -d "$app_path/Frameworks" ]]; then
    echo "$app_path is not a valid app directory."
    exit 1
  fi
  app_filename=$(basename -- "$app_path")
  app_name="${app_filename%.*}"

  if check_references_corebluetooth "$app_path/$app_name"; then
    echo "$app_name contains references to CoreBluetooth"
  fi
  for framework_filename in $(ls "$app_path/Frameworks" | egrep '\.framework$'); do
    framework_path="$app_path/Frameworks/$framework_filename"
    framework_name=$(basename "$framework_path" .framework)
    if check_references_corebluetooth "$framework_path/$framework_name"; then
      echo "$framework_name contains references to CoreBluetooth"
    fi
  done
}

for arg in "$@"; do
  find_usages "$arg"
done

Това ще разрови основния двоичен файл + включените в него рамки, за да намери CBCentralManager препратки. Пример:

./find-bluetooth-usages.sh /path/to/MyApp.app

person John    schedule 19.09.2019

Библиотека/рамка/под на трета страна във вашето приложение може да използва CoreBluetooth. Просто добавете NSBluetoothAlwaysUsageDescription във вашия Info.plist, грешката ще изчезне.

person Deepak    schedule 18.09.2019

Суифт 5

<key>NSBluetoothAlwaysUsageDescription</key>
<string>App would like to use your bluetooth for communication purposes</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>App would like to use your bluetooth for communication purposes</string>
person Shakeel Ahmed    schedule 03.03.2020
comment
Как това се различава от отговора на Марк? - person Akshit Zaveri; 22.04.2020
comment
пробвах го в swift 5, работи за мен, така че е лесно за разбиране, споменавам думата swift5 - person Shakeel Ahmed; 23.04.2020
comment
Сигурен. Но трябва да добави някаква стойност към таблицата. Вашият отговор не е така. Мисля, че трябва да изтриете този отговор, преди някой да го докладва като дубликат. - person Akshit Zaveri; 23.04.2020

В моя случай не използвах API, свързан с bluetooth, но приложението се срива поради това. И разбрах, че Google Mobile Ads използва bluetooth. Уверих се в това, като го премахнах от pods и стартирах отново приложението. (Мисля, че всички трябва да попитаме Google защо се нуждаят от bluetooth, за да показват мобилни реклами)

Както и да е, можете да спрете срива на приложението си, като добавите NSBluetoothAlwaysUsageDescription към своя plist засега.

person ysnzlcn    schedule 02.04.2020

Ако приложението ви има цел за внедряване, по-стара от iOS 13, добавете ключа NSBluetoothPeripheralUsageDescription към файла със списъка на свойствата на информацията на приложението си в допълнение към ключа NSBluetoothAlwaysUsageDescription, тъй като една или повече трети страни във вашия проект използват Bluetooth функционалност.

person vatsal tanna    schedule 18.09.2019

Очевидно Apple е направила някои промени в политиката. В противен случай е странно да поискате неизползвани флагове. Това е много тревожно. Приложенията ми също бяха отхвърлени поради тези причини, докато по-старите версии работят без това.

person jolly    schedule 18.09.2019

Опитах отговора на Морис, със и без разширение .framework, но не намерих препратка към CoreBluetooth в моя проект. Също така бях добавил преди това във файл Info.plist: "Privacy - Bluetooth Peripheral Usage Description", със стойност на низ: "App would like to use your bluetooth for communication purposes"". Това също не проработи.
Накрая, след като видях отговора на Чейс Робъртс, добавих: "NSBluetoothAlwaysUsageDescription", със стойност на низ: "App would like to use your bluetooth for communication purposes". След това тази грешка не се показва отново за приложението ми по време на публикуване.

Забележка: В предупреждението за грешка: ITMS-90683, за моето приложение беше казано, че доставката е била успешна, но мога, ако искам, да направя промени по отношение на посочения проблем.

person Bane M    schedule 23.09.2019

Трябва да добавите както NSBluetoothPeripheralUsageDescription, така и NSBluetoothAlwaysUsageDescription към вашия файл Info.plist. Вашият файл Info.plist се намира (по подразбиране) в групата „Поддържащи файлове“ на папката на prroject и може да се нарича нещо като {PROJECTNAME}-Info.plist. Имате няколко възможности за избор за добавянето му. Един избор е просто да редактирате файла от командния ред с помощта на vim или каквото и да е друго. След това добавете тези редове:

<key>NSBluetoothAlwaysUsageDescription</key>
<string>App would like to use your bluetooth for communication purposes</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>App would like to use your bluetooth for communication purposes</string>

Вторият избор е да щракнете два пъти върху файла Info.plist в XCode и да използвате „супер полезния“ редактор на XCode. Този досаден редактор всъщност няма NSBluetoothAlwaysUsageDescription в падащ списък, трябва да го добавите ръчно. Супер полезно. Както и да е, има малък бутон плюс вдясно от заглавката на информационния списък със свойства, просто щракнете върху него. В стъпка 1 търсите „Поверителност – описание на използването на периферна Bluetooth“. Това е четливото име за NSBluetoothPeripheralUsageDescription. След това просто щракнете върху частта със стойността вдясно и въведете своя текст, като „Приложението иска да използва вашия bluetooth за комуникационни цели“ или друго. След като това стане, щракнете отново върху същия бутон плюс и ще получите същия списък за падане. Игнорирайте този списък и просто поставете там низа NSBluetoothAlwaysUsageDescription. След това щракнете върху стойността вдясно и поставете „Приложението иска да използва вашия bluetooth за комуникационни цели“.

person Marc    schedule 02.10.2019