Nhận tin nhắn báo hiệu

Ứng dụng của bạn có thể đăng ký thông báo báo hiệu qua Bluetooth năng lượng thấp (BLE) sử dụng chính cơ chế được dùng để đăng ký nhận thông báo được đăng bởi các thiết bị lân cận khác.

Theo mặc định, gói thuê bao beacon chỉ hoạt động khi ứng dụng của bạn chạy ở nền trước. Khi ứng dụng của bạn chuyển sang chạy trong nền, các gói thuê bao sẽ tự động dừng quét tìm beacon. Xem bài viết Quét nền để biết thông tin chi tiết về cách bật tính năng quét trong nền.

Để đăng ký beacon, hãy đặt tham số deviceTypesToDiscover thành kGNSDeviceBLEBeacon trong thông số gói thuê bao. Đoạn mã sau minh hoạ cách thực hiện việc này:

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
    })

Gói thuê bao nêu trên chỉ phát hiện các beacon thuộc sở hữu của dự án của bạn và nhận tất cả tin nhắn từ các beacon đó. Nếu bạn muốn nhận tin nhắn từ beacon được đăng ký với một không gian tên khác, bạn có thể chuyển một không gian tên trong thông số gói thuê bao. Tương tự, nếu muốn một loại thông báo cụ thể, bạn cũng có thể chuyển loại thông báo để lọc. Đoạn mã sau đây cho biết cách thực hiện việc này:

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"
    })

Theo mặc định, gói thuê bao beacon sẽ quét tìm cả hai loại beacon, Eddystone và iBeacon. Khi tính năng quét iBeacon được bật, người dùng sẽ được nhắc cung cấp cho phép ứng dụng sử dụng dữ liệu vị trí của họ. Info.plist của ứng dụng phải hãy thêm khoá NSLocationWhenInUseUsageDescription kèm theo nội dung giải thích ngắn về lý do dữ liệu vị trí đang được sử dụng. Xem Tài liệu của Apple để biết thông tin chi tiết.

Nếu chỉ muốn quét tìm beacon Eddystone, bạn có thể tắt iBeacon quét trong GNSBeaconStrategy và iOS sẽ không yêu cầu người dùng cung cấp quyền sử dụng thông tin vị trí. Đoạn mã sau đây cho biết cách tắt iBeacon quét tìm gói thuê bao gốc ở trên:

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
          })
    })

Theo mặc định, tính năng quét pin yếu sẽ được bật và điều này đôi khi có thể dẫn đến độ trễ khi tìm beacon Eddystone. Khi bạn tắt chế độ tiết kiệm pin, Công nghệ quét iBeacon được dùng để giúp tìm ra các beacon Eddystone, nhờ đó có thể giảm thiểu độ trễ. Tuy nhiên, việc này dẫn đến mức sử dụng pin nhiều hơn và iOS sẽ yêu cầu để cấp quyền sử dụng thông tin vị trí.

Đoạn mã sau đây cho biết cách tắt chế độ tiết kiệm pin khi quét tìm Đèn hiệu 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
          })
    })

Khi quét tìm iBeacons, hộp thoại cấp quyền truy cập thông tin vị trí trên iOS đứng sau hộp thoại quyền Lân cận. Nếu bạn muốn ghi đè hộp thoại này (cho chẳng hạn như cung cấp "quy trình kiểm tra" hộp thoại giải thích lý do bạn cần cấp quyền truy cập thông tin vị trí nếu cần), hãy đặt permissionRequestHandler thành một khối tuỳ chỉnh trong thông số gói thuê bao. Đoạn mã sau đây cho biết cách thực hiện việc này:

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);
      }
    })

Quét nền

Vì tính năng quét báo hiệu sử dụng BLE nên có thể hoạt động ở chế độ nền. Sau đây là một số những điều bạn cần lưu ý khi quyết định sử dụng chế độ nền:

  • Sẽ tốn thêm chi phí pin cho BLE ở chế độ nền. Chi phí thấp, nhưng bạn nên đo lường độ chính xác trước khi quyết định sử dụng chế độ nền.
  • iOS sẽ yêu cầu người dùng cấp quyền sử dụng thông tin vị trí trong nền nếu Tính năng quét iBeacon đang bật hoặc chế độ tiết kiệm pin bị tắt.

Để bật tính năng quét báo hiệu ở chế độ nền, hãy làm theo các bước bổ sung sau:

  • Bật chế độ nền cho đăng ký của bạn bằng cách truyền đúng đã định cấu hình đối tượng GNSBeaconStrategy. Đoạn mã sau đây cho biết cách thực hiện sau:

    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
              })
        })
    

  • Thêm các mục bắt buộc vào Info.plist của ứng dụng:

    • UIBackgroundModes mục nhập:

      • bluetooth-central để quét BLE ở chế độ nền.
      • location để quét iBeacon ở chế độ nền ở chế độ công suất cao. Bạn có thể bỏ qua tuỳ chọn này nếu đang quét tìm Eddystone vì pin yếu chỉ báo hiệu.
    • Chuỗi NSLocationAlwaysUsageDescription mô tả lý do bạn sẽ theo dõi vị trí của người dùng trong nền. Ví dụ: "Vị trí của bạn là cần để quét tìm beacon trong nền". Xem Tài liệu của Apple để biết thông tin chi tiết. Bạn có thể bỏ qua tuỳ chọn này nếu đang quét pin yếu cho Chỉ báo hiệu Eddystone.

  • Người dùng có thể bật hoặc tắt tính năng quét nền trong ứng dụng của bạn không? Nếu có, bạn nên lưu giá trị chế độ nền vào NSUserDefaults vì iOS có thể tắt ứng dụng của bạn bất cứ lúc nào trong khi đang chạy trong nền. Ứng dụng của bạn sẽ thực hiện sau:

    • Lưu giá trị của chế độ nền vào NSUserDefaults bất cứ khi nào người dùng thay đổi cuộc trò chuyện đó.
    • Khi khởi động, đọc từ NSUserDefaults và khôi phục beacon nếu bạn bật chế độ nền.

Thông báo trong nền

Nếu bạn muốn ứng dụng của mình thông báo cho người dùng khi phát hiện thấy beacon khi bạn đang ở trong trong nền, bạn có thể dùng thông báo cục bộ. Để biết thông tin chi tiết, hãy xem thông báo trong nền.