NSBluetoothAlwaysUsage Описание требуется, но 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


person Nik Kov    schedule 18.09.2019    source источник
comment
Проверьте раздел «Связанные платформы и библиотеки» для всех целей (цель проекта, а также цели модуля). Чтобы узнать, какая цель использует функцию Bluetooth.   -  person Abhi Yaduwanshi    schedule 18.09.2019
comment
@AbhiYaduwanshi У меня более 30 элементов в разделах «Фреймворки», «Библиотеки» и «Встроенный контент». Где написано если блютуз пользуется?   -  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.

Я удалил ссылку, и создание приложения прошло нормально. Загрузил в 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 с NSBluetoothAlwaysUsadeDescription в качестве ключа и текста объяснения в качестве значения String

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

Swift 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. Я убедился в этом, удалив его из модулей и перезапустив приложение. (Я думаю, мы все должны спросить Google, зачем им Bluetooth для показа мобильной рекламы)

В любом случае, вы можете предотвратить сбой своего приложения, добавив на данный момент NSBluetoothAlwaysUsageDescription в свой список.

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 находится (по умолчанию) в группе "Вспомогательные файлы" папки проекта и может называться как-то вроде {ИМЯ ПРОЕКТА} -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 в раскрывающемся списке, вам придется добавить его вручную. Очень полезно. В любом случае, справа от заголовка Information Property List есть небольшая кнопка с плюсом, просто нажмите на нее. На шаге 1 вы ищите «Конфиденциальность - Описание использования периферийных устройств Bluetooth». Это читаемое имя для NSBluetoothPeripheralUsageDescription. Затем просто нажмите на значение справа и введите свой текст, например «Приложение хочет использовать ваш bluetooth для связи» или иначе. Как только это будет сделано, нажмите ту же кнопку с плюсом еще раз, и вы получите тот же выпадающий список. Игнорируйте этот список и просто вставьте туда строку NSBluetoothAlwaysUsageDescription. Затем щелкните значение справа и вставьте «Приложение хочет использовать ваш Bluetooth для связи».

person Marc    schedule 02.10.2019