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