รับข้อความบีคอน

แอปของคุณสามารถสมัครรับข้อความบีคอนบลูทูธพลังงานต่ำ (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
          })
    })

เมื่อสแกนหา 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 และคืนค่าการสมัครใช้บริการบีคอนหากเปิดใช้โหมดพื้นหลัง

การแจ้งเตือนในเบื้องหลัง

หากต้องการให้แอปแจ้งให้ผู้ใช้ทราบเมื่อระบบพบบีคอนขณะทำงานอยู่เบื้องหลัง คุณใช้การแจ้งเตือนในเครื่องได้ ดูรายละเอียดได้ที่การแจ้งเตือนในเบื้องหลัง