您的應用程式可以使用與訂閱其他鄰近裝置發布訊息相同的機制,訂閱藍牙低功耗 (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
讀取並還原信標訂閱項目 (如果已啟用背景模式)。
- 每當使用者變更背景模式值時,請將該值儲存至