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

आपका ऐप उसी तरीके का इस्तेमाल करके ब्लूटूथ कम ऊर्जा (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 बीकन को स्कैन करना है, तो 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
          })
    })

डिफ़ॉल्ट रूप से, कम पावर स्कैनिंग चालू होती है, जिससे कभी-कभी एडीस्टोन बीकन को खोजते समय ज़्यादा इंतज़ार का समय लग सकता है. कम पावर मोड बंद होने पर, 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 की जगह की जानकारी की अनुमति वाले डायलॉग से पहले, 'आस-पास' सुविधा की अनुमति वाला डायलॉग दिखता है. अगर आपको इस डायलॉग बॉक्स को बदलना है (उदाहरण के लिए, ऐसा "प्रीफ़्लाइट" डायलॉग उपलब्ध कराने के लिए, जिसमें यह बताया गया हो कि जगह की जानकारी की अनुमति क्यों चाहिए), तो सदस्यता पैरामीटर में 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 की सुविधा के लिए, बैटरी के अलग से पैसे देने होते हैं. लागत कम है, लेकिन बैकग्राउंड मोड इस्तेमाल करने से पहले आपको इसे मापना चाहिए.
  • अगर 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 एंट्री:

      • बैकग्राउंड में BLE स्कैन करने के लिए bluetooth-central.
      • हाई-पावर मोड का इस्तेमाल करके, बैकग्राउंड में iBeacon को स्कैन करने के लिए location. अगर सिर्फ़ एडीस्टोन बीकन के लिए कम पावर स्कैनिंग की जा रही है, तो आप इसे छोड़ सकते हैं.
    • NSLocationAlwaysUsageDescription स्ट्रिंग में बताया गया है कि बैकग्राउंड में उपयोगकर्ता की जगह की जानकारी को ट्रैक क्यों किया जाएगा. उदाहरण के लिए, "आपकी जगह की जानकारी को बैकग्राउंड में बीकन की पहचान करने के लिए स्कैन करना होगा." ज़्यादा जानकारी के लिए, Apple के दस्तावेज़ देखें. अगर सिर्फ़ Eddystone बीकन के लिए कम पावर स्कैनिंग कर रहे हैं, तो आप इसे छोड़ सकते हैं.

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

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

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

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