Uygulamanız, yakındaki diğer cihazlar tarafından yayınlanan mesajlara abone olmak için kullanılan mekanizmayı kullanarak Bluetooth Düşük Enerji (BDE) işaretçi mesajlarına abone olabilir.
Varsayılan olarak, işaretçi abonelikleri yalnızca uygulamanız ön plandayken çalışır. Uygulamanız arka plana gittiğinde, abonelikler otomatik olarak işaretçi taramayı durdurur. Arka plan taramasını etkinleştirmeyle ilgili ayrıntılar için Arka Planda Tarama bölümüne bakın.
İşaretçilere abone olmak için abonelik parametrelerinde deviceTypesToDiscover
parametresini kGNSDeviceBLEBeacon
olarak ayarlayın. Aşağıdaki snippet'te bunun nasıl yapılacağı gösterilmektedir:
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
})
Yukarıdaki abonelik yalnızca projenize ait işaretçileri keşfeder ve bu işaretçilerden gelen tüm mesajları alır. Farklı bir ad alanına kayıtlı işaretçilerden mesaj almak istiyorsanız abonelik parametrelerinde bir ad alanı geçirebilirsiniz. Benzer şekilde, belirli bir mesaj türü istiyorsanız filtreleme için bir mesaj türü de iletebilirsiniz. Aşağıdaki snippet'te bunun nasıl yapılacağı gösterilmektedir:
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"
})
İşaretçi aboneliği varsayılan olarak hem Eddystone hem deiBeacon için tarama yapar. iBeacon taraması etkinleştirildiğinde, kullanıcılardan uygulamanın kendi konum verilerini kullanmaları için izin vermeleri istenir. Uygulamanızın Info.plist
özelliği, konumun neden kullanıldığına dair kısa bir açıklamayla birlikte NSLocationWhenInUseUsageDescription
anahtarını içermelidir. Ayrıntılar için Apple'ın belgelerine bakın.
Yalnızca Eddystone işaretçilerini taramak istiyorsanız GNSBeaconStrategy
içinde iBeacon taramasını devre dışı bırakabilirsiniz. Bu durumda iOS, kullanıcıdan konum kullanımı için izin istemez. Aşağıdaki snippet'te yukarıdaki orijinal abonelik için iBeacon taramasının nasıl devre dışı bırakılacağı gösterilmektedir:
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
})
})
Varsayılan olarak düşük güç taraması etkindir ve bu durum, Eddystone işaretçileri bulunurken bazen uzun gecikmelere neden olabilir. Düşük güç modu devre dışı bırakıldığında Eddystone işaretçilerini bulmaya yardımcı olmak için iBeacon taraması kullanılır ve bu gecikmeleri azaltabilir. Ancak bu durum daha fazla pil kullanımına neden olur ve iOS, konum kullanımı için kullanıcıdan izin ister.
Aşağıdaki snippet'te, Eddystone işaretçileri için tarama yapılırken düşük güç modunun nasıl devre dışı bırakılacağı gösterilmektedir.
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
})
})
iBeacon'ları tararken, iOS konum izni iletişim kutusunun önünde Yakındaki izin iletişim kutusu görünür. Bu iletişim kutusunu geçersiz kılmak isterseniz (örneğin, konum izninin neden gerekli olduğunu açıklayan bir "ön kontrol" iletişim kutusu sağlamak için) abonelik parametrelerinde permissionRequestHandler
özelliğini özel blok olarak ayarlayın. Aşağıdaki snippet'te bunun nasıl yapılacağı gösterilmektedir:
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);
}
})
Arka Planda Tarama
İşaretçi taraması BDE kullandığından arka planda çalışabilir. Arka plan modunu kullanmaya karar verirken aklınızda bulundurmanız gereken bazı noktalar şunlardır:
- Arka plan BDE için ek pil maliyeti vardır. Maliyet düşüktür, ancak arka plan modunu kullanmaya karar vermeden önce bunu ölçmelisiniz.
- iOS, iBeacon taraması etkinleştirilirse veya düşük güç modu devre dışı bırakılırsa kullanıcıdan arka planda konum kullanımı için izin ister.
Arka planda işaretçi taramasını etkinleştirmek için aşağıdaki ek adımları uygulayın:
Uygun şekilde yapılandırılmış bir
GNSBeaconStrategy
nesnesi ileterek aboneliğiniz için arka plan modunu etkinleştirin. Aşağıdaki snippet'te bunun nasıl yapılacağı gösterilmektedir: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 }) })
Gerekli girişleri uygulamanızın
Info.plist
bölümüne ekleyin:UIBackgroundModes
giriş:- Arka planda BLE taraması için
bluetooth-central
. - Yüksek güç modunu kullanarak arka planda iBeacon taraması için
location
. Yalnızca Eddystone işaretçileri için düşük güç taraması yapıyorsanız bunu atlayabilirsiniz.
- Arka planda BLE taraması için
Kullanıcının konumunu neden arka planda izleyeceğinizi açıklayan
NSLocationAlwaysUsageDescription
dizesi. Örneğin, "Konumunuzun arka planda işaretçileri taraması gerekir." deyin. Ayrıntılar için Apple'ın belgelerine bakın. Yalnızca Eddystone işaretçileri için düşük güç taraması yapıyorsanız bunu atlayabilirsiniz.
Kullanıcı, uygulamanızda arka plan taramasını etkinleştirebilir veya devre dışı bırakabilir mi? Öyleyse arka plan modu değerini
NSUserDefaults
olarak kaydetmelisiniz. Çünkü iOS arka plandayken uygulamanızı her an sonlandırabilir. Uygulamanız şunları yapmalıdır:- Arka plan modu değerini kullanıcı her değiştirdiğinde
NSUserDefaults
değerine kaydedin. - Başlatma sırasında bunu
NSUserDefaults
tarihinden itibaren okuyun ve arka plan modu etkinse işaretçi aboneliğini geri yükleyin.
- Arka plan modu değerini kullanıcı her değiştirdiğinde
Arka Plan Bildirimleri
Arka planda çalışırken işaretçiler keşfedildiğinde uygulamanızın kullanıcıya bildirimde bulunmasını istiyorsanız yerel bildirimleri kullanabilirsiniz. Ayrıntılar için arka plan bildirimleri konusuna bakın.