Obtenir les messages des balises

Votre application peut s'abonner aux messages de balises Bluetooth à basse consommation (BLE) à l'aide du même mécanisme que celui utilisé pour s'abonner aux messages publiés par d'autres appareils à proximité.

Par défaut, les abonnements aux balises ne fonctionnent que lorsque votre application est exécutée au premier plan. Lorsque votre application passe en arrière-plan, les abonnements s'arrêtent automatiquement à la recherche de balises. Consultez la page Analyse en arrière-plan pour obtenir pour en savoir plus sur l'activation de l'analyse en arrière-plan.

Pour vous abonner aux balises, définissez le paramètre deviceTypesToDiscover sur kGNSDeviceBLEBeacon dans les paramètres d'abonnement. L'extrait suivant montre comment procéder:

Objective-C

id<GNSSubscription> beaconSubscription = [messageManager
    subscriptionWithMessageFoundHandler:myMessageFoundHandler
                     messageLostHandler:myMessageLostHandler
                            paramsBlock:^(GNSSubscriptionParams *params) {
                              params.deviceTypesToDiscover = kGNSDeviceBLEBeacon;
                            }];

Swift

let beaconSubscription = messageManager.subscriptionWithMessageFoundHandler(
    myMessageFoundHandler, messageLostHandler: myMessageLostHandler,
    paramsBlock: { (params: GNSSubscriptionParams!) in
      params.deviceTypesToDiscover = .BLEBeacon
    })

L'abonnement ci-dessus ne découvre que les balises appartenant à votre projet et reçoit tous les messages de ces balises. Si vous souhaitez recevoir des messages de balises enregistrées avec un espace de noms différent, vous pouvez transmettre un espace de noms dans la section paramètres d'abonnement. De même, si vous voulez un type de message spécifique, peuvent également transmettre un type de message pour le filtrage. L'extrait de code suivant montre comment procédez comme suit:

Objective-C

id<GNSSubscription> beaconSubscription = [messageManager
    subscriptionWithMessageFoundHandler:myMessageFoundHandler
                     messageLostHandler:myMessageLostHandler
                            paramsBlock:^(GNSSubscriptionParams *params) {
                              params.deviceTypesToDiscover = kGNSDeviceBLEBeacon;
                              params.messageNamespace = @"com.mycompany.mybeaconservice";
                              params.type = @"mybeacontype";
                            }];

Swift

let beaconSubscription = messageManager.subscriptionWithMessageFoundHandler(
    myMessageFoundHandler, messageLostHandler: myMessageLostHandler,
    paramsBlock: { (params: GNSSubscriptionParams!) in
      params.deviceTypesToDiscover = .BLEBeacon
      params.messageNamespace = "com.mycompany.mybeaconservice"
      params.type = "mybeacontype"
    })

Par défaut, un abonnement aux balises recherche les deux types de balises, Eddystone et iBeacon. Lorsque l'analyse iBeacon est activée, les utilisateurs sont invités à donner l'autorisation d'utiliser ses données de localisation. Info.plist de votre appli doit incluez la clé NSLocationWhenInUseUsageDescription avec une brève explication de pourquoi la localisation est utilisée. Voir Documentation Apple pour en savoir plus.

Si vous ne souhaitez rechercher que les balises Eddystone, vous pouvez désactiver iBeacon analyser dans le GNSBeaconStrategy, et iOS ne demandera pas à l'utilisateur l'autorisation d'utiliser la position. L'extrait de code suivant montre comment désactiver iBeacon recherche de l'abonnement d'origine ci-dessus:

Objective-C

id<GNSSubscription> beaconSubscription = [messageManager
    subscriptionWithMessageFoundHandler:myMessageFoundHandler
                     messageLostHandler:myMessageLostHandler
                            paramsBlock:^(GNSSubscriptionParams *params) {
                              params.deviceTypesToDiscover = kGNSDeviceBLEBeacon;
                              params.beaconStrategy =
                                  [GNSBeaconStrategy strategyWithParamsBlock:^(GNSBeaconStrategyParams *params) {
                                    params.includeIBeacons = NO;
                                  };
                            }];

Swift

let beaconSubscription = messageManager.subscriptionWithMessageFoundHandler(
    myMessageFoundHandler, messageLostHandler: myMessageLostHandler,
    paramsBlock: { (params: GNSSubscriptionParams!) in
      params.deviceTypesToDiscover = .BLEBeacon
      params.beaconStrategy =
          GNSBeaconStrategy(paramsBlock: { (params: GNSBeaconStrategyParams!) in
            params.includeIBeacons = false
          })
    })

Par défaut, l'analyse à faible consommation d'énergie est activée, ce qui peut parfois entraîner de lors de la recherche de balises Eddystone. Lorsque le mode Économie d'énergie est désactivé, L'analyse iBeacon permet de trouver les balises Eddystone, ce qui permet de réduire les latences. Toutefois, cela sollicite davantage la batterie, et iOS demandera l'utilisateur pour obtenir l'autorisation d'utiliser sa position.

L'extrait de code suivant montre comment désactiver le mode Économie d'énergie Des balises Eddystone.

Objective-C

id<GNSSubscription> beaconSubscription = [messageManager
    subscriptionWithMessageFoundHandler:myMessageFoundHandler
                     messageLostHandler:myMessageLostHandler
                            paramsBlock:^(GNSSubscriptionParams *params) {
                              params.deviceTypesToDiscover = kGNSDeviceBLEBeacon;
                              params.beaconStrategy =
                                  [GNSBeaconStrategy strategyWithParamsBlock:^(GNSBeaconStrategyParams *params) {
                                    params.includeIBeacons = NO;
                                    params.lowPowerPreferred = NO;
                                  };
                            }];

Swift

let beaconSubscription = messageManager.subscriptionWithMessageFoundHandler(
    myMessageFoundHandler, messageLostHandler: myMessageLostHandler,
    paramsBlock: { (params: GNSSubscriptionParams!) in
      params.deviceTypesToDiscover = .BLEBeacon
      params.beaconStrategy =
          GNSBeaconStrategy(paramsBlock: { (params: GNSBeaconStrategyParams!) in
            params.includeIBeacons = false
            params.lowPowerPreferred = false
          })
    })

Lors de la recherche d'iBeacons, la boîte de dialogue d'autorisation d'accès à la position sur iOS est précédée de la boîte de dialogue d'autorisation à proximité. Si vous souhaitez remplacer cette boîte de dialogue (par pour fournir une "vérification préliminaire" boîte de dialogue expliquant pourquoi l'autorisation d'accéder à la position est nécessaire), définissez permissionRequestHandler sur un bloc personnalisé dans paramètres d'abonnement. L'extrait de code suivant montre comment procéder:

Objective-C

id<GNSSubscription> beaconSubscription = [messageManager
    subscriptionWithMessageFoundHandler:myMessageFoundHandler
                     messageLostHandler:myMessageLostHandler
                            paramsBlock:^(GNSSubscriptionParams *params) {
                              params.deviceTypesToDiscover = kGNSDeviceBLEBeacon;
                              params.permissionRequestHandler = ^(GNSPermissionHandler permissionHandler) {
                                // Show your custom dialog here, and don't forget to call permissionHandler after it is dismissed
                                permissionHandler(userGavePermission);
                              };
                            }];

Swift

let beaconSubscription = messageManager.subscriptionWithMessageFoundHandler(
    myMessageFoundHandler, messageLostHandler: myMessageLostHandler,
    paramsBlock: { (params: GNSSubscriptionParams!) in
      params.deviceTypesToDiscover = .BLEBeacon
      params.permissionRequestHandler = { (permissionHandler: GNSPermissionHandler!) in
        // Show your custom dialog here, and don't forget to call permissionHandler after it is dismissed
        permissionHandler(userGavePermission);
      }
    })

Recherche en arrière-plan

Comme le scan des balises utilise la technologie BLE, il peut fonctionner en arrière-plan. Voici quelques exemples Points à prendre en compte avant d'utiliser le mode arrière-plan:

  • Des coûts supplémentaires liés à la batterie s'appliquent pour la technologie BLE en arrière-plan. Le coût est faible, mais vous vous devez la mesurer avant de décider d'utiliser le mode arrière-plan.
  • iOS demandera à l'utilisateur l'autorisation d'utiliser les données de localisation en arrière-plan si L'analyse iBeacon est activée ou le mode Économie d'énergie est désactivé.

Pour activer la détection de balises en arrière-plan, procédez comme suit:

  • Activez le mode arrière-plan pour votre abonnement en transmettant un l'objet GNSBeaconStrategy configuré. L'extrait de code suivant montre comment ceci:

    Objective-C

    id<GNSSubscription> beaconSubscription = [messageManager
        subscriptionWithMessageFoundHandler:myMessageFoundHandler
                         messageLostHandler:myMessageLostHandler
                                paramsBlock:^(GNSSubscriptionParams *params) {
                                  params.deviceTypesToDiscover = kGNSDeviceBLEBeacon;
                                  params.beaconStrategy = [GNSBeaconStrategy
                                      strategyWithParamsBlock:^(GNSBeaconStrategyParams *params) {
                                        params.allowInBackground = YES;
                                      }];
                                }];
    

    Swift

    let beaconSubscription = messageManager.subscriptionWithMessageFoundHandler(
        myMessageFoundHandler, messageLostHandler: myMessageLostHandler,
        paramsBlock: { (params: GNSSubscriptionParams!) in
          params.deviceTypesToDiscover = .BLEBeacon
          params.beaconStrategy =
              GNSBeaconStrategy(paramsBlock: { (params: GNSBeaconStrategyParams!) in
                params.allowInBackground = true
              })
        })
    

  • Ajoutez les entrées requises au fichier Info.plist de votre application:

    • UIBackgroundModes entrées:

      • bluetooth-central pour la recherche BLE en arrière-plan.
      • location pour analyser les balises iBeacon en arrière-plan en mode économie d'énergie. Vous pouvez omettre cette option si vous effectuez une recherche à faible consommation d'énergie pour Eddystone uniquement.
    • Chaîne NSLocationAlwaysUsageDescription décrivant la raison pour laquelle vous effectuez le suivi la position de l'utilisateur en arrière-plan. Par exemple, "Votre emplacement est pour rechercher des balises en arrière-plan. » Voir Documentation Apple pour en savoir plus. Vous pouvez l'omettre si vous effectuez une analyse à faible consommation d'énergie Balises Eddystone uniquement.

  • L'utilisateur peut-il activer ou désactiver l'analyse en arrière-plan dans votre application ? Si c'est le cas, vous doit enregistrer la valeur du mode arrière-plan sur NSUserDefaults, car iOS peut tuer votre application à tout moment lorsqu'elle est exécutée en arrière-plan. Votre application doit effectuer les suivantes:

    • Enregistrez la valeur du mode arrière-plan sur NSUserDefaults chaque fois que l'utilisateur le modifie.
    • Au démarrage, lisez-le à partir de NSUserDefaults et restaurez la balise. si le mode arrière-plan est activé.

Notifications en arrière-plan

Si vous souhaitez que votre application informe l'utilisateur lorsque des balises sont détectées dans en arrière-plan, vous pouvez utiliser notifications locales. Pour en savoir plus, consultez notifications en arrière-plan.