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

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

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

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