Dapatkan Pesan Beacon

Aplikasi Anda dapat berlangganan pesan beacon Bluetooth Hemat Energi (BLE) menggunakan mekanisme yang sama dengan yang digunakan untuk berlangganan pesan yang dipublikasikan oleh perangkat lain di sekitar.

Secara default, langganan beacon hanya berfungsi saat aplikasi Anda berada di latar depan. Saat aplikasi Anda berpindah ke latar belakang, langganan akan otomatis berhenti memindai beacon. Lihat Pemindaian Latar Belakang untuk mengetahui 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 beacon yang terdaftar dengan namespace yang berbeda, Anda dapat meneruskan namespace dalam parameter langganan. Demikian pula, jika Anda menginginkan jenis pesan tertentu, Anda juga dapat meneruskan jenis pesan untuk pemfilteran. Cuplikan berikut menunjukkan cara melakukannya:

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. Jika pemindaian iBeacon diaktifkan, pengguna akan diminta untuk memberikan izin agar aplikasi dapat menggunakan data lokasi mereka. Info.plist aplikasi Anda harus mencakup 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 pemindaian iBeacon di GNSBeaconStrategy, dan iOS tidak akan meminta izin pengguna untuk menggunakan lokasi. Cuplikan berikut menunjukkan cara menonaktifkan pemindaian iBeacon untuk 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 daya rendah diaktifkan, yang terkadang dapat menyebabkan latensi besar saat menemukan beacon Eddystone. Jika mode daya rendah dinonaktifkan, pemindaian iBeacon digunakan untuk membantu menemukan beacon Eddystone, yang dapat mengurangi latensi ini. Namun, hal ini akan menyebabkan penggunaan baterai yang lebih besar, dan iOS akan meminta izin pengguna untuk menggunakan lokasi.

Cuplikan berikut menunjukkan cara menonaktifkan mode hemat daya saat memindai beacon 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 iBeacon, dialog izin lokasi iOS didahului oleh dialog izin Nearby. Jika Anda ingin mengganti dialog ini (misalnya, untuk menyediakan dialog "penerbangan" yang menjelaskan alasan izin lokasi diperlukan), tetapkan permissionRequestHandler ke blok kustom dalam 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

Karena pemindaian beacon menggunakan BLE, pemindaian dapat berjalan di latar belakang. Berikut beberapa hal yang harus Anda ketahui saat memutuskan untuk menggunakan mode latar belakang:

  • Ada biaya baterai tambahan untuk BLE di latar belakang. Biayanya rendah, tetapi Anda harus mengukurnya sebelum memutuskan untuk menggunakan mode latar belakang.
  • iOS akan meminta izin 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 dengan benar. Cuplikan berikut menunjukkan cara melakukannya:

    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 beacon Eddystone saja.
    • String NSLocationAlwaysUsageDescription yang menjelaskan alasan Anda akan melacak lokasi pengguna di latar belakang. Misalnya, "Lokasi Anda diperlukan untuk memindai beacon di latar belakang." Lihat dokumentasi Apple untuk mengetahui detailnya. Anda dapat menghapus opsi ini jika Anda melakukan pemindaian daya rendah hanya untuk beacon Eddystone.

  • Dapatkah pengguna mengaktifkan atau menonaktifkan pemindaian latar belakang di aplikasi Anda? Jika ya, 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 hal berikut:

    • Simpan nilai mode latar belakang ke NSUserDefaults setiap kali pengguna mengubahnya.
    • Saat startup, baca dari NSUserDefaults dan pulihkan langganan beacon jika mode latar belakang diaktifkan.

Notifikasi Latar Belakang

Jika Anda ingin aplikasi memberi tahu pengguna saat beacon ditemukan saat berada di latar belakang, Anda dapat menggunakan notifikasi lokal. Untuk mengetahui detailnya, lihat notifikasi latar belakang.