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. Вы можете сделать это в редакторе, добавив позицию, подобную этой:

Screenshot of info.plist with NSBluetoothAlwaysUsadeDescription as the key and explanation text as the String value

Или вы можете щелкнуть правой кнопкой мыши на 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 для связи".