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