Votre application peut s'abonner aux messages de balise 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 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 l'analyse en arrière-plan, 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 provenant de balises enregistrées avec un espace de noms différent, 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 pour le filtrage. 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 aux balises recherche les deux types de balises : Eddystone et iBeacon. Lorsque l'analyse iBeacon est activée, les utilisateurs sont invités à autoriser l'application à utiliser leurs données de localisation. Le fichier Info.plist de votre application doit inclure la clé NSLocationWhenInUseUsageDescription avec une brève explication de la raison pour laquelle la localisation est utilisée. Pour en savoir plus, consultez la documentation
d'Apple.
Si vous ne souhaitez analyser que les balises Eddystone, vous pouvez désactiver l'analyse iBeacon dans GNSBeaconStrategy, et iOS ne demandera pas à l'utilisateur l'autorisation d'utiliser la localisation. L'extrait de code suivant montre comment désactiver l'analyse 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é, l'analyse iBeacon est utilisée pour faciliter la recherche de balises Eddystone, ce qui peut réduire ces latences. Toutefois, cela entraîne une plus grande consommation de la batterie, et iOS demandera à l'utilisateur l'autorisation d'utiliser la localisation.
L'extrait de code suivant montre comment désactiver le mode économie d'énergie lors de l'analyse 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 l'analyse des iBeacons, 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 fournir une boîte de dialogue "prévol" expliquant pourquoi l'autorisation d'accès à 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);
}
})
Analyse en arrière-plan
Comme l'analyse des balises utilise le BLE, elle peut fonctionner en arrière-plan. Voici quelques points à prendre en compte lorsque vous décidez d'utiliser le mode arrière-plan :
- Le BLE en arrière-plan entraîne un coût supplémentaire pour la batterie. 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 la localisation en arrière-plan si l'analyse iBeacon est activée ou si le mode économie d'énergie est désactivé.
Pour activer l'analyse des balises en arrière-plan, procédez comme suit :
Activez le mode arrière-plan pour votre abonnement en transmettant un objet
GNSBeaconStrategycorrectement 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.plistde votre application :Entrées
UIBackgroundModes:bluetooth-centralpour l'analyse BLE en arrière-plan.locationpour l'analyse iBeacon en arrière-plan en mode haute puissance. Vous pouvez omettre cette option si vous effectuez une analyse à faible consommation d'énergie uniquement pour les balises Eddystone.
Chaîne
NSLocationAlwaysUsageDescriptiondécrivant pourquoi vous allez suivre la position de l'utilisateur en arrière-plan. Par exemple, "Votre position est nécessaire pour analyser les balises en arrière-plan." Pour en savoir plus, consultez la documentation d'Apple. Vous pouvez omettre cette option si vous effectuez une analyse à faible consommation d'énergie uniquement pour les balises Eddystone.
L'utilisateur peut-il activer ou désactiver l'analyse en arrière-plan dans votre application ? Si c'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
NSUserDefaultschaque fois que l'utilisateur la modifie. - Au démarrage, lisez-la à partir de
NSUserDefaultset restaurez l'abonnement aux balises si le mode arrière-plan est activé.
- Enregistrez la valeur du mode arrière-plan dans
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 des notifications locales. Pour en savoir plus, consultez Notifications en arrière-plan.