新しいXcode 11の私のiOSアプリではGM Seed 2、Apple返されたエラー:ITMS-90683:NSBluetoothAlwaysUsageDescriptionを持つInfo.plistに目的文字列がありません。
問題は、アプリでBluetoothを使用しないことです。それとも私はそれについて知りません。この許可の目的が必要な理由を知るにはどうすればよいですか?
CoreBluetooth.framework
を使用していません
今日もまったく同じ問題がありました。 grep検索を行ったとき、私のプロジェクト内にCoreBluetooth.frameworkへの参照があることがわかりました.pbxproj
参照を削除し、アプリの構築はうまくいきました。 Appleにアップロードしましたが、これで問題なく動作しました。
検索するには、次のコマンドを使用します
grep -r -a CoreBluetooth.framework ProjectFolder
Info.plistを開き、NSBluetoothAlwaysUsageDescription
を追加します。エディターでこれを行うには、次のような行項目を追加します。
または、Info.plistを右クリックして[名前を付けて開く]-> [ソースコード]をクリックし、適切な2行に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 "$@"; do
find_usages "$arg"
done
これにより、メインバイナリとそれに含まれるフレームワークを調べ、CBCentralManager
参照を見つけます。例:
./find-bluetooth-usages.sh /path/to/MyApp.app
アプリのサードパーティライブラリ/フレームワーク/ポッドがCoreBluetoothを使用している可能性があります。 Info.plistにNSBluetoothAlwaysUsageDescription
を追加するだけで、エラーはなくなります。
アプリにiOS 13より前の導入ターゲットがある場合、プロジェクトの1つ以上のサードパーティがBluetooth機能を使用するため、NSBluetoothAlwaysUsageDescriptionキーに加えて、NSBluetoothPeripheralUsageDescriptionキーをアプリの情報プロパティリストファイルに追加します。
スウィフト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>
NSBluetoothPeripheralUsageDescriptionとNSBluetoothAlwaysUsageDescriptionの両方をInfo.plistファイルに追加する必要があります。 Info.plistファイルは、(デフォルトでは)prrojectフォルダーの「Supporting Files」グループ内にあり、{PROJECTNAME} -Info.plistのような名前で呼ばれる場合があります。追加する方法はいくつかあります。 1つの選択肢は、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>
2番目の選択肢は、XCodeでそのInfo.plistファイルをダブルクリックし、「非常に役立つ」XCodeエディターを使用することです。この迷惑なエディタでは、実際にはドロップダウンリストにNSBluetoothAlwaysUsageDescriptionがないため、手動で追加する必要があります。超役立つ。とにかく、情報プロパティリストのヘッダーの右側に小さなプラスボタンがあります。それをクリックするだけです。ステップ1では、「プライバシー-Bluetooth周辺機器の使用法の説明」を探します。これは、NSBluetoothPeripheralUsageDescriptionの読み取り可能な名前です。次に、右側の値の部分をクリックして、「アプリがBluetoothを通信目的で使用したい」などのテキストを入力するだけです。それが完了したら、同じ同じプラスボタンをもう一度クリックすると、同じdrpdownリストが表示されます。そのリストは無視して、そこにNSBluetoothAlwaysUsageDescriptionという文字列を貼り付けてください。次に、右側の値をクリックして、「アプリがBluetoothを通信に使用したい」と貼り付けます。
私は.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
、私のアプリは配信が成功したと言われましたが、記載された問題に関して変更を加えたい場合はできます。
私の場合、Bluetooth関連のAPIを使用していませんでしたが、これが原因でアプリがクラッシュしていました。そして、Googleモバイル広告はBluetoothを使用していることがわかりました。ポッドから削除してアプリを再実行することで、これを確認しました。 (モバイル広告を表示するためにBluetoothが必要な理由をGoogleに質問する必要があると思います)
とにかく、今のところplistにNSBluetoothAlwaysUsageDescription
を追加することで、アプリのクラッシュを防ぐことができます。
どうやらAppleはいくつかのポリシーを変更しました。それ以外の場合は、未使用のフラグを要求するのはおかしいです。非常に心配です。これらの理由でアプリも拒否されましたこれなしで実行されています。