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

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

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

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

এই লাইব্রেরিটি 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
      })
    })

ডিবাগ লগিং সক্রিয় করা হচ্ছে

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

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

উদ্দেশ্য-সি

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

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

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

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

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

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

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

    উদ্দেশ্য-সি

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