web-dev-qa-db-fra.com

NSBluetoothAlwaysUsageDescription requise, mais le bluetooth n'est pas utilisé

Dans mon application ios avec le nouveau Xcode 11 GM Seed 2 après le déploiement, Apple a renvoyé une erreur: ITMS-90683: chaîne de fin manquante dans Info.plist avec NSBluetoothAlwaysUsageDescription.

https://developer.Apple.com/documentation/bundleresources/information_property_list/nsbluetoothalwaysusagedescription?language=objc lu.

Le problème est que je n'utilise pas le bluetooth dans mon application. Ou peut-être que je n'en sais rien. Comment puis-je savoir pourquoi ce but d'autorisation est nécessaire?

Je n'utilise pas CoreBluetooth.framework

16
Nik Kov

J'ai eu exactement le même problème aujourd'hui. Quand j'ai fait une recherche grep, j'ai trouvé qu'il y avait une référence à CoreBluetooth.framework dans mon projet.pbxproj

J'ai supprimé la référence et la construction de l'application s'est bien déroulée. Téléchargé sur Apple et il a réussi, donc cela a fonctionné pour moi.

Pour effectuer une recherche, utilisez la commande suivante

grep -r -a CoreBluetooth.framework ProjectFolder
8
Maurice

Ouvrez votre Info.plist et ajoutez un NSBluetoothAlwaysUsageDescription. Vous pouvez le faire dans l'éditeur en ajoutant un élément de campagne comme celui-ci:

Screenshot of info.plist with NSBluetoothAlwaysUsadeDescription as the key and explanation text as the String value

Ou vous pouvez cliquer avec le bouton droit sur Info.plist et Ouvrir en tant que -> Code source et coller les deux lignes appropriées au format 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>
4
Chase Roberts

J'ai pu étouffer les utilisations CoreBluetooth en scannant les utilisations des symboles, en recherchant spécifiquement CBCentralManager. Le script que j'ai écrit pour le faire:

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

Cela va fouiller dans le binaire principal + ses frameworks inclus pour trouver CBCentralManager références. Ex:

./find-bluetooth-usages.sh /path/to/MyApp.app

2
John

Une bibliothèque/framework/pod tiers dans votre application peut utiliser CoreBluetooth. Ajoutez simplement NSBluetoothAlwaysUsageDescription dans votre Info.plist, l'erreur disparaîtra.

2
Deepak

Si votre application a une cible de déploiement antérieure à iOS 13, ajoutez la clé NSBluetoothPeripheralUsageDescription au fichier de liste des propriétés des informations de votre application en plus de la clé NSBluetoothAlwaysUsageDescription car un ou plusieurs tiers dans votre projet utilisent la fonctionnalité Bluetooth.

0
vatsal tanna

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>
0
Shakeel Ahmed

Vous devez ajouter à la fois NSBluetoothPeripheralUsageDescription et NSBluetoothAlwaysUsageDescription à votre fichier Info.plist. Votre fichier Info.plist se trouve (par défaut) dans votre groupe de dossiers de projet "Supporting Files" et peut être appelé quelque chose comme {PROJECTNAME} -Info.plist. Vous avez deux choix pour l'ajouter. Un choix est de simplement éditer le fichier à partir de la ligne de commande en utilisant vim ou autre chose. Ajoutez ensuite ces lignes:

<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>

Le deuxième choix consiste à double-cliquer sur ce fichier Info.plist dans XCode et à utiliser l'éditeur XCode "super utile". Cet éditeur ennuyeux n'a pas réellement la description NSBluetoothAlwaysUsageDescription dans une liste déroulante, vous devez l'ajouter manuellement. Super utile. Quoi qu'il en soit, il y a un petit bouton plus à droite de l'en-tête Liste des propriétés de l'information, cliquez simplement dessus. À l'étape 1, vous recherchez "Confidentialité - Description de l'utilisation du périphérique Bluetooth". Il s'agit du nom lisible de NSBluetoothPeripheralUsageDescription. Ensuite, cliquez simplement sur la partie valeur à droite et entrez votre texte, comme "L'application souhaite utiliser votre bluetooth à des fins de communication" ou watever. Une fois cela fait, cliquez à nouveau sur le même bouton plus et vous obtiendrez la même liste de liste déroulante. Ignorez cette liste et collez-y simplement la chaîne NSBluetoothAlwaysUsageDescription. Cliquez ensuite sur la valeur à droite et collez "L'application souhaite utiliser votre Bluetooth à des fins de communication".

0
Marc

J'ai essayé la réponse de Maurice, avec et sans .framework extension, mais n'a trouvé aucune référence à CoreBluetooth dans mon projet. J'avais aussi auparavant dans Info.plist fichier ajouté: "Privacy - Bluetooth Peripheral Usage Description ", avec une valeur de chaîne:" App would like to use your bluetooth for communication purposes" ". Cela n'a pas fonctionné non plus.
Enfin, après avoir vu la réponse de Chase Roberts, j'ai ajouté: "NSBluetoothAlwaysUsageDescription", avec une valeur de chaîne: "App would like to use your bluetooth for communication purposes ". Après cela, cette erreur ne s'est plus affichée pour mon application lors de la publication.

Remarque: En avertissement d'erreur: ITMS-90683, car mon application a dit que la livraison était réussie, mais je peux le faire si je souhaite apporter des modifications par rapport au problème mentionné.

0
Bane M

Dans mon cas, je n'utilisais aucune API liée à Bluetooth, mais l'application se bloquait à cause de cela. Et j'ai découvert que Google Mobile Ads utilisait le bluetooth. Je m'en suis assuré en le supprimant des pods et en réexécutant l'application. (Je pense que nous devrions tous demander à Google pourquoi ils ont besoin de Bluetooth pour diffuser des annonces mobiles)

Quoi qu'il en soit, vous pouvez empêcher votre application de planter en ajoutant NSBluetoothAlwaysUsageDescription à votre liste pour l'instant.

0
ysnzlcn

Apparemment Apple a fait quelques changements de politique. Sinon, il est nécessaire de demander des drapeaux non utilisés. C'est très préoccupant. J'ai également rejeté mes applications pour ces raisons, tout en étant d'anciennes versions fonctionnent sans cela.

0
jolly