Nearby Messages API, पब्लिश-सब्सक्राइब करने वाला एपीआई है. इसकी मदद से, आस-पास मौजूद डिवाइसों के बीच डेटा के छोटे पेलोड का आदान-प्रदान किया जा सकता है. जब कोई डिवाइस मैसेज पब्लिश करता है, तो आस-पास के डिवाइसों को वह मैसेज मिल सकता है. बेहतर परफ़ॉर्मेंस के लिए, मैसेज का साइज़ छोटा रखें. इस सेवा का इस्तेमाल, फ़ोटो और वीडियो जैसे बड़े ऑब्जेक्ट शेयर करने के लिए नहीं किया जाता.
आस-पास मौजूद डिवाइसों का सेट, ब्लूटूथ और नियर-अल्ट्रासोनिक (सुनाई न देने वाली) ऑडियो पर छोटे टोकन के लेन-देन से तय होता है. जब कोई डिवाइस, आस-पास मौजूद किसी डिवाइस से टोकन का पता लगाता है, तो वह टोकन को Nearby Messages सर्वर पर भेजता है. ऐसा इसलिए किया जाता है, ताकि टोकन की पुष्टि की जा सके. साथ ही, यह पता लगाया जा सके कि ऐप्लिकेशन की मौजूदा सदस्यता के लिए कोई मैसेज डिलीवर करना है या नहीं.
कोई ऐप्लिकेशन, डिवाइस ढूंढने के लिए इस्तेमाल किए जाने वाले मीडियम के सेट को कंट्रोल कर सकता है. साथ ही, यह भी कंट्रोल कर सकता है कि टोकन ब्रॉडकास्ट करने और/या टोकन स्कैन करने के लिए मीडियम का इस्तेमाल किया जाए या नहीं. डिफ़ॉल्ट रूप से, ब्रॉडकास्टिंग और स्कैनिंग सभी मीडियम पर की जाती है. किसी सबसेट या मीडियम पर डिस्कवरी करने के लिए, आपको पब्लिकेशन और सदस्यताएं बनाते समय अतिरिक्त पैरामीटर पास करने होंगे. साथ ही, आपको यह कंट्रोल करने का विकल्प भी मिलेगा कि ब्रॉडकास्ट करना है या स्कैन करना है.
यह लाइब्रेरी iOS 7 और इसके बाद के वर्शन पर काम करती है. साथ ही, इसे iOS 8 SDK के साथ बनाया गया है.
मैसेज मैनेजर बनाना
इस कोड से एक मैसेज मैनेजर ऑब्जेक्ट बनता है. इसकी मदद से, मैसेज पब्लिश और सदस्यता ली जा सकती है. मैसेज एक्सचेंज की पुष्टि नहीं की गई है. इसलिए, आपको iOS के लिए सार्वजनिक एपीआई पासकोड देना होगा. अपने प्रोजेक्ट के लिए, Google Developers Console में जाकर प्रोजेक्ट बनाया जा सकता है.
Objective-C
#import <GNSMessages.h>
GNSMessageManager *messageManager =
[[GNSMessageManager alloc] initWithAPIKey:@"API_KEY"];
Swift
let messageManager = GNSMessageManager(APIKey: "API_KEY")
मैसेज पब्लिश करना
इस कोड स्निपेट में, नाम वाला मैसेज पब्लिश करने का तरीका दिखाया गया है. पब्लिकेशन ऑब्जेक्ट मौजूद रहने तक पब्लिकेशन चालू रहता है. पब्लिश करना बंद करने के लिए, पब्लिकेशन ऑब्जेक्ट को रिलीज़ करें.
Objective-C
id<GNSPublication> publication =
[messageManager publicationWithMessage:[GNSMessage messageWithContent:[name dataUsingEncoding:NSUTF8StringEncoding]]];
Swift
let publication =
messageManager.publication(with: GNSMessage(content: name.data(using: .utf8)))
मैसेज पाने की सुविधा के लिए सदस्यता लेना
इस कोड स्निपेट में, पिछले पब्लिकेशन स्निपेट से शेयर किए गए सभी नामों की सदस्यता लेने का तरीका दिखाया गया है. सदस्यता तब तक चालू रहती है, जब तक सदस्यता के लिए बनाए गए ऑफ़र मौजूद रहते हैं. सदस्यता छोड़ने के लिए, सदस्यता ऑब्जेक्ट को रिलीज़ करें.
आस-पास के डिवाइसों से मैसेज पब्लिश किए जाने पर, message found handler को कॉल किया जाता है. जब कोई मैसेज नहीं दिखता है, तब message lost handler को कॉल किया जाता है. ऐसा तब होता है, जब डिवाइस रेंज से बाहर चला जाता है या मैसेज पब्लिश नहीं कर रहा होता है.
Objective-C
id<GNSSubscription> subscription =
[messageManager subscriptionWithMessageFoundHandler:^(GNSMessage *message) {
// Add the name to a list for display
}
messageLostHandler:^(GNSMessage *message) {
// Remove the name from the list
}];
Swift
let subscription =
messageManager.subscription(messageFoundHandler: { (message: GNSMessage?) in
// Add the name to a list for display
},
messageLostHandler: { (message: GNSMessage?) in
// Remove the name from the list
})
डिस्कवरी मीडियम
डिफ़ॉल्ट रूप से, आस-पास के डिवाइसों का पता लगाने के लिए ऑडियो और ब्लूटूथ, दोनों का इस्तेमाल किया जाएगा. साथ ही, दोनों ब्रॉडकास्ट और स्कैन करेंगे. कुछ मामलों में, आपको अपने ऐप्लिकेशन के Info.plist
में ये एंट्री जोड़नी होंगी:
अगर आपका ऐप्लिकेशन ऑडियो का इस्तेमाल करके स्कैन करता है, तो
NSMicrophoneUsageDescription
जोड़ें. यह एक स्ट्रिंग है, जिसमें यह बताया जाता है कि माइक्रोफ़ोन का इस्तेमाल क्यों किया जाएगा. उदाहरण के लिए, "माइक्रोफ़ोन, आस-पास के डिवाइसों से मिले पहचान छिपाकर भेजे गए टोकन को सुनता है."अगर आपका ऐप्लिकेशन BLE का इस्तेमाल करके ब्रॉडकास्ट करता है, तो
NSBluetoothPeripheralUsageDescription
जोड़ें. यह एक स्ट्रिंग है, जिसमें यह बताया जाता है कि BLE पर विज्ञापन क्यों दिखाए जाएंगे. उदाहरण के लिए, "आस-पास के डिवाइसों का पता लगाने के लिए, ब्लूटूथ के ज़रिए एक गुमनाम टोकन का विज्ञापन दिखाया जाता है."
कुछ मामलों में, आपके ऐप्लिकेशन को सिर्फ़ एक मीडियम का इस्तेमाल करना पड़ सकता है. साथ ही, उसे उस मीडियम पर ब्रॉडकास्टिंग और स्कैनिंग, दोनों करने की ज़रूरत नहीं पड़ सकती.
उदाहरण के लिए, किसी ऐसे ऐप्लिकेशन को सेट-टॉप बॉक्स से कनेक्ट करने के लिए डिज़ाइन किया गया है जो सिर्फ़ ऑडियो ब्रॉडकास्ट करता है. ऐसे में, ऐप्लिकेशन को सेट-टॉप बॉक्स का पता लगाने के लिए, सिर्फ़ ऑडियो को स्कैन करना होगा. यहां दिए गए स्निपेट में, सिर्फ़ ऑडियो स्कैनिंग का इस्तेमाल करके, सेट-टॉप बॉक्स पर मैसेज पब्लिश करने का तरीका बताया गया है:
Objective-C
id<GNSPublication> publication = [messageManager publicationWithMessage:message
paramsBlock:^(GNSPublicationParams *params) {
params.strategy = [GNSStrategy strategyWithParamsBlock:^(GNSStrategyParams *params) {
params.discoveryMediums = kGNSDiscoveryMediumsAudio;
params.discoveryMode = kGNSDiscoveryModeScan;
}];
}];
Swift
let publication = messageManager.publication(with: message,
paramsBlock: { (params: GNSPublicationParams?) in
guard let params = params else { return }
params.strategy = GNSStrategy(paramsBlock: { (params: GNSStrategyParams?) in
guard let params = params else { return }
params.discoveryMediums = .audio
params.discoveryMode = .scan
})
})
डीबग लॉगिंग चालू करना
डीबग लॉगिंग, कंसोल पर अहम इंटरनल इवेंट प्रिंट करती है. इससे, Nearby Messages को अपने ऐप्लिकेशन में इंटिग्रेट करते समय आने वाली समस्याओं को ट्रैक करने में मदद मिलती है. अगर आपको तकनीकी सहायता चाहिए, तो हम आपसे ये लॉग मांगेंगे.
मैसेज मैनेजर बनाने से पहले, आपको इसे चालू करना होगा. इस कोड स्निपेट में, डीबग लॉगिंग चालू करने का तरीका बताया गया है:
Objective-C
[GNSMessageManager setDebugLoggingEnabled:YES];
Swift
GNSMessageManager.setDebugLoggingEnabled(true)
आस-पास मौजूद डिवाइसों से कनेक्ट करने की अनुमति की स्थिति को ट्रैक करना
डिवाइस ढूंढने की सुविधा चालू करने के लिए, उपयोगकर्ता की सहमति ज़रूरी है. इसकी जानकारी, आस-पास के डिवाइसों से कनेक्ट करने की अनुमति की स्थिति से मिलती है. पब्लिकेशन या सदस्यता बनाने के लिए पहली बार कॉल करने पर, उपयोगकर्ता को सहमति वाला डायलॉग दिखता है. अगर उपयोगकर्ता सहमति नहीं देता है, तो डिवाइस ढूंढने की सुविधा काम नहीं करेगी. इस स्थिति में, आपके ऐप्लिकेशन को उपयोगकर्ता को एक मैसेज दिखाना चाहिए. इससे उसे यह याद दिलाया जा सके कि डिवाइस ढूंढने की सुविधा बंद है. अनुमति की स्थिति NSUserDefaults
में सेव की जाती है.
यहां दिए गए स्निपेट में, अनुमति की स्थिति की सदस्यता लेने का तरीका बताया गया है. अनुमति की स्थिति में बदलाव होने पर, अनुमति की स्थिति में बदलाव होने पर हैंडलर को कॉल किया जाता है. साथ ही, जब तक उपयोगकर्ता अनुमति नहीं देता या अनुमति देने से मना नहीं करता, तब तक इसे पहली बार कॉल नहीं किया जाता. सदस्यता रोकने के लिए, अनुमति ऑब्जेक्ट को रिलीज़ करें.
Objective-C
GNSPermission *nearbyPermission = [[GNSPermission alloc] initWithChangedHandler:^(BOOL granted) {
// Update the UI here
}];
Swift
let nearbyPermission = GNSPermission(changedHandler: { (granted: Bool) in
// Update the UI here
})
आपका ऐप्लिकेशन, उपयोगकर्ता को अनुमति की स्थिति बदलने का विकल्प दे सकता है. उदाहरण के लिए, सेटिंग पेज पर टॉगल स्विच का इस्तेमाल करके.
अनुमति की स्थिति पाने और उसे सेट करने के तरीके का उदाहरण यहां दिया गया है.
Objective-C
BOOL permissionState = [GNSPermission isGranted];
[GNSPermission setGranted:!permissionState]; // toggle the state
Swift
let permissionState = GNSPermission.isGranted()
GNSPermission.setGranted(!permissionState) // toggle the state
उपयोगकर्ता की उन सेटिंग को ट्रैक करना जो आस-पास मौजूद डिवाइसों से कनेक्ट करने की सुविधा पर असर डालती हैं
अगर उपयोगकर्ता ने माइक्रोफ़ोन और ब्लूटूथ इस्तेमाल करने की अनुमति नहीं दी है या ब्लूटूथ बंद कर दिया है, तो 'आस-पास' सुविधा ठीक से काम नहीं करेगी. ऐसा भी हो सकता है कि यह सुविधा काम ही न करे. ऐसे मामलों में, आपके ऐप्लिकेशन को एक मैसेज दिखाना चाहिए. इसमें उपयोगकर्ता को यह सूचना दी जानी चाहिए कि आस-पास की सुविधा के काम करने में समस्या आ रही है. नीचे दिए गए स्निपेट में, मैसेज मैनेजर बनाते समय हैंडलर पास करके, उपयोगकर्ता की इन सेटिंग का स्टेटस ट्रैक करने का तरीका बताया गया है:
Objective-C
GNSMessageManager *messageManager = [[GNSMessageManager alloc]
initWithAPIKey:API_KEY
paramsBlock:^(GNSMessageManagerParams *params) {
params.microphonePermissionErrorHandler = ^(BOOL hasError) {
// Update the UI for microphone permission
};
params.bluetoothPowerErrorHandler = ^(BOOL hasError) {
// Update the UI for Bluetooth power
};
params.bluetoothPermissionErrorHandler = ^(BOOL hasError) {
// Update the UI for Bluetooth permission
};
}];
Swift
let messageManager = GNSMessageManager(
APIKey: API_KEY,
paramsBlock: { (params: GNSMessageManagerParams?) in
guard let params = params else { return }
params.microphonePermissionErrorHandler = { (hasError: Bool) in
// Update the UI for microphone permission
}
params.bluetoothPowerErrorHandler = { (hasError: Bool) in
// Update the UI for Bluetooth power
}
params.bluetoothPermissionErrorHandler = { (hasError: Bool) in
// Update the UI for Bluetooth permission
}
})
आस-पास मौजूद डिवाइसों से कनेक्ट करने की अनुमति वाले डायलॉग को खारिज करना
आपने पब्लिकेशन और सदस्यता के लिए जो पैरामीटर पास किए हैं उनके आधार पर, iOS आपसे आस-पास मौजूद डिवाइसों से कनेक्ट करने की सुविधा को चालू करने से पहले, अलग-अलग अनुमतियां मांग सकता है. उदाहरण के लिए, डिफ़ॉल्ट रणनीति, न के बराबर सुनाई देने वाले अल्ट्रासोनिक ऑडियो पर ट्रांसमिट किए गए डेटा को सुनती है. इसलिए, iOS आपसे माइक्रोफ़ोन इस्तेमाल करने की अनुमति मांगेगा. इन मामलों में, Nearby सुविधा एक "प्रीफ़्लाइट" डायलॉग दिखाएगी. इसमें बताया जाएगा कि उपयोगकर्ता से अनुमति क्यों मांगी जा रही है.
अगर आपको कस्टम "प्रीफ़्लाइट" डायलॉग उपलब्ध कराना है, तो पब्लिकेशन या सदस्यता के पैरामीटर में permissionRequestHandler
पैरामीटर को कस्टम ब्लॉक पर सेट करें. उपयोगकर्ता के जवाब देने के बाद, आपके कस्टम ब्लॉक को permissionHandler
ब्लॉक को कॉल करना होगा. यहां दिए गए स्निपेट में, किसी पब्लिकेशन के लिए ऐसा करने का तरीका बताया गया है:
Objective-C
id<GNSPublication> publication =
[messageManager publicationWithMessage:[GNSMessage messageWithContent:[name dataUsingEncoding:NSUTF8StringEncoding]]
paramsBlock:^(GNSPublicationParams *params) {
params.permissionRequestHandler = ^(GNSPermissionHandler permissionHandler) {
// Show your custom dialog here.
// Don't forget to call permissionHandler() with YES or NO when the user dismisses it.
};
}];
Swift
let publication =
messageManager.publication(with: GNSMessage(content: name.data(using: .utf8)),
paramsBlock: { (params: GNSPublicationParams?) in
guard let params = params else { return }
params.permissionRequestHandler = { (permissionHandler: GNSPermissionHandler?) in
// Show your custom dialog here.
// Don't forget to call permissionHandler() with true or false when the user dismisses it.
}
})
बैकग्राउंड में होने वाली कार्रवाई
डिवाइस खोजने के लिए BLE का इस्तेमाल करने वाले पब्लिकेशन और सदस्यताएं, बैकग्राउंड में काम कर सकती हैं. बैकग्राउंड मोड का इस्तेमाल करने का फ़ैसला लेते समय, आपको इन बातों का ध्यान रखना चाहिए:
- बैकग्राउंड में होने वाली कार्रवाइयों के लिए, सिर्फ़ बीएलई का इस्तेमाल किया जाना चाहिए. ऑडियो का इस्तेमाल नहीं किया जा सकता.
- बैकग्राउंड में बीएलई का इस्तेमाल करने पर, बैटरी की खपत ज़्यादा होती है. इसकी लागत कम होती है. हालांकि, बैकग्राउंड मोड का इस्तेमाल करने से पहले आपको इसे मेज़र करना चाहिए.
- iOS, उपयोगकर्ता से बैकग्राउंड में बीएलई के ज़रिए विज्ञापन दिखाने की अनुमति मांगेगा.
किसी पब्लिकेशन या सदस्यता में बैकग्राउंड मोड जोड़ने के लिए, यह तरीका अपनाएं:
अपने पब्लिकेशन या सदस्यता में बैकग्राउंड मोड और सिर्फ़ बीएलई चालू करें. इसके लिए, सही तरीके से कॉन्फ़िगर किया गया
GNSStrategy
ऑब्जेक्ट पास करें. यहां दिए गए स्निपेट में, सदस्यता के लिए ऐसा करने का तरीका बताया गया है:Objective-C
id<GNSSubscription> subscription = [messageManager subscriptionWithMessageFoundHandler:^(GNSMessage *message) { // Add the name to a list for display } messageLostHandler:^(GNSMessage *message) { // Remove the name from the list } paramsBlock:^(GNSSubscriptionParams *params) { params.strategy = [GNSStrategy strategyWithParamsBlock:^(GNSStrategyParams *params) { params.allowInBackground = YES; params.discoveryMediums = kGNSDiscoveryMediumsBLE; }]; }];
Swift
let subscription = messageManager.subscription(messageFoundHandler: { (message: GNSMessage?) in // Add the name to a list for display }, messageLostHandler: { (message: GNSMessage?) in // Remove the name from the list }, paramsBlock:{ (params: GNSSubscriptionParams?) in guard let params = params else { return } params.strategy = GNSStrategy(paramsBlock: { (params: GNSStrategyParams?) in guard let params = params else { return } params.allowInBackground = true params.discoveryMediums = .BLE }) })
अपने ऐप्लिकेशन के
Info.plist
में ये एंट्री जोड़ें:UIBackgroundModes
एंट्री:bluetooth-central
का इस्तेमाल, बैकग्राउंड में बीएलई स्कैन करने के लिए किया जाता है. इसकी ज़रूरत सिर्फ़ तब होती है, जब डिस्कवरी मोड में स्कैनिंग शामिल हो. हालांकि, यह डिफ़ॉल्ट रूप से शामिल होती है.bluetooth-peripheral
का इस्तेमाल, बैकग्राउंड में बीएलई विज्ञापन दिखाने के लिए किया जाता है. इसकी ज़रूरत सिर्फ़ तब होती है, जब डिस्कवरी मोड में ब्रॉडकास्टिंग शामिल हो. हालांकि, यह डिफ़ॉल्ट रूप से शामिल होती है.
NSBluetoothPeripheralUsageDescription
स्ट्रिंग में यह जानकारी दी जाती है कि BLE पर विज्ञापन क्यों दिखाए जाएंगे. उदाहरण के लिए, "आस-पास मौजूद डिवाइसों का पता लगाने के लिए, ब्लूटूथ के ज़रिए पहचान छिपाकर टोकन का विज्ञापन दिखाया जाता है." ज़्यादा जानकारी के लिए, Apple का दस्तावेज़ देखें.
बैकग्राउंड में काम करते समय, सिस्टम आपके ऐप्लिकेशन को किसी भी समय बंद कर सकता है. अगर बैकग्राउंड मोड ऐसी सेटिंग है जिसे उपयोगकर्ता चालू या बंद कर सकता है, तो आपके ऐप्लिकेशन को ये काम करने चाहिए:
- जब भी उपयोगकर्ता बैकग्राउंड मोड की वैल्यू में बदलाव करे, तब उसे
NSUserDefaults
में सेव करें. - स्टार्टअप पर, इसे
NSUserDefaults
से पढ़ें. साथ ही, अगर बैकग्राउंड मोड चालू है, तो आस-पास के पब्लिकेशन और/या सदस्यताएं वापस पाएं.
- जब भी उपयोगकर्ता बैकग्राउंड मोड की वैल्यू में बदलाव करे, तब उसे
बैकग्राउंड में सूचनाएं पाना
अगर आपको बैकग्राउंड में काम करने वाले ऐप्लिकेशन के ज़रिए, सदस्यता से जुड़ा मैसेज मिलने पर उपयोगकर्ता को सूचना देनी है, तो स्थानीय सूचनाएं इस्तेमाल करें.
उन्हें अपने ऐप्लिकेशन में जोड़ने के लिए, यह तरीका अपनाएं:
स्टार्टअप पर लोकल नोटिफ़िकेशन के लिए रजिस्टर करें:
Objective-C
if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)]) { [[UIApplication sharedApplication] registerUserNotificationSettings: [UIUserNotificationSettings settingsForTypes: UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil]]; }
Swift
UIApplication.shared.registerUserNotificationSettings( UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil))
अपनी सदस्यता के message-found हैंडलर में एक स्थानीय सूचना भेजें:
Objective-C
GNSMessageHandler myMessageFoundHandler = ^(GNSMessage *message) { // Send a local notification if not in the foreground. if ([UIApplication sharedApplication].applicationState != UIApplicationStateActive) { UILocalNotification *localNotification = [[UILocalNotification alloc] init]; localNotification.alertBody = @"Message received"; [[UIApplication sharedApplication] presentLocalNotificationNow:localNotification]; } // Process the new message... };
Swift
let myMessageFoundHandler: GNSMessageHandler = { (message: GNSMessage?) in // Send a local notification if not in the foreground. if UIApplication.shared.applicationState != .active { let localNotification = UILocalNotification() localNotification.alertBody = "Message received" UIApplication.shared.presentLocalNotificationNow(localNotification) } // Process the new message... }