NSBluetoothAlwaysUsage Описание требуется, но bluetooth не используется
В моем приложении для iOS с новым Xcode 11 GM Seed 2 после развертывания яблоко вернуло ошибку: ITMS-90683: отсутствует строка цели в Info.plist с NSBluetoothAlwaysUsageDescription.
Проверьте раздел «Связанные платформы и библиотеки» для всех целей (цель проекта, а также цели модуля). Чтобы узнать, какая цель использует функцию Bluetooth.
- personAbhi Yaduwanshi  schedule18.09.2019
comment
@AbhiYaduwanshi У меня более 30 элементов в разделах «Фреймворки», «Библиотеки» и «Встроенный контент». Где написано если блютуз пользуется?
- personNik Kov  schedule18.09.2019
comment
Проверьте, есть ли какой-либо фреймворк с именем CoreBluetooth.framework
- personAbhi Yaduwanshi  schedule18.09.2019
comment
Я тоже получаю ту же ошибку. Мой код, а также SDK не используют Bluetooth.
- personEmre Önder  schedule18.09.2019
comment
Это только начало происходить с моим приложением сегодня. У нас уже был установлен NSBluetoothPeripheralUsageDescription, но похоже, что теперь NSBluetoothAlwaysUsageDescription стал обязательным (мы не обновляли код или плагины, поэтому это должно быть изменение со стороны Apple)
- personchrisfrancis27  schedule18.09.2019
comment
Мы также начали получать это сегодня утром, без (насколько нам известно) каких-либо ссылок на CoreBluetooth.
- personErik Kerber  schedule18.09.2019
comment
Ищите такие вещи, как рекламные рамки; admob определенно вызывает это. Это часть того, что iOS 13 ограничивает компании, использующие Bluetooth для отслеживания местоположения пользователей, не сообщая им об этом.
- personPaulw11  schedule02.10.2019
Сегодня у меня была такая же проблема. Когда я выполнил поиск с помощью grep, я обнаружил, что в моем проекте есть ссылка на CoreBluetooth.framework.
Я удалил ссылку, и создание приложения прошло нормально. Загрузил в Apple, и все прошло, так что у меня это сработало.
Для поиска используйте следующую команду
grep -r -a CoreBluetooth.framework ProjectFolder
personMauriceschedule18.09.2019
comment
Четко показано, где в нашем проекте упоминается CoreBluetooth.framework. Могу подтвердить, что он прошел после удаления ссылки. Большое спасибо!
- personJMiao; 19.09.2019
comment
@Maurice Разве мы не должны использовать только имя фреймворка (без расширения) для получения точного результата: grep -r -a CoreBluetooth ProjectFolder?
- personDeepak; 19.09.2019
comment
Да, если вы хотите найти все, что связано с CoreBluetooth, вы можете это сделать. Однако я хотел искать только с расширением. -a обрабатывает файлы как текст. -r делает его рекурсивным
- personMaurice; 19.09.2019
comment
Я выполнил поиск без .framework и не смог найти ничего другого. Но для вашего проекта все может быть иначе.
- personMaurice; 19.09.2019
Откройте свой 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>
personChase Robertsschedule19.09.2019
comment
Вопрос задается, когда приложение не использует Bluetooth, поэтому добавление этого описания может привести к путанице в будущем.
- personDaniel 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 ссылки. Бывший:
Сторонняя библиотека / фреймворк / модуль в вашем приложении может использовать CoreBluetooth. Просто добавьте NSBluetoothAlwaysUsageDescription в свой Info.plist, ошибка исчезнет.
<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>
personShakeel Ahmedschedule03.03.2020
comment
Чем это отличается от ответа Марка?
- personAkshit Zaveri; 22.04.2020
comment
Я пробовал это в Swift 5, он работает для меня, поэтому его легко понять, я упоминаю слово swift5
- personShakeel Ahmed; 23.04.2020
comment
Конечно. Но это должно добавить некоторую ценность в таблицу. Ваш ответ - нет. Я думаю, вам следует удалить этот ответ, прежде чем кто-то сообщит о его дублировании.
- personAkshit Zaveri; 23.04.2020
В моем случае я не использовал API, связанный с Bluetooth, но из-за этого приложение вылетало из строя. И я узнал, что в Google Mobile Ads используется Bluetooth. Я убедился в этом, удалив его из модулей и перезапустив приложение. (Я думаю, мы все должны спросить Google, зачем им Bluetooth для показа мобильной рекламы)
В любом случае, вы можете предотвратить сбой своего приложения, добавив на данный момент NSBluetoothAlwaysUsageDescription в свой список.
Если ваше приложение имеет цель развертывания более раннюю, чем iOS 13, добавьте ключ NSBluetoothPeripheralUsageDescription в файл списка свойств информации вашего приложения в дополнение к ключу NSBluetoothAlwaysUsageDescription, поскольку одна или несколько сторонних организаций в вашем проекте используют функции Bluetooth.
Судя по всему, Apple внесла некоторые изменения в политику. В противном случае возникает необходимость запрашивать неиспользуемые флаги. Это очень тревожно. Мои приложения также отклонялись по этим причинам, хотя старые версии работают без этого.
Я пробовал ответить Мориса с расширением .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 для моего приложения было сказано, что доставка прошла успешно, но я могу, если хочу внести изменения в отношении указанной проблемы.
Вы должны добавить 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 для связи».
NSBluetoothPeripheralUsageDescription
, но похоже, что теперьNSBluetoothAlwaysUsageDescription
стал обязательным (мы не обновляли код или плагины, поэтому это должно быть изменение со стороны Apple) - person chrisfrancis27   schedule 18.09.2019