แอปของคุณสามารถสมัครรับข้อมูลข้อความจากบีคอนบลูทูธพลังงานต่ำ (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"
})
โดยค่าเริ่มต้น การสมัครใช้บริการบีคอนจะสแกนบีคอนทั้ง 2 ประเภท ได้แก่ 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
})
})
เมื่อสแกนหา 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 ที่ทำงานในเบื้องหลังจะทำให้แบตเตอรี่หมดเร็วขึ้น ค่าใช้จ่ายต่ำ แต่คุณควรวัดค่าใช้จ่ายก่อนตัดสินใจใช้โหมดเบื้องหลัง
- 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
และกู้คืนการสมัครใช้บริการบีคอน หากเปิดใช้โหมดพื้นหลัง
- บันทึกค่าโหมดเบื้องหลังเป็น
การแจ้งเตือนในเบื้องหลัง
หากต้องการให้แอปแจ้งเตือนผู้ใช้เมื่อตรวจพบบีคอนขณะทำงานในเบื้องหลัง คุณสามารถใช้การแจ้งเตือนในเครื่องได้ โปรดดูรายละเอียดที่การแจ้งเตือนในเบื้องหลัง