您的應用程式可訂閱藍牙低功耗 (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 信標,可以停用 iBeacon
GNSBeaconStrategy
,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
})
})
掃描 iBeacons 時,系統會先加上 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 有額外的電池成本。費用很低 應該先測量再決定是否使用背景模式。
- 在下列情況下,iOS 會要求使用者允許在背景使用位置資訊: iBeacon 掃描功能已啟用,或低耗電模式已停用。
如要在背景啟用信標掃描功能,請按照下列額外步驟操作:
透過適當的 已設定的
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
中讀取,並還原信標 如果啟用背景模式,則訂閱項目。
- 每當使用者時,將背景模式值儲存至