取得信標訊息

應用程式可以使用相同的機制訂閱其他附近裝置發布的訊息,訂閱藍牙低功耗 (BLE) 信標訊息

根據預設,信標訂閱項目只會在應用程式處於前景時運作。應用程式進入背景時,訂閱項目會自動停止掃描訊號塔。如要進一步瞭解如何啟用背景掃描功能,請參閱「背景掃描」。

如要訂閱信標,請在訂閱參數中將 deviceTypesToDiscover 參數設為 kGNSDeviceBLEBeacon。以下程式碼片段說明如何執行這項操作:

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
    })

上述訂閱項目只會偵測專案擁有的訊號發送器,並接收這些訊號發送器的所有訊息。如果您想接收使用不同命名空間註冊的訊號浮標傳送的訊息,可以在訂閱參數中傳遞命名空間。同樣地,如果您想要特定類型的訊息,也可以傳遞訊息類型來篩選。下列程式碼片段說明如何執行這項操作:

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"
    })

根據預設,信標訂閱會掃描 Eddystone 和 iBeacon 這兩種信標。啟用 iBeacon 掃描功能後,系統會提示使用者授予應用程式使用位置資料的權限。應用程式的 Info.plist 必須包含 NSLocationWhenInUseUsageDescription 索引鍵,並簡短說明為何使用位置資訊。詳情請參閱 Apple 說明文件

如果您只想掃描 Eddystone 訊號塔,可以在 GNSBeaconStrategy 中停用 iBeacon 掃描功能,iOS 就不會要求使用者授權使用位置資訊。下列程式碼片段說明如何為上述原始訂閱項目停用 iBeacon 掃描:

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
          })
    })

根據預設,系統會啟用低耗電量掃描功能,這可能會導致在尋找 Eddystone 訊號塔時出現大量延遲。當系統停用省電模式時,系統會使用 iBeacon 掃描功能協助尋找 Eddystone 信標,藉此縮短延遲時間。不過,這會導致電池用量增加,且 iOS 會要求使用者授予位置資訊存取權。

下列程式碼片段說明如何在掃描 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
          })
    })

掃描 iBeacon 時,iOS 位置存取權對話方塊會先顯示鄰近權限對話方塊。如果您想覆寫這個對話方塊 (例如提供「預先飛行」對話方塊,說明為何需要位置權限),請在訂閱參數中將 permissionRequestHandler 設為自訂區塊。下列程式碼片段說明如何執行這項操作:

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);
      }
    })

背景掃描

由於訊號塔掃描會使用 BLE,因此可在背景運作。決定使用背景模式時,請注意以下事項:

  • 背景 BLE 會額外耗用電量。成本不高,但您應先評估成本,再決定是否要使用背景模式。
  • 如果啟用 iBeacon 掃描或停用省電模式,iOS 會要求使用者授權在背景使用位置資訊。

如要啟用背景中的訊號發射器掃描功能,請按照下列額外步驟操作:

  • 傳入正確設定的 GNSBeaconStrategy 物件,即可為訂閱啟用背景模式。下列程式碼片段說明如何執行這項操作:

    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
              })
        })
    

  • 在應用程式的 Info.plist 中新增必要的項目:

    • UIBackgroundModes 個項目:

      • bluetooth-central:用於背景掃描 BLE。
      • location:在背景使用高耗電量模式進行 iBeacon 掃描。如果您只針對 Eddystone 信標進行低耗電量掃描,可以省略這項設定。
    • NSLocationAlwaysUsageDescription 字串,說明您為何要在背景追蹤使用者的所在位置。例如:「需要使用您的位置資訊,才能在背景掃描訊號塔。」詳情請參閱 Apple 說明文件。如果您只針對 Eddystone 訊號塔執行低耗電掃描,可以省略這項設定。

  • 使用者是否能在您的應用程式中啟用或停用背景掃描功能?如果是這樣,您應將背景模式值儲存至 NSUserDefaults,因為 iOS 可以在應用程式處於背景執行時隨時終止應用程式。應用程式應執行下列操作:

    • 使用者變更背景模式時,將背景模式值儲存至 NSUserDefaults
    • 在啟動時,從 NSUserDefaults 讀取,並在啟用背景模式時還原信標訂閱。

背景通知

如果您希望應用程式在背景偵測到訊號時通知使用者,可以使用本機通知。詳情請參閱背景通知