Uygulamanız, yakındaki diğer cihazlar tarafından yayınlanan mesajlara abone olmak için kullanılan mekanizmayla aynı mekanizmayı kullanarak Bluetooth Düşük Enerji (BLE) beacon mesajlarına abone olabilir.
Varsayılan olarak, Beacon abonelikleri yalnızca uygulamanız ön plandayken çalışır. Uygulamanız arka plana geçtiğinde abonelikler otomatik olarak işaret taramayı durdurur. Arka plan taramasını etkinleştirme hakkında ayrıntılı bilgi için Arka Plan Taraması bölümüne bakın.
Beacon'lara abone olmak için abonelik parametrelerinde deviceTypesToDiscover
parametresini kGNSDeviceBLEBeacon
olarak ayarlayın. Aşağıdaki snippet'te bu işlemin 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ıyla kaydedilmiş işaretçilerden mesaj almak istiyorsanız abonelik parametrelerinde bir ad alanı iletebilirsiniz. Benzer şekilde, belirli bir ileti türü istiyorsanız filtreleme için ileti türü de iletebilirsiniz. Aşağıdaki snippet'te bu işlemin 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"
})
Varsayılan olarak, işaretçi aboneliği hem Eddystone hem de iBeacon türündeki işaretçileri tarar. iBeacon taraması etkinleştirildiğinde kullanıcılardan, uygulamanın konum verilerini kullanmasına izin vermeleri istenir. Uygulamanızın Info.plist
, 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 beacon'ları taramak istiyorsanız GNSBeaconStrategy
bölümünde iBeacon taramayı devre dışı bırakabilirsiniz. Bu durumda iOS, konumun kullanılması için kullanıcıdan 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üçte tarama etkinleştirilir. Bu durum, bazen Eddystone işaretçileri bulunurken büyük gecikmelere neden olabilir. Düşük güç modu devre dışı bırakıldığında, iBeacon taraması Eddystone işaretçilerinin bulunmasına yardımcı olur. Bu da gecikmeleri azaltabilir. Ancak bu durumda daha fazla pil kullanılır ve iOS, kullanıcıdan konumu kullanmak için izin ister.
Aşağıdaki snippet'te, Eddystone işaretçileri taranı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 taraması yapılırken iOS konum izni iletişim kutusundan önce Yakındaki cihazlar izni iletişim kutusu gösterilir. Bu iletişim kutusunu geçersiz kılmak istiyorsanız (ör. konum izninin neden gerekli olduğunu açıklayan bir "uçuş öncesi" iletişim kutusu sağlamak için) permissionRequestHandler
öğesini abonelik parametrelerinde özel bir blok olarak ayarlayın. Aşağıdaki snippet'te bu işlemin 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
Beacon tarama işlemi BLE kullandığından arka planda çalışabilir. Arka plan modunu kullanmaya karar verirken dikkat etmeniz gereken bazı noktalar şunlardır:
- Arka planda BLE için ek pil maliyeti vardır. Maliyet düşüktür ancak arka plan modunu kullanmaya karar vermeden önce bunu ölçmeniz gerekir.
- iOS, iBeacon taraması etkinse veya düşük güç modu devre dışıysa kullanıcının arka planda konum kullanma iznini ister.
Arka planda beacon taramayı etkinleştirmek için aşağıdaki ek adımları uygulayın:
Düzgün şekilde yapılandırılmış bir
GNSBeaconStrategy
nesnesi ileterek aboneliğiniz için arka plan modunu etkinleştirin. Aşağıdaki snippet'te bu işlemin 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
dosyasına 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üçte tarama yapıyorsanız bunu atlayabilirsiniz.
- Arka planda BLE taraması için
NSLocationAlwaysUsageDescription
Kullanıcının konumunu arka planda neden izleyeceğinizi açıklayan dize. Örneğin, "Arka planda beacon taraması yapmak için konumunuz gerekiyor." 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? Bu durumda, arka plan modu değerini
NSUserDefaults
olarak kaydetmeniz gerekir. iOS, arka planda çalışırken uygulamanızı istediği zaman sonlandırabilir. Uygulamanız şunları yapmalıdır:- Kullanıcı arka plan modu değerini her değiştirdiğinde değeri
NSUserDefaults
konumuna kaydedin. - Başlangıçta
NSUserDefaults
konumundan okuyun ve arka plan modu etkinse Beacon aboneliğini geri yükleyin.
- Kullanıcı arka plan modu değerini her değiştirdiğinde değeri
Arka plan bildirimleri
Uygulamanızın, arka planda çalışırken beacon'lar keşfedildiğinde kullanıcıya bildirim göndermesini istiyorsanız yerel bildirimleri kullanabilirsiniz. Ayrıntılar için Arka plan bildirimleri başlıklı makaleyi inceleyin.