ios - NSBluetoothAlwaysUsageDescription是必需的,但未使用蓝牙




xcode permissions (5)

在部署新Xcode 11 GM Seed 2的ios应用中,苹果返回了错误: ITMS-90683:Info.plist中缺少NSBluetoothAlwaysUsageDescription的目的字符串

https://developer.apple.com/documentation/bundleresources/information_property_list/nsbluetoothalwaysusagedescription?language=objc 读取。

问题是我没有在应用程序中使用蓝牙。 也许我不知道。 我如何找出为什么需要此许可目的?

我没有使用 CoreBluetooth.framework


如果您的应用的部署目标早于iOS 13,则除了NSBluetoothAlwaysUsageDescription键外,还应将NSBluetoothPeripheralUsageDescription键添加到应用的信息属性列表文件中,因为项目中的一个或多个第三方使用了蓝牙功能。


您应用中的第三方库/框架/吊舱可能正在使用CoreBluetooth。 只要在您的Info.plist中添加 NSBluetoothAlwaysUsageDescription ,错误就会消失。


我尝试了Maurice的答案(带有和不带有 .framework 扩展名),但是在我的项目中没有找到对 CoreBluetooth 任何引用。 我以前也曾在 Info.plist 文件中添加过:“ Privacy - Bluetooth Peripheral Usage Description ”,字符串值:“ App would like to use your bluetooth for communication purposes" ”。这也没有用。
最后,在看到Chase Roberts的回答后,我添加了:“ NSBluetoothAlwaysUsageDescription ”,其字符串值为:“ App would like to use your bluetooth for communication purposes ”。 此后,发布时不再针对我的应用显示此错误。

注意: 在错误警告中: ITMS-90683 ,因为我的应用程序已成功交付,但是如果我希望对指定的问题进行更改,我可以这样做。


打开您的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>

通过扫描符号用法,尤其是寻找 CBCentralManager ,我能够消除CoreBluetooth的用法。 我编写的脚本是这样做的:

#!/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







xcode11