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

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

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

बीकन की सदस्यता लेने के लिए, सदस्यता के पैरामीटर में 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 बीकन ढूंढने में ज़्यादा समय लग सकता है. कम पावर वाले मोड को बंद करने पर, Eddystone बीकन ढूंढने के लिए iBeacon स्कैनिंग का इस्तेमाल किया जाता है. इससे, इन समस्याओं को कम किया जा सकता है. हालांकि, इससे बैटरी ज़्यादा खर्च होती है. साथ ही, 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
          })
    })

iBeacon को स्कैन करते समय, 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);
      }
    })

बैकग्राउंड में स्कैनिंग

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

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

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

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

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

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