Aplikasi Anda dapat berlangganan pesan beacon Bluetooth Hemat Energi (BLE) menggunakan mekanisme yang sama yang digunakan untuk berlangganan pesan yang diterbitkan oleh perangkat lain di sekitar.
Secara default, langganan beacon hanya berfungsi saat aplikasi berada di latar depan. Saat aplikasi Anda berpindah ke latar belakang, langganan akan otomatis berhenti untuk menemukan beacon. Lihat Pemindaian Latar Belakang untuk detail tentang cara mengaktifkan pemindaian latar belakang.
Untuk berlangganan beacon, tetapkan parameter deviceTypesToDiscover
ke
kGNSDeviceBLEBeacon
dalam parameter langganan. Cuplikan berikut
menunjukkan cara melakukannya:
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
})
Langganan di atas hanya menemukan beacon yang dimiliki oleh project Anda, dan menerima semua pesan dari beacon tersebut. Jika Anda ingin menerima pesan dari suar yang terdaftar dengan namespace berbeda, Anda bisa meneruskan namespace di parameter langganan. Demikian pula, jika ingin jenis pesan tertentu, Anda juga dapat meneruskan jenis pesan untuk pemfilteran. Cuplikan berikut menunjukkan cara lakukan ini:
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"
})
Secara default, langganan beacon memindai kedua jenis beacon, Eddystone, dan
iBeacon. Saat pemindaian iBeacon diaktifkan, pengguna akan diminta untuk memberikan
izin bagi aplikasi untuk
menggunakan data lokasinya. Info.plist
aplikasi Anda harus
menyertakan kunci NSLocationWhenInUseUsageDescription
dengan penjelasan singkat tentang
mengapa lokasi digunakan. Lihat
Dokumentasi Apple
untuk mengetahui detailnya.
Jika Anda hanya ingin memindai beacon Eddystone, Anda dapat menonaktifkan iBeacon
memindai di GNSBeaconStrategy
, dan iOS tidak akan meminta izin
izin akses untuk menggunakan lokasi. Cuplikan berikut menunjukkan cara menonaktifkan iBeacon
memindai langganan asli di atas:
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
})
})
Secara default, pemindaian berdaya rendah diaktifkan, yang terkadang dapat menimbulkan latensi saat menemukan beacon Eddystone. Saat mode daya rendah dinonaktifkan, Pemindaian iBeacon digunakan untuk membantu menemukan beacon Eddystone, yang dapat mengurangi dan latensi rendah. Namun, hal ini mengakibatkan penggunaan baterai yang lebih besar, dan iOS akan meminta izin pengguna untuk menggunakan lokasi.
Cuplikan berikut ini menunjukkan cara menonaktifkan mode daya rendah saat memindai Suar 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
})
})
Saat memindai iBeacons, dialog izin akses lokasi iOS didahului oleh
dialog Izin akses terdekat. Jika Anda ingin mengganti dialog ini (untuk
untuk menyediakan "preflight" dialog yang menjelaskan alasan izin akses lokasi
diperlukan), tetapkan permissionRequestHandler
ke blok kustom di
parameter langganan. Cuplikan berikut menunjukkan cara melakukannya:
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);
}
})
Pemindaian Latar Belakang
Pemindaian beacon menggunakan BLE dapat berfungsi di latar belakang. Berikut beberapa hal yang harus Anda ketahui saat memutuskan untuk menggunakan mode latar belakang:
- Ada biaya tambahan untuk BLE latar belakang. Biayanya rendah, tetapi Anda sebaiknya Anda mengukurnya sebelum memutuskan untuk menggunakan mode latar belakang.
- iOS akan meminta izin kepada pengguna untuk menggunakan lokasi di latar belakang jika Pemindaian iBeacon diaktifkan atau mode daya rendah dinonaktifkan.
Untuk mengaktifkan pemindaian beacon di latar belakang, ikuti langkah-langkah tambahan berikut:
Aktifkan mode latar belakang untuk langganan Anda dengan meneruskan objek
GNSBeaconStrategy
yang dikonfigurasi. Cuplikan berikut menunjukkan cara melakukan ini: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 }) })
Tambahkan entri yang diperlukan ke
Info.plist
aplikasi Anda:UIBackgroundModes
entri:bluetooth-central
untuk pemindaian BLE di latar belakang.location
untuk pemindaian iBeacon di latar belakang menggunakan mode daya tinggi. Anda dapat menghilangkannya jika Anda melakukan pemindaian daya rendah untuk Eddystone dan hanya beacon.
String
NSLocationAlwaysUsageDescription
yang menjelaskan alasan Anda akan melacak lokasi pengguna di latar belakang. Misalnya, "Lokasi Anda adalah yang diperlukan untuk memindai beacon di latar belakang." Lihat Dokumentasi Apple untuk mengetahui detailnya. Anda dapat menghilangkannya jika Anda melakukan pemindaian daya rendah untuk Hanya beacon Eddystone.
Dapatkah pengguna mengaktifkan atau menonaktifkan pemindaian latar belakang di aplikasi Anda? Jika demikian, Anda harus menyimpan nilai mode latar belakang ke
NSUserDefaults
karena iOS dapat menghentikan aplikasi Anda kapan saja saat berada di latar belakang. Aplikasi Anda harus melakukan berikut ini:- Simpan nilai mode latar belakang ke
NSUserDefaults
setiap kali pengguna mengubahnya. - Saat memulai, membacanya dari
NSUserDefaults
dan pulihkan beacon langganan jika mode latar belakang diaktifkan.
- Simpan nilai mode latar belakang ke
Notifikasi Latar Belakang
Jika Anda ingin aplikasi memberi tahu pengguna saat beacon ditemukan saat berada latar belakang, Anda dapat menggunakan notifikasi lokal. Untuk mengetahui detailnya, lihat notifikasi latar belakang.