बीकन मैसेज पाएं

आपका ऐप्लिकेशन, ब्लूटूथ कम ऊर्जा (बीएलई) बीकन मैसेज की सदस्यता ले सकता है. इसके लिए, उसी तरीके का इस्तेमाल किया जाता है जिसका इस्तेमाल आस-पास मौजूद अन्य डिवाइसों से पब्लिश किए गए मैसेज की सदस्यता लेने के लिए किया जाता है.

डिफ़ॉल्ट रूप से, बीकन की सदस्यताएं सिर्फ़ तब काम करती हैं, जब आपका ऐप्लिकेशन फ़ोरग्राउंड में हो. जब आपका ऐप्लिकेशन बैकग्राउंड में चला जाता है, तो सदस्यताएं अपने-आप बीकन स्कैन करना बंद कर देती हैं. बैकग्राउंड स्कैनिंग चालू करने के तरीके के बारे में जानने के लिए, बैकग्राउंड स्कैनिंग लेख पढ़ें.

बीकन की सदस्यता लेने के लिए, सदस्यता के पैरामीटर में 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 बीकन स्कैन करने हैं, तो GNSBeaconStrategy में जाकर iBeacon स्कैनिंग बंद की जा सकती है. इसके बाद, 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);
      }
    })

बैकग्राउंड में स्कैन करने की सुविधा

बीकन स्कैनिंग में बीएलई का इस्तेमाल होता है. इसलिए, यह बैकग्राउंड में काम कर सकता है. बैकग्राउंड मोड का इस्तेमाल करने का फ़ैसला लेते समय, आपको इन बातों का ध्यान रखना चाहिए:

  • बैकग्राउंड में बीएलई का इस्तेमाल करने पर, बैटरी की खपत ज़्यादा होती है. इसकी लागत कम होती है. हालांकि, बैकग्राउंड मोड का इस्तेमाल करने से पहले आपको इसे मेज़र करना चाहिए.
  • अगर iBeacon स्कैनिंग चालू है या लो पावर मोड बंद है, तो iOS उपयोगकर्ता से बैकग्राउंड में जगह की जानकारी ऐक्सेस करने की अनुमति मांगेगा.

बैकग्राउंड में बीकन स्कैन करने की सुविधा चालू करने के लिए, यह तरीका अपनाएं:

  • सही तरीके से कॉन्फ़िगर किए गए 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 के लिए, बैकग्राउंड में बीएलई स्कैनिंग की सुविधा चालू होनी चाहिए.
      • location, हाई-पावर मोड का इस्तेमाल करके बैकग्राउंड में iBeacon स्कैनिंग के लिए. अगर आपको सिर्फ़ Eddystone बीकन के लिए कम पावर वाली स्कैनिंग करनी है, तो इसे शामिल न करें.
    • NSLocationAlwaysUsageDescription स्ट्रिंग में यह जानकारी दी जाती है कि बैकग्राउंड में उपयोगकर्ता की जगह की जानकारी क्यों ट्रैक की जाएगी. उदाहरण के लिए, "बैकग्राउंड में बीकन स्कैन करने के लिए, आपकी जगह की जानकारी की ज़रूरत है." ज़्यादा जानकारी के लिए, Apple का दस्तावेज़ देखें. अगर आपको सिर्फ़ Eddystone बीकन के लिए कम पावर वाली स्कैनिंग करनी है, तो इसे शामिल न करें.

  • क्या उपयोगकर्ता, आपके ऐप्लिकेशन में बैकग्राउंड स्कैनिंग की सुविधा को चालू या बंद कर सकता है? अगर ऐसा है, तो आपको बैकग्राउंड मोड की वैल्यू को NSUserDefaults में सेव करना चाहिए. ऐसा इसलिए, क्योंकि iOS बैकग्राउंड में चल रहे आपके ऐप्लिकेशन को कभी भी बंद कर सकता है. आपके ऐप्लिकेशन को ये काम करने चाहिए:

    • जब भी उपयोगकर्ता बैकग्राउंड मोड की वैल्यू में बदलाव करे, तब उसे NSUserDefaults में सेव करें.
    • स्टार्टअप पर, इसे NSUserDefaults से पढ़ें और अगर बैकग्राउंड मोड चालू है, तो बीकन की सदस्यता वापस पाएं.

बैकग्राउंड में सूचनाएं पाने की सुविधा

अगर आपको बैकग्राउंड में बीकन का पता चलने पर, अपने ऐप्लिकेशन के ज़रिए उपयोगकर्ता को सूचना देनी है, तो लोकल सूचनाएं इस्तेमाल करें. ज़्यादा जानकारी के लिए, बैकग्राउंड में सूचनाएं देखें.