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

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

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

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

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

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

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

উদ্দেশ্য গ

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

ডিবাগ লগিং সক্ষম করা হচ্ছে

ডিবাগ লগিং কনসোলে উল্লেখযোগ্য অভ্যন্তরীণ ইভেন্টগুলি প্রিন্ট করে যা আপনার অ্যাপে কাছাকাছি বার্তাগুলিকে সংহত করার সময় আপনি যে সমস্যার সম্মুখীন হতে পারেন তা ট্র্যাক করার জন্য দরকারী হতে পারে৷ আপনি যদি প্রযুক্তিগত সহায়তার জন্য আমাদের সাথে যোগাযোগ করেন তবে আমরা এই লগগুলির জন্য জিজ্ঞাসা করব৷

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

উদ্দেশ্য গ

[GNSMessageManager setDebugLoggingEnabled:YES];

সুইফট

GNSMessageManager.setDebugLoggingEnabled(true)

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

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

উদ্দেশ্য গ

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

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

আপনার প্রকাশনা এবং সদস্যতাগুলিতে আপনি যে প্যারামিটারগুলি পাস করেন তার উপর নির্ভর করে, কাছাকাছি কাজ করার অনুমতি দেওয়ার আগে iOS বিভিন্ন অনুমতি চাইতে পারে। উদাহরণস্বরূপ, ডিফল্ট কৌশল কাছাকাছি অতিস্বনক অডিওতে প্রেরিত ডেটার জন্য শোনে, তাই 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-কে সক্ষম করুন। নিম্নলিখিত স্নিপেটটি সাবস্ক্রিপশনের জন্য কীভাবে এটি করতে হয় তা দেখায়:

    উদ্দেশ্য গ

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

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

    • ব্যাকগ্রাউন্ড মোড মান 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...
    }