NSBluetoothAlwaysUsageDescription требуется, но Bluetooth не используется
В моем приложении ios с новым Xcode 11 GM Seed 2 после развертывания яблоко вернуло ошибку:
ITMS-90683: отсутствует строка назначения в Info.plist с NSBluetoothAlwaysUsageDescription.
https://developer.apple.com/documentation/bundleresources/information_property_list/nsbluetoothalwaysusagedescription?language=objc читаемые.
Проблема в том, что я не использую Bluetooth в своем приложении. Или, может быть, я не знаю об этом. Как я могу узнать, зачем нужна эта цель разрешения?
Я не использую CoreBluetooth.framework
Ответы
Ответ 1
У меня была точно такая же проблема сегодня. Когда я выполнил поиск grep, я обнаружил, что внутри моего проекта есть какая-то ссылка на CoreBluetooth.framework. Pbxproj
Я удалил ссылку, и сборка приложения прошла нормально. Загрузил в Apple, и он прошел, так что это сработало для меня.
Для поиска используйте следующую команду
grep -r -a CoreBluetooth.framework ProjectFolder
Ответ 2
Откройте ваш Info.plist и добавьте NSBluetoothAlwaysUsageDescription
. Вы можете сделать это в редакторе, добавив позицию, подобную этой:
Или вы можете щелкнуть правой кнопкой мыши на Info.plist и Открыть как → Исходный код и вставить в две соответствующие строки как 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>
Ответ 3
Сторонняя библиотека /framework/pod в вашем приложении может использовать CoreBluetooth. Просто добавьте NSBluetoothAlwaysUsageDescription
в ваш Info.plist, ошибка исчезнет.
Ответ 4
Мне удалось отменить использование 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 "[email protected]"; do
find_usages "$arg"
done
Это будет копаться в основном двоичном файле + включенных в него фреймворках, чтобы найти ссылки CBCentralManager
. Пример:
./find-bluetooth-usages.sh /path/to/MyApp.app
Ответ 5
Если ваше приложение имеет цель развертывания более раннюю, чем iOS 13, добавьте ключ NSBluetoothPeripheralUsageDescription в файл списка свойств информации приложений в дополнение к ключу NSBluetoothAlwaysUsageDescription, поскольку один или несколько сторонних разработчиков в вашем проекте используют функциональные возможности Bluetooth.
Ответ 6
Очевидно, Apple внесла некоторые изменения в политику. В противном случае он устает запрашивать неиспользуемые флаги. Это очень касается.
Я также получил отклонение моих приложений по этим причинам, в то время как старые версии работают без этого.
Ответ 7
Я попробовал ответ мориса, с расширением .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
для моего приложения было сказано, что доставка прошла успешно, но я могу, если я хочу внести изменения в отношении указанной проблемы.
Ответ 8
Вы должны добавить как NSBluetoothPeripheralUsageDescription, так и NSBluetoothAlwaysUsageDescription в ваш файл Info.plist. Ваш файл Info.plist находится (по умолчанию) внутри группы папок с проектами "Вспомогательные файлы" и может называться примерно как {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 для связи" или что угодно. Как только это будет сделано, нажмите эту же кнопку плюс еще раз, и вы получите тот же список drpdown. Игнорируйте этот список и просто вставьте туда строку NSBluetoothAlwaysUsageDescription. Затем нажмите на значение справа и вставьте "Приложение хочет использовать ваш Bluetooth для связи".