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 arrêtent automatiquement de rechercher des balises. Pour savoir comment activer 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:
id<GNSSubscription> beaconSubscription = [messageManager
subscriptionWithMessageFoundHandler:myMessageFoundHandler
messageLostHandler:myMessageLostHandler
paramsBlock:^(GNSSubscriptionParams *params) {
params.deviceTypesToDiscover = kGNSDeviceBLEBeacon;
}];
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 pour le filtrage. L'extrait de code suivant montre comment procéder:
id<GNSSubscription> beaconSubscription = [messageManager
subscriptionWithMessageFoundHandler:myMessageFoundHandler
messageLostHandler:myMessageLostHandler
paramsBlock:^(GNSSubscriptionParams *params) {
params.deviceTypesToDiscover = kGNSDeviceBLEBeacon;
params.messageNamespace = @"com.mycompany.mybeaconservice";
params.type = @"mybeacontype";
}];
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 numérisation 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 position est utilisée. Pour en savoir plus, consultez la documentation Apple.
Si vous souhaitez rechercher uniquement des balises Eddystone, vous pouvez désactiver la recherche iBeacon dans GNSBeaconStrategy
. iOS ne demandera alors pas à l'utilisateur l'autorisation d'utiliser la position. L'extrait de code suivant montre comment désactiver la numérisation iBeacon pour l'abonnement d'origine ci-dessus:
id<GNSSubscription> beaconSubscription = [messageManager
subscriptionWithMessageFoundHandler:myMessageFoundHandler
messageLostHandler:myMessageLostHandler
paramsBlock:^(GNSSubscriptionParams *params) {
params.deviceTypesToDiscover = kGNSDeviceBLEBeacon;
params.beaconStrategy =
[GNSBeaconStrategy strategyWithParamsBlock:^(GNSBeaconStrategyParams *params) {
params.includeIBeacons = NO;
};
}];
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, la numérisation basse consommation est activée, ce qui peut parfois entraîner de longues latences lors de la recherche de balises Eddystone. Lorsque le mode basse consommation est désactivé, la numérisation iBeacon permet de trouver des balises Eddystone, ce qui peut réduire ces latences. Toutefois, cela sollicite davantage la batterie, et iOS demandera à l'utilisateur l'autorisation d'utiliser la position.
L'extrait de code suivant montre comment désactiver le mode basse consommation lors de la recherche de balises Eddystone.
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;
};
}];
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éder à la position iOS est précédée de la boîte de dialogue d'autorisation d'accéder aux appareils à proximité. Si vous souhaitez remplacer cette boîte de dialogue (par exemple, pour fournir une boîte de dialogue de prévol 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:
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);
};
}];
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
Étant donné que la numérisation 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 en arrière-plan:
- La consommation de la batterie est plus importante pour le BLE en arrière-plan. Le coût est faible, mais vous devez le mesurer avant de décider d'utiliser le mode en arrière-plan.
- iOS demandera à l'utilisateur l'autorisation d'utiliser la position en arrière-plan si la recherche iBeacon est activée ou si le mode économie d'énergie est désactivé.
Pour activer la recherche 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:id<GNSSubscription> beaconSubscription = [messageManager subscriptionWithMessageFoundHandler:myMessageFoundHandler messageLostHandler:myMessageLostHandler paramsBlock:^(GNSSubscriptionParams *params) { params.deviceTypesToDiscover = kGNSDeviceBLEBeacon; params.beaconStrategy = [GNSBeaconStrategy strategyWithParamsBlock:^(GNSBeaconStrategyParams *params) { params.allowInBackground = YES; }]; }];
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 la numérisation iBeacon en arrière-plan à l'aide du mode haute puissance. Vous pouvez l'omettre si vous effectuez une analyse basse consommation uniquement pour les balises Eddystone.
Chaîne
NSLocationAlwaysUsageDescription
décrivant pourquoi vous allez suivre la position de l'utilisateur en arrière-plan. Par exemple, "Votre position est nécessaire pour rechercher des balises en arrière-plan." Pour en savoir plus, consultez la documentation Apple. Vous pouvez l'omettre si vous effectuez une analyse basse consommation uniquement pour les balises Eddystone.
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 d'arrière-plan sur
NSUserDefaults
, car iOS peut fermer votre application à tout moment lorsqu'elle est en arrière-plan. Votre application doit effectuer les opérations suivantes:- Enregistrez la valeur du mode arrière-plan sur
NSUserDefaults
chaque fois que l'utilisateur la modifie. - Au démarrage, lisez-le à partir de
NSUserDefaults
et restaurez l'abonnement à la balise si le mode arrière-plan est activé.
- Enregistrez la valeur du mode arrière-plan sur
Notifications en arrière-plan
Si vous souhaitez que votre application avertisse l'utilisateur lorsqu'elle détecte des balises en arrière-plan, vous pouvez utiliser des notifications locales. Pour en savoir plus, consultez la section Notifications en arrière-plan.