NSBluetoothAlwaysUsageDescription се изисква, но bluetooth не се използва
В моето приложение за ios с нов Xcode 11 GM Seed 2 след внедряване, Apple върна грешка: ITMS-90683: Липсващ низ за цел в Info.plist с NSBluetoothAlwaysUsageDescription.
Проверете секцията „Свързани рамки и библиотеки“ за всички цели (целеви проекти, както и цели на под). За да откриете коя цел използвате функцията Bluetooth.
- personAbhi Yaduwanshi  schedule18.09.2019
comment
@AbhiYaduwanshi имам 30+ елемента под рамки, библиотеки и вградено съдържание. Къде пише дали използва bluetooth?
- 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 в моя project.pbxproj
Премахнах препратката и изграждането на приложението мина добре. Качен в 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 и 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>
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. Уверих се в това, като го премахнах от pods и стартирах отново приложението. (Мисля, че всички трябва да попитаме Google защо се нуждаят от bluetooth, за да показват мобилни реклами)
Както и да е, можете да спрете срива на приложението си, като добавите NSBluetoothAlwaysUsageDescription към своя plist засега.
Ако приложението ви има цел за внедряване, по-стара от 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 се намира (по подразбиране) в групата „Поддържащи файлове“ на папката на 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 за комуникационни цели“.
NSBluetoothPeripheralUsageDescription
, но изглежда, чеNSBluetoothAlwaysUsageDescription
вече е задължителен (не сме актуализирали никакъв код или добавки, така че това трябва да е промяна от страна на Apple) - person chrisfrancis27   schedule 18.09.2019