Obtenir les messages des balises

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

Par défaut, les abonnements à des balises ne fonctionnent que lorsque votre application est exécutée au premier plan. Lorsque votre application passe en arrière-plan, les abonnements cessent automatiquement de rechercher des balises. Pour en savoir plus sur l'activation de cette fonctionnalité, consultez la section 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 de code 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étecte 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 autre espace de noms, vous pouvez transmettre un espace de noms dans les paramètres d'abonnement. De même, si vous souhaitez un type de message spécifique, vous pouvez également transmettre un type de message à filtrer. 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.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 à une balise recherche les deux types de balises : Eddystone et iBeacon. Lorsque la recherche iBeacon est activée, les utilisateurs sont invités à autoriser l'application à utiliser leurs données de localisation. Le Info.plist de votre application doit inclure la clé NSLocationWhenInUseUsageDescription avec une brève explication des raisons pour lesquelles la localisation est utilisée. Pour en savoir plus, consultez la documentation d'Apple.

Si vous souhaitez rechercher uniquement les balises Eddystone, vous pouvez désactiver la recherche iBeacon dans GNSBeaconStrategy. iOS ne demandera pas à l'utilisateur l'autorisation d'utiliser la position. L'extrait suivant montre comment désactiver la recherche iBeacon pour 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 des latences importantes lors de la recherche de balises Eddystone. Lorsque le mode économie d'énergie est désactivé, la recherche iBeacon est utilisée pour vous aider à trouver les balises Eddystone, ce qui peut réduire ces latences. Cependant, l'utilisation de la batterie est plus importante, et iOS demande à l'utilisateur l'autorisation d'utiliser la localisation.

L'extrait de code suivant montre comment désactiver le mode économie d'énergie lors de la recherche de 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 de balises iBeacon, la boîte de dialogue d'autorisation d'accéder à la position 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 exemple, pour afficher une boîte de dialogue de "vérification préliminaire" expliquant pourquoi l'autorisation d'accéder à la position est nécessaire), définissez permissionRequestHandler sur un bloc personnalisé dans les 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 la recherche de balises utilise la technologie BLE, elle peut fonctionner en arrière-plan. Voici quelques points à prendre en compte avant d'utiliser le mode arrière-plan:

  • Des frais supplémentaires s'appliquent à la batterie pour la technologie BLE en arrière-plan. Le coût est faible, mais vous devez le 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 la recherche 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 objet GNSBeaconStrategy correctement configuré. 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.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 l'analyse BLE en arrière-plan.
      • location pour la recherche iBeacon en arrière-plan avec le mode haute puissance. Vous pouvez l'omettre si vous effectuez une analyse à faible consommation des balises Eddystone uniquement.
    • Chaîne NSLocationAlwaysUsageDescription décrivant la raison pour laquelle vous suivez la position de l'utilisateur en arrière-plan. Par exemple, "Votre position est nécessaire pour rechercher les balises en arrière-plan". Pour en savoir plus, consultez la documentation d'Apple. Vous pouvez l'omettre si vous effectuez une analyse à faible consommation des balises Eddystone uniquement.

  • L'utilisateur peut-il activer ou désactiver l'analyse en arrière-plan dans votre application ? Si tel est le cas, vous devez enregistrer la valeur du mode arrière-plan dans NSUserDefaults, car iOS peut fermer votre application à tout moment lorsqu'elle est en arrière-plan. Votre application doit procéder comme suit:

    • Enregistrez la valeur du mode arrière-plan dans NSUserDefaults chaque fois que l'utilisateur la modifie.
    • Au démarrage, lisez-le à partir de NSUserDefaults et restaurez l'abonnement de 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 en arrière-plan, vous pouvez utiliser les notifications locales. Pour en savoir plus, consultez la section Notifications en arrière-plan.