প্রকাশ এবং সদস্যতা

নিয়ারবাই মেসেজ এপিআই হলো একটি পাবলিশ-সাবস্ক্রাইব এপিআই যা কাছাকাছি ডিভাইসগুলিকে ছোট ছোট ডেটা পেলোড আদান-প্রদান করতে দেয়। একবার কোনও ডিভাইস কোনও বার্তা প্রকাশ করলে, কাছাকাছি ডিভাইসগুলি বার্তাটি গ্রহণ করতে পারে। ভালো কর্মক্ষমতা বজায় রাখার জন্য বার্তার আকার মোটামুটি ছোট রাখা উচিত। এই পরিষেবাটি ছবি এবং ভিডিওর মতো বড় বস্তু বিনিময়ের জন্য নয়।

কাছাকাছি ডিভাইসের সেটটি ব্লুটুথ এবং কাছাকাছি-আল্ট্রাসনিক (শ্রবণযোগ্য নয়) অডিওর মাধ্যমে ছোট টোকেন বিনিময়ের মাধ্যমে নির্ধারিত হয়। যখন কোনও ডিভাইস কাছাকাছি কোনও ডিভাইস থেকে একটি টোকেন সনাক্ত করে, তখন এটি টোকেনটি যাচাই করার জন্য এবং অ্যাপ্লিকেশনের বর্তমান সাবস্ক্রিপশনের সেটের জন্য কোনও বার্তা সরবরাহ করার জন্য আছে কিনা তা পরীক্ষা করার জন্য নিকটবর্তী বার্তা সার্ভারে পাঠায়।

একটি অ্যাপ্লিকেশন ডিভাইস আবিষ্কারের জন্য ব্যবহৃত মাধ্যমের সেট নিয়ন্ত্রণ করতে পারে, এবং মাধ্যমগুলি টোকেন সম্প্রচার এবং/অথবা টোকেন স্ক্যান করার জন্য ব্যবহৃত হবে কিনা তা নিয়ন্ত্রণ করতে পারে। ডিফল্টরূপে, সমস্ত মাধ্যমে সম্প্রচার এবং স্ক্যানিং করা হয়। একটি উপসেট বা মাধ্যমে আবিষ্কার করতে এবং সম্প্রচার বা স্ক্যান করতে হবে কিনা তা নিয়ন্ত্রণ করতে, প্রকাশনা এবং সাবস্ক্রিপশন তৈরি করার সময় আপনাকে অতিরিক্ত পরামিতিগুলি পাস করতে হবে।

এই লাইব্রেরিটি iOS 7 এবং তার পরবর্তী সংস্করণে চলে এবং iOS 8 SDK দিয়ে তৈরি।

একটি বার্তা ব্যবস্থাপক তৈরি করা হচ্ছে

এই কোডটি একটি মেসেজ ম্যানেজার অবজেক্ট তৈরি করে, যা আপনাকে প্রকাশ এবং সাবস্ক্রাইব করতে দেয়। মেসেজ এক্সচেঞ্জ অপ্রমাণিত, তাই আপনাকে iOS এর জন্য একটি পাবলিক API কী সরবরাহ করতে হবে। আপনি আপনার প্রোজেক্টের জন্য Google Developers Console এন্ট্রি ব্যবহার করে একটি তৈরি করতে পারেন।

অবজেক্টিভ-সি

#import <GNSMessages.h>

GNSMessageManager *messageManager =
    [[GNSMessageManager alloc] initWithAPIKey:@"API_KEY"];

সুইফট

let messageManager = GNSMessageManager(APIKey: "API_KEY")

একটি বার্তা প্রকাশ করা হচ্ছে

এই কোড স্নিপেটটি একটি নাম সম্বলিত বার্তা প্রকাশ করার পদ্ধতি প্রদর্শন করে। প্রকাশনা অবজেক্টটি যতক্ষণ বিদ্যমান থাকবে ততক্ষণ প্রকাশনাটি সক্রিয় থাকবে। প্রকাশনা বন্ধ করতে, প্রকাশনা অবজেক্টটি ছেড়ে দিন।

অবজেক্টিভ-সি

id<GNSPublication> publication =
    [messageManager publicationWithMessage:[GNSMessage messageWithContent:[name dataUsingEncoding:NSUTF8StringEncoding]]];

সুইফট

let publication =
    messageManager.publication(with: GNSMessage(content: name.data(using: .utf8)))

বার্তাগুলিতে সাবস্ক্রাইব করা হচ্ছে

এই কোড স্নিপেটটি পূর্ববর্তী প্রকাশনার স্নিপেট দ্বারা ভাগ করা সমস্ত নামের সাথে সাবস্ক্রাইব করার বিষয়টি প্রদর্শন করে। সাবস্ক্রিপশন অবজেক্টগুলি যতক্ষণ বিদ্যমান থাকে ততক্ষণ সাবস্ক্রিপশন সক্রিয় থাকে। সাবস্ক্রাইব করা বন্ধ করতে, সাবস্ক্রিপশন অবজেক্টটি ছেড়ে দিন।

যখন নিকটবর্তী ডিভাইসগুলি বার্তা প্রকাশ করছে, তখন বার্তা পাওয়া হ্যান্ডলারটি কল করা হয়। যখন কোনও বার্তা আর পর্যবেক্ষণ করা না হয় (ডিভাইসটি রেঞ্জের বাইরে চলে গেছে অথবা বার্তাটি আর প্রকাশ করছে না) তখন বার্তা হারিয়ে যাওয়া হ্যান্ডলারটি কল করা হয়।

অবজেক্টিভ-সি

id<GNSSubscription> subscription =
    [messageManager subscriptionWithMessageFoundHandler:^(GNSMessage *message) {
      // Add the name to a list for display
    }
    messageLostHandler:^(GNSMessage *message) {
      // Remove the name from the list
    }];

সুইফট

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 তে বিজ্ঞাপন দেবেন। উদাহরণস্বরূপ, "কাছাকাছি ডিভাইসগুলি আবিষ্কার করার জন্য ব্লুটুথের মাধ্যমে একটি বেনামী টোকেন বিজ্ঞাপন দেওয়া হয়।"

কিছু ক্ষেত্রে, আপনার অ্যাপটিকে শুধুমাত্র একটি মাধ্যম ব্যবহার করতে হতে পারে, এবং সেই মাধ্যমে সম্প্রচার এবং স্ক্যানিং উভয়ই করার প্রয়োজন নাও হতে পারে।

উদাহরণস্বরূপ, একটি অ্যাপ যা অডিওতে সম্প্রচারিত একটি সেট-টপ বক্সের সাথে সংযোগ করার জন্য ডিজাইন করা হয়েছে, কেবল অডিওতে সম্প্রচারিত হলে এটি আবিষ্কার করার জন্য অডিও স্ক্যান করতে হবে। নিম্নলিখিত স্নিপেটটি দেখায় যে কীভাবে আবিষ্কারের জন্য কেবল অডিও স্ক্যানিং ব্যবহার করে সেই সেট-টপ বক্সে একটি বার্তা প্রকাশ করা যায়:

অবজেক্টিভ-সি

id<GNSPublication> publication = [messageManager publicationWithMessage:message
    paramsBlock:^(GNSPublicationParams *params) {
      params.strategy = [GNSStrategy strategyWithParamsBlock:^(GNSStrategyParams *params) {
        params.discoveryMediums = kGNSDiscoveryMediumsAudio;
        params.discoveryMode = kGNSDiscoveryModeScan;
      }];
    }];

সুইফট

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 ইন্টিগ্রেট করার সময় আপনার সম্মুখীন হতে পারে এমন সমস্যাগুলি ট্র্যাক করার জন্য কার্যকর হতে পারে। প্রযুক্তিগত সহায়তার জন্য আমাদের সাথে যোগাযোগ করলে আমরা এই লগগুলি চাইব।

মেসেজ ম্যানেজার তৈরি করার আগে আপনার এটি সক্রিয় করা উচিত। এই কোড স্নিপেটে ডিবাগ লগিং কীভাবে সক্ষম করবেন তা দেখানো হয়েছে:

অবজেক্টিভ-সি

[GNSMessageManager setDebugLoggingEnabled:YES];

সুইফট

GNSMessageManager.setDebugLoggingEnabled(true)

কাছাকাছি অনুমতির অবস্থা ট্র্যাক করা হচ্ছে

ডিভাইস আবিষ্কার সক্ষম করতে ব্যবহারকারীর সম্মতি প্রয়োজন। এটি Nearby অনুমতি অবস্থা দ্বারা নির্দেশিত। একটি প্রকাশনা বা সাবস্ক্রিপশন তৈরি করার জন্য প্রথম কলে, ব্যবহারকারীকে একটি সম্মতি ডায়ালগ উপস্থাপন করা হয়। ব্যবহারকারী যদি সম্মতি না দেন, তাহলে ডিভাইস আবিষ্কার কাজ করবে না। এই ক্ষেত্রে, আপনার অ্যাপটি ব্যবহারকারীকে ডিভাইস আবিষ্কার অক্ষম করার কথা মনে করিয়ে দেওয়ার জন্য একটি বার্তা দেখাবে। অনুমতি অবস্থা NSUserDefaults এ সংরক্ষিত আছে।

নিচের স্নিপেটটি অনুমতি অবস্থায় সাবস্ক্রাইব করার পদ্ধতি প্রদর্শন করে। অনুমতি অবস্থা পরিবর্তিত হ্যান্ডলারটি যখনই অবস্থা পরিবর্তন হয় তখনই কল করা হয়, এবং ব্যবহারকারী অনুমতি না দেওয়া বা অস্বীকার না করা পর্যন্ত এটি প্রথমবার কল করা হয় না। সাবস্ক্রাইব করা বন্ধ করার জন্য অনুমতি বস্তুটি ছেড়ে দিন।

অবজেক্টিভ-সি

GNSPermission *nearbyPermission = [[GNSPermission alloc] initWithChangedHandler:^(BOOL granted) {
  // Update the UI here
}];

সুইফট

let nearbyPermission = GNSPermission(changedHandler: { (granted: Bool) in
  // Update the UI here
})

আপনার অ্যাপ ব্যবহারকারীকে অনুমতির অবস্থা পরিবর্তন করার একটি উপায় প্রদান করতে পারে; উদাহরণস্বরূপ, সেটিংস পৃষ্ঠায় একটি টগল সুইচ ব্যবহার করে।

অনুমতির অবস্থা কীভাবে পেতে এবং সেট করতে হয় তার একটি উদাহরণ এখানে দেওয়া হল।

অবজেক্টিভ-সি

BOOL permissionState = [GNSPermission isGranted];
[GNSPermission setGranted:!permissionState];  // toggle the state

সুইফট

let permissionState = GNSPermission.isGranted()
GNSPermission.setGranted(!permissionState)  // toggle the state

কাছাকাছি প্রভাবিত করে এমন ব্যবহারকারীর সেটিংস ট্র্যাক করা

যদি ব্যবহারকারী মাইক্রোফোনের অনুমতি অস্বীকার করে থাকেন, ব্লুটুথের অনুমতি অস্বীকার করে থাকেন, অথবা ব্লুটুথ বন্ধ করে থাকেন, তাহলে Nearby ঠিকমতো কাজ করবে না, অথবা একেবারেই কাজ নাও করতে পারে। এই ক্ষেত্রে আপনার অ্যাপটি একটি বার্তা দেখাবে, যা ব্যবহারকারীকে সতর্ক করবে যে Nearby-এর কার্যক্রম বাধাগ্রস্ত হচ্ছে। নিম্নলিখিত স্নিপেটে বার্তা পরিচালক তৈরি করার সময় হ্যান্ডলারগুলি পাস করে এই ব্যবহারকারী সেটিংসের অবস্থা কীভাবে ট্র্যাক করতে হয় তা দেখানো হয়েছে:

অবজেক্টিভ-সি

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
         };
}];

সুইফট

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
      }
    })

কাছাকাছি অনুমতি ডায়ালগ ওভাররাইড করা হচ্ছে

আপনার প্রকাশনা এবং সাবস্ক্রিপশনে আপনি যে প্যারামিটারগুলি পাস করেন তার উপর নির্ভর করে, Nearby-কে কাজ করার অনুমতি দেওয়ার আগে iOS বিভিন্ন অনুমতি চাইতে পারে। উদাহরণস্বরূপ, ডিফল্ট কৌশলটি Near-ultrasonic অডিওতে প্রেরিত ডেটা শোনে, তাই iOS মাইক্রোফোন ব্যবহারের অনুমতি চাইবে। এই ক্ষেত্রে, Nearby একটি "প্রিফ্লাইট" ডায়ালগ দেখাবে যা ব্যাখ্যা করবে কেন ব্যবহারকারীকে অনুমতি দিতে বলা হচ্ছে।

যদি আপনি একটি কাস্টম "প্রিফ্লাইট" ডায়ালগ প্রদান করতে চান, তাহলে প্রকাশনা বা সাবস্ক্রিপশন প্যারামিটারে permissionRequestHandler প্যারামিটারটিকে একটি কাস্টম ব্লকে সেট করুন। ব্যবহারকারীর প্রতিক্রিয়া জানানোর পরে আপনার কাস্টম ব্লকটিকে permissionHandler ব্লককে কল করতে হবে। নিম্নলিখিত স্নিপেটে একটি প্রকাশনার জন্য এটি কীভাবে করবেন তা দেখানো হয়েছে:

অবজেক্টিভ-সি

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.
                                 };
                               }];

সুইফট

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 ব্যবহার করে এমন প্রকাশনা এবং সাবস্ক্রিপশনগুলি ব্যাকগ্রাউন্ডে কাজ করতে পারে। ব্যাকগ্রাউন্ড মোড ব্যবহার করার সিদ্ধান্ত নেওয়ার সময় আপনার কিছু বিষয় সম্পর্কে সচেতন থাকা উচিত:

  • ব্যাকগ্রাউন্ড অপারেশনগুলিতে শুধুমাত্র BLE মাধ্যম ব্যবহার করা উচিত; অডিও সমর্থিত নয়।
  • ব্যাকগ্রাউন্ড BLE এর জন্য অতিরিক্ত ব্যাটারি খরচ আছে। খরচ কম, তবে ব্যাকগ্রাউন্ড মোড ব্যবহার করার সিদ্ধান্ত নেওয়ার আগে আপনার এটি পরিমাপ করা উচিত।
  • iOS ব্যবহারকারীর কাছে ব্যাকগ্রাউন্ডে BLE এর মাধ্যমে বিজ্ঞাপন দেওয়ার অনুমতি চাইবে।

কোনও প্রকাশনা বা সাবস্ক্রিপশনে ব্যাকগ্রাউন্ড মোড যোগ করতে, এই অতিরিক্ত পদক্ষেপগুলি অনুসরণ করুন:

  • আপনার প্রকাশনা বা সাবস্ক্রিপশনে সঠিকভাবে কনফিগার করা GNSStrategy অবজেক্টটি পাস করে ব্যাকগ্রাউন্ড মোড এবং BLE-only সক্ষম করুন। সাবস্ক্রিপশনের জন্য এটি কীভাবে করবেন তা নিম্নলিখিত স্নিপেটে দেখানো হয়েছে:

    অবজেক্টিভ-সি

    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;
          }];
        }];
    

    সুইফট

    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 এন্ট্রি:

      • ব্যাকগ্রাউন্ডে BLE স্ক্যানিংয়ের জন্য bluetooth-central । শুধুমাত্র তখনই প্রয়োজন যখন ডিসকভারি মোডে স্ক্যানিং অন্তর্ভুক্ত থাকে; এটি ডিফল্টরূপে করে।
      • ব্যাকগ্রাউন্ডে BLE বিজ্ঞাপনের জন্য bluetooth-peripheral । শুধুমাত্র তখনই প্রয়োজন যখন আবিষ্কার মোডে সম্প্রচার অন্তর্ভুক্ত থাকে; এটি ডিফল্টরূপে কাজ করে।
    • NSBluetoothPeripheralUsageDescription স্ট্রিংটি বর্ণনা করে যে কেন আপনি BLE তে বিজ্ঞাপন দেবেন। উদাহরণস্বরূপ, "কাছাকাছি ডিভাইসগুলি আবিষ্কার করার জন্য ব্লুটুথের মাধ্যমে একটি বেনামী টোকেন বিজ্ঞাপন দেওয়া হয়।" বিস্তারিত জানার জন্য অ্যাপলের ডকুমেন্টেশন দেখুন।

  • ব্যাকগ্রাউন্ডে থাকাকালীন সিস্টেম যেকোনো সময় আপনার অ্যাপটি বন্ধ করে দিতে পারে। যদি ব্যাকগ্রাউন্ড মোড এমন একটি সেটিং হয় যা ব্যবহারকারী দ্বারা সক্ষম বা অক্ষম করা যেতে পারে, তাহলে আপনার অ্যাপের নিম্নলিখিতগুলি করা উচিত:

    • ব্যবহারকারী যখনই ব্যাকগ্রাউন্ড মোড মান পরিবর্তন করবেন তখনই NSUserDefaults এ সংরক্ষণ করুন।
    • স্টার্টআপে, NSUserDefaults থেকে এটি পড়ুন এবং ব্যাকগ্রাউন্ড মোড সক্রিয় থাকলে কাছাকাছি প্রকাশনা এবং/অথবা সাবস্ক্রিপশন পুনরুদ্ধার করুন।

পটভূমি বিজ্ঞপ্তি

যদি আপনি চান যে আপনার অ্যাপটি ব্যাকগ্রাউন্ডে থাকাকালীন কোনও সাবস্ক্রিপশন কোনও বার্তা পেলে ব্যবহারকারীকে অবহিত করুক, তাহলে আপনি স্থানীয় বিজ্ঞপ্তি ব্যবহার করতে পারেন।

আপনার অ্যাপে এগুলি যোগ করতে এই পদক্ষেপগুলি অনুসরণ করুন:

  • স্টার্টআপে স্থানীয় বিজ্ঞপ্তির জন্য নিবন্ধন করুন:

    অবজেক্টিভ-সি

    if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)]) {
      [[UIApplication sharedApplication] registerUserNotificationSettings:
          [UIUserNotificationSettings settingsForTypes:
              UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound
                                            categories:nil]];
    }
    

    সুইফট

    UIApplication.shared.registerUserNotificationSettings(
        UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil))
    

  • আপনার সাবস্ক্রিপশনের মেসেজ-ফাইন্ড হ্যান্ডলারে একটি স্থানীয় বিজ্ঞপ্তি পাঠান:

    অবজেক্টিভ-সি

    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...
      };
    

    সুইফট

    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...
    }