| প্ল্যাটফর্ম নির্বাচন করুন: | iOS+ অ্যান্ড্রয়েড ওয়েব ফ্লাটার ইউনিটি C++ |
ডিভাইসের অবস্থার উপর নির্ভর করে আগত বার্তাগুলি ভিন্নভাবে পরিচালনা করা হয়। এই পরিস্থিতিগুলি বুঝতে এবং আপনার নিজের অ্যাপ্লিকেশনে কীভাবে FCM সংহত করবেন তা জানতে, প্রথমে একটি ডিভাইস যে বিভিন্ন অবস্থায় থাকতে পারে তা নির্ধারণ করা গুরুত্বপূর্ণ:
| রাজ্য | বর্ণনা |
|---|---|
| সম্মুখভাগ | যখন অ্যাপ্লিকেশনটি খোলা থাকে, দেখা যায় এবং ব্যবহার করা হয়। |
| পটভূমি | যখন অ্যাপ্লিকেশনটি খোলা থাকে, কিন্তু ব্যাকগ্রাউন্ডে (মিনিমাইজ করা অবস্থায়) থাকে। এটি সাধারণত ঘটে যখন ব্যবহারকারী ডিভাইসের "হোম" বোতাম টিপেছেন, অ্যাপ সুইচার ব্যবহার করে অন্য কোনো অ্যাপে গেছেন, অথবা অ্যাপ্লিকেশনটি অন্য কোনো ট্যাবে (ওয়েব) খুলে রেখেছেন। |
| সমাপ্ত | যখন ডিভাইসটি লক করা থাকে অথবা অ্যাপ্লিকেশনটি চালু থাকে না। |
FCM ব্যবহার করে অ্যাপ্লিকেশনটি মেসেজ পেলোড গ্রহণ করার আগে কয়েকটি পূর্বশর্ত অবশ্যই পূরণ করতে হবে:
- অ্যাপ্লিকেশনটি অবশ্যই অন্তত একবার খুলতে হবে (যাতে FCM-এ নিবন্ধন করা যায়)।
- iOS-এ, ব্যবহারকারী যদি অ্যাপ সুইচার থেকে অ্যাপ্লিকেশনটি সোয়াইপ করে সরিয়ে দেন, তাহলে ব্যাকগ্রাউন্ড মেসেজ পুনরায় চালু করার জন্য সেটিকে ম্যানুয়ালি আবার খুলতে হবে।
- অ্যান্ড্রয়েডে, ব্যবহারকারী যদি ডিভাইস সেটিংস থেকে অ্যাপটি জোর করে বন্ধ করে দেন, তাহলে মেসেজ কাজ করা শুরু করার জন্য এটি ম্যানুয়ালি পুনরায় খুলতে হবে।
- ওয়েবে, আপনাকে অবশ্যই আপনার ওয়েব পুশ সার্টিফিকেট দিয়ে (
getToken()ব্যবহার করে) একটি টোকেনের জন্য অনুরোধ করতে হবে।
বার্তা গ্রহণ করার জন্য অনুমতি অনুরোধ করুন
iOS, macOS, ওয়েব এবং Android 13 (বা নতুন সংস্করণে), আপনার ডিভাইসে FCM পেলোড গ্রহণ করার আগে, আপনাকে অবশ্যই প্রথমে ব্যবহারকারীর অনুমতি নিতে হবে।
firebase_messaging প্যাকেজটি requestPermission মেথড ব্যবহার করে অনুমতি চাওয়ার জন্য একটি এপিআই (API) প্রদান করে। এই এপিআইটি বেশ কিছু নেমড আর্গুমেন্ট গ্রহণ করে, যা আপনি কোন ধরনের অনুমতি চাইতে চান তা নির্ধারণ করে; যেমন, নোটিফিকেশন পেলোডযুক্ত মেসেজিং কোনো শব্দ চালু করতে পারবে কিনা বা সিরি (Siri) ব্যবহার করে মেসেজ পড়ে শোনাতে পারবে কিনা। ডিফল্টরূপে, এই মেথডটি কিছু যৌক্তিক ডিফল্ট অনুমতি চেয়ে থাকে। প্রতিটি অনুমতি কীসের জন্য ব্যবহৃত হয়, সে সম্পর্কে রেফারেন্স এপিআই-তে সম্পূর্ণ ডকুমেন্টেশন দেওয়া আছে।
শুরু করার জন্য, আপনার অ্যাপ্লিকেশন থেকে মেথডটি কল করুন (iOS-এ একটি বিল্ট-ইন মোডাল প্রদর্শিত হবে, ওয়েবে ব্রাউজারের API ফ্লো ট্রিগার হবে):
FirebaseMessaging messaging = FirebaseMessaging.instance;
NotificationSettings settings = await messaging.requestPermission(
alert: true,
announcement: false,
badge: true,
carPlay: false,
criticalAlert: false,
provisional: false,
sound: true,
);
print('User granted permission: ${settings.authorizationStatus}');
অনুরোধ থেকে প্রাপ্ত NotificationSettings অবজেক্টের authorizationStatus প্রপার্টিটি ব্যবহারকারীর সামগ্রিক সিদ্ধান্ত নির্ধারণ করতে ব্যবহার করা যেতে পারে:
-
authorized: ব্যবহারকারী অনুমতি দিয়েছেন। -
denied: ব্যবহারকারী অনুমতি দেননি। -
notDetermined: ব্যবহারকারী এখনও অনুমতি দেবেন কিনা তা নির্বাচন করেননি। -
provisional: ব্যবহারকারী অস্থায়ী অনুমতি দিয়েছেন
NotificationSettings এর অন্যান্য প্রোপার্টিগুলো থেকে জানা যায় যে, বর্তমান ডিভাইসে কোনো নির্দিষ্ট পারমিশন চালু, বন্ধ নাকি অসমর্থিত।
একবার অনুমতি দেওয়া হয়ে গেলে এবং ডিভাইসের বিভিন্ন অবস্থা বোঝা গেলে, আপনার অ্যাপ্লিকেশনটি এখন আগত এফসিএম পেলোডগুলি পরিচালনা করা শুরু করতে পারে।
বার্তা পরিচালনা
আপনার অ্যাপ্লিকেশনের বর্তমান অবস্থার উপর ভিত্তি করে, বিভিন্ন ধরনের মেসেজ টাইপের আগত পেলোডগুলো পরিচালনা করার জন্য ভিন্ন ভিন্ন বাস্তবায়নের প্রয়োজন হয়:
অগ্রভাগের বার্তা
আপনার অ্যাপ্লিকেশনটি ফোরগ্রাউন্ডে থাকা অবস্থায় মেসেজ পরিচালনা করতে, onMessage স্ট্রিমটি শুনুন।
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
print('Got a message whilst in the foreground!');
print('Message data: ${message.data}');
if (message.notification != null) {
print('Message also contained a notification: ${message.notification}');
}
});
স্ট্রিমটিতে একটি RemoteMessage রয়েছে, যা পেলোড সম্পর্কে বিভিন্ন তথ্য বিশদভাবে বর্ণনা করে, যেমন এটি কোথা থেকে এসেছে, অনন্য আইডি, পাঠানোর সময়, এতে কোনো নোটিফিকেশন ছিল কিনা এবং আরও অনেক কিছু। যেহেতু আপনার অ্যাপ্লিকেশনটি ফোরগ্রাউন্ডে থাকা অবস্থায় বার্তাটি গ্রহণ করা হয়েছে, তাই আপনি সরাসরি আপনার ফ্লাটার অ্যাপ্লিকেশনের স্টেট এবং কনটেক্সট অ্যাক্সেস করতে পারবেন।
ফোরগ্রাউন্ড এবং নোটিফিকেশন বার্তা
অ্যাপ্লিকেশনটি ফোরগ্রাউন্ডে থাকা অবস্থায় আসা নোটিফিকেশন মেসেজগুলো ডিফল্টভাবে অ্যান্ড্রয়েড এবং আইওএস উভয় প্ল্যাটফর্মেই কোনো দৃশ্যমান নোটিফিকেশন হিসেবে প্রদর্শিত হয় না। তবে, এই আচরণটি পরিবর্তন করা সম্ভব:
- অ্যান্ড্রয়েডে, আপনাকে অবশ্যই একটি 'উচ্চ অগ্রাধিকার' নোটিফিকেশন চ্যানেল তৈরি করতে হবে।
- iOS-এ, আপনি অ্যাপ্লিকেশনটির উপস্থাপনার বিকল্পগুলো আপডেট করতে পারেন।
পটভূমি বার্তা
অ্যান্ড্রয়েড, অ্যাপল এবং ওয়েব-ভিত্তিক প্ল্যাটফর্মগুলিতে ব্যাকগ্রাউন্ড মেসেজ পরিচালনার প্রক্রিয়া ভিন্ন।
অ্যাপল প্ল্যাটফর্ম এবং অ্যান্ড্রয়েড
একটি onBackgroundMessage হ্যান্ডলার রেজিস্টার করে ব্যাকগ্রাউন্ড মেসেজ পরিচালনা করুন। মেসেজ এলে একটি আইসোলেট তৈরি হয় (শুধুমাত্র অ্যান্ড্রয়েডের জন্য, iOS/macOS-এর জন্য আলাদা আইসোলেটের প্রয়োজন নেই), যার ফলে আপনার অ্যাপ্লিকেশন চালু না থাকলেও আপনি মেসেজ পরিচালনা করতে পারবেন।
আপনার ব্যাকগ্রাউন্ড মেসেজ হ্যান্ডলার সম্পর্কে কয়েকটি বিষয় মনে রাখতে হবে:
- এটি অবশ্যই একটি অ্যানোনিমাস ফাংশন হবে না।
- এটি অবশ্যই একটি শীর্ষ-স্তরের ফাংশন হতে হবে (যেমন, কোনো ক্লাস মেথড নয় যার জন্য প্রারম্ভিকীকরণের প্রয়োজন হয়)।
- ফ্লাটার ভার্সন ৩.৩.০ বা তার উচ্চতর সংস্করণ ব্যবহার করার সময়, ফাংশন ডিক্লারেশনের ঠিক উপরে মেসেজ হ্যান্ডলারকে অবশ্যই
@pragma('vm:entry-point')দিয়ে অ্যানোটেট করতে হবে (অন্যথায় রিলিজ মোডের জন্য ট্রি শেকিংয়ের সময় এটি মুছে যেতে পারে)।
@pragma('vm:entry-point')
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
// If you're going to use other Firebase services in the background, such as Firestore,
// make sure you call `initializeApp` before using other Firebase services.
await Firebase.initializeApp();
print("Handling a background message: ${message.messageId}");
}
void main() {
FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
runApp(MyApp());
}
যেহেতু হ্যান্ডলারটি আপনার অ্যাপ্লিকেশনের কনটেক্সটের বাইরে নিজস্ব একটি আইসোলেটে চলে, তাই অ্যাপ্লিকেশনের স্টেট আপডেট করা বা UI-কে প্রভাবিত করে এমন কোনো লজিক চালানো সম্ভব নয়। তবে, আপনি HTTP রিকোয়েস্ট পাঠানো, IO অপারেশন (যেমন লোকাল স্টোরেজ আপডেট করা), অন্যান্য প্লাগইনের সাথে যোগাযোগ করা ইত্যাদির মতো লজিক সম্পাদন করতে পারবেন।
যত তাড়াতাড়ি সম্ভব আপনার লজিকটি সম্পূর্ণ করার পরামর্শ দেওয়া হচ্ছে। দীর্ঘ ও শ্রমসাধ্য কাজ চালালে ডিভাইসের পারফরম্যান্সে প্রভাব পড়ে এবং এর ফলে অপারেটিং সিস্টেম প্রসেসটি বন্ধ করে দিতে পারে। যদি কোনো কাজ ৩০ সেকেন্ডের বেশি সময় ধরে চলে, তাহলে ডিভাইসটি স্বয়ংক্রিয়ভাবে প্রসেসটি বন্ধ করে দিতে পারে।
ওয়েব
ওয়েবে, ব্যাকগ্রাউন্ডে চলার জন্য একটি জাভাস্ক্রিপ্ট সার্ভিস ওয়ার্কার লিখুন। ব্যাকগ্রাউন্ড মেসেজগুলো পরিচালনা করতে সার্ভিস ওয়ার্কারটি ব্যবহার করুন।
শুরু করার জন্য, আপনার web ডিরেক্টরিতে একটি নতুন ফাইল তৈরি করুন এবং এর নাম দিন firebase-messaging-sw.js :
// See this file for the latest firebase-js-sdk version:
// https://github.com/firebase/flutterfire/blob/main/packages/firebase_core/firebase_core_web/lib/src/firebase_sdk_version.dart
importScripts("https://www.gstatic.com/firebasejs/10.7.0/firebase-app-compat.js");
importScripts("https://www.gstatic.com/firebasejs/10.7.0/firebase-messaging-compat.js");
firebase.initializeApp({
apiKey: "...",
authDomain: "...",
databaseURL: "...",
projectId: "...",
storageBucket: "...",
messagingSenderId: "...",
appId: "...",
});
const messaging = firebase.messaging();
// Optional:
messaging.onBackgroundMessage((message) => {
console.log("onBackgroundMessage", message);
});
ফাইলটিতে অবশ্যই অ্যাপ ও মেসেজিং উভয় SDK ইম্পোর্ট করতে হবে, Firebase ইনিশিয়ালাইজ করতে হবে এবং messaging ভ্যারিয়েবলটি এক্সপোজ করতে হবে।
এরপর, ওয়ার্কারটিকে রেজিস্টার করতে হবে। index.html ফাইলের মধ্যে, Flutter বুটস্ট্র্যাপ করে এমন <script> ট্যাগটি পরিবর্তন করে ওয়ার্কারটিকে রেজিস্টার করুন:
<script src="flutter_bootstrap.js" async>
if ('serviceWorker' in navigator) {
window.addEventListener('load', function () {
navigator.serviceWorker.register('firebase-messaging-sw.js', {
scope: '/firebase-cloud-messaging-push-scope',
});
});
}
</script>
আপনি যদি এখনও পুরানো টেমপ্লেটিং সিস্টেম ব্যবহার করেন, তাহলে ফ্লাটার বুটস্ট্র্যাপকারী <script> ট্যাগটি নিম্নরূপে পরিবর্তন করে ওয়ার্কারটি রেজিস্টার করতে পারেন:
<html>
<body>
<script>
var serviceWorkerVersion = null;
var scriptLoaded = false;
function loadMainDartJs() {
if (scriptLoaded) {
return;
}
scriptLoaded = true;
var scriptTag = document.createElement('script');
scriptTag.src = 'main.dart.js';
scriptTag.type = 'application/javascript';
document.body.append(scriptTag);
}
if ('serviceWorker' in navigator) {
// Service workers are supported. Use them.
window.addEventListener('load', function () {
// Register Firebase Messaging service worker.
navigator.serviceWorker.register('firebase-messaging-sw.js', {
scope: '/firebase-cloud-messaging-push-scope',
});
// Wait for registration to finish before dropping the <script> tag.
// Otherwise, the browser will load the script multiple times,
// potentially different versions.
var serviceWorkerUrl =
'flutter_service_worker.js?v=' + serviceWorkerVersion;
navigator.serviceWorker.register(serviceWorkerUrl).then((reg) => {
function waitForActivation(serviceWorker) {
serviceWorker.addEventListener('statechange', () => {
if (serviceWorker.state == 'activated') {
console.log('Installed new service worker.');
loadMainDartJs();
}
});
}
if (!reg.active && (reg.installing || reg.waiting)) {
// No active web worker and we have installed or are installing
// one for the first time. Simply wait for it to activate.
waitForActivation(reg.installing ?? reg.waiting);
} else if (!reg.active.scriptURL.endsWith(serviceWorkerVersion)) {
// When the app updates the serviceWorkerVersion changes, so we
// need to ask the service worker to update.
console.log('New service worker available.');
reg.update();
waitForActivation(reg.installing);
} else {
// Existing service worker is still good.
console.log('Loading app from service worker.');
loadMainDartJs();
}
});
// If service worker doesn't succeed in a reasonable amount of time,
// fallback to plaint <script> tag.
setTimeout(() => {
if (!scriptLoaded) {
console.warn(
'Failed to load app from service worker. Falling back to plain <script> tag.'
);
loadMainDartJs();
}
}, 4000);
});
} else {
// Service workers not supported. Just drop the <script> tag.
loadMainDartJs();
}
</script>
</body>
এরপর আপনার ফ্লাটার অ্যাপ্লিকেশনটি পুনরায় চালু করুন। ওয়ার্কারটি নিবন্ধিত হবে এবং যেকোনো ব্যাকগ্রাউন্ড মেসেজ এই ফাইলটি ব্যবহার করে পরিচালনা করা হবে।
মিথস্ক্রিয়া পরিচালনা
যেহেতু নোটিফিকেশন একটি দৃশ্যমান সংকেত, তাই ব্যবহারকারীরা প্রায়শই এর সাথে ইন্টারঅ্যাক্ট করেন (চাপ দিয়ে)। অ্যান্ড্রয়েড এবং আইওএস উভয় ক্ষেত্রেই ডিফল্ট আচরণ হলো অ্যাপ্লিকেশনটি খুলে দেওয়া। অ্যাপ্লিকেশনটি বন্ধ করা হলে তা চালু হবে; আর ব্যাকগ্রাউন্ডে থাকলে তা ফোরগ্রাউন্ডে চলে আসবে।
নোটিফিকেশনের বিষয়বস্তুর ওপর নির্ভর করে, অ্যাপ্লিকেশনটি খোলার সময় আপনি ব্যবহারকারীর কার্যকলাপ নিয়ন্ত্রণ করতে চাইতে পারেন। উদাহরণস্বরূপ, যদি একটি নোটিফিকেশনের মাধ্যমে নতুন কোনো চ্যাট বার্তা পাঠানো হয় এবং ব্যবহারকারী সেটিতে চাপ দেন, তাহলে অ্যাপ্লিকেশনটি খোলার সাথে সাথে আপনি নির্দিষ্ট কথোপকথনটি খুলতে চাইতে পারেন।
firebase-messaging প্যাকেজটি এই ইন্টারঅ্যাকশনটি পরিচালনা করার জন্য দুটি উপায় প্রদান করে:
-
getInitialMessage(): অ্যাপ্লিকেশনটি বন্ধ অবস্থা থেকে খোলা হলে, একটিRemoteMessageসম্বলিত একটিFutureরিটার্ন করা হবে। একবার ব্যবহৃত হলে,RemoteMessageটি মুছে ফেলা হবে। -
onMessageOpenedApp: একটিStreamযা অ্যাপ্লিকেশনটি ব্যাকগ্রাউন্ড অবস্থা থেকে খোলার সময় একটিRemoteMessageপোস্ট করে।
আপনার ব্যবহারকারীদের জন্য একটি সাবলীল ইউএক্স (UX) নিশ্চিত করতে উভয় পরিস্থিতিই সামাল দেওয়ার পরামর্শ দেওয়া হয়। নিম্নলিখিত কোড উদাহরণটিতে দেখানো হয়েছে কীভাবে এটি করা যেতে পারে:
class Application extends StatefulWidget {
@override
State<StatefulWidget> createState() => _Application();
}
class _Application extends State<Application> {
// It is assumed that all messages contain a data field with the key 'type'
Future<void> setupInteractedMessage() async {
// Get any messages which caused the application to open from
// a terminated state.
RemoteMessage? initialMessage =
await FirebaseMessaging.instance.getInitialMessage();
// If the message also contains a data property with a "type" of "chat",
// navigate to a chat screen
if (initialMessage != null) {
_handleMessage(initialMessage);
}
// Also handle any interaction when the app is in the background using a
// Stream listener
FirebaseMessaging.onMessageOpenedApp.listen(_handleMessage);
}
void _handleMessage(RemoteMessage message) {
if (message.data['type'] == 'chat') {
Navigator.pushNamed(context, '/chat',
arguments: ChatArguments(message),
);
}
}
@override
void initState() {
super.initState();
// Run code required to handle interacted messages in an async function
// as initState() must not be async
setupInteractedMessage();
}
@override
Widget build(BuildContext context) {
return Text("...");
}
}
আপনি কীভাবে ইন্টারঅ্যাকশন পরিচালনা করবেন তা আপনার অ্যাপ্লিকেশন সেটআপের উপর নির্ভর করে। পূর্ববর্তী উদাহরণটি একটি StatefulWidget ব্যবহার করে এর একটি প্রাথমিক চিত্র তুলে ধরেছে।
বার্তা স্থানীয়করণ করুন
আপনি দুই ভিন্ন উপায়ে স্থানীয় ভাষার স্ট্রিং পাঠাতে পারেন:
- আপনার সার্ভারে প্রত্যেক ব্যবহারকারীর পছন্দের ভাষা সংরক্ষণ করুন এবং প্রতিটি ভাষার জন্য কাস্টমাইজড নোটিফিকেশন পাঠান।
- আপনার অ্যাপে স্থানীয় ভাষার স্ট্রিং যুক্ত করুন এবং অপারেটিং সিস্টেমের অন্তর্নির্মিত লোকেল সেটিংস ব্যবহার করুন।
দ্বিতীয় পদ্ধতিটি যেভাবে ব্যবহার করবেন তা নিচে দেওয়া হলো:
অ্যান্ড্রয়েড
আপনার ডিফল্ট-ভাষার বার্তাগুলি
resources/values/strings.xmlএ নির্দিষ্ট করুন:<string name="notification_title">Hello world</string> <string name="notification_message">This is a message</string>values- languageডিরেক্টরিতে অনূদিত বার্তাগুলি নির্দিষ্ট করুন। উদাহরণস্বরূপ,resources/values-fr/strings.xmlএ ফরাসি বার্তাগুলি নির্দিষ্ট করুন:<string name="notification_title">Bonjour le monde</string> <string name="notification_message">C'est un message</string>সার্ভার পেলোডে,
title,message, এবংbodyকী-গুলোর পরিবর্তে আপনার স্থানীয় বার্তার জন্যtitle_loc_keyএবংbody_loc_keyব্যবহার করুন এবং যে বার্তাটি আপনি প্রদর্শন করতে চান, তারnameঅ্যাট্রিবিউটে এগুলো সেট করুন।মেসেজ পেলোডটি দেখতে এইরকম হবে:
{ "android": { "notification": { "title_loc_key": "notification_title", "body_loc_key": "notification_message" } } }
আইওএস
Base.lproj/Localizable.stringsএ আপনার ডিফল্ট-ভাষার বার্তাগুলি নির্দিষ্ট করুন:"NOTIFICATION_TITLE" = "Hello World"; "NOTIFICATION_MESSAGE" = "This is a message";অনূদিত বার্তাগুলো
language .lprojডিরেক্টরিতে উল্লেখ করুন। উদাহরণস্বরূপ, ফরাসি বার্তাগুলোfr.lproj/Localizable.stringsএ উল্লেখ করুন:"NOTIFICATION_TITLE" = "Bonjour le monde"; "NOTIFICATION_MESSAGE" = "C'est un message";মেসেজ পেলোডটি দেখতে এইরকম হবে:
{ "apns": { "payload": { "alert": { "title-loc-key": "NOTIFICATION_TITLE", "loc-key": "NOTIFICATION_MESSAGE" } } } }
বার্তা বিতরণ ডেটা রপ্তানি সক্ষম করুন
আরও বিশ্লেষণের জন্য আপনি আপনার মেসেজ ডেটা BigQuery-তে এক্সপোর্ট করতে পারেন। BigQuery আপনাকে BigQuery SQL ব্যবহার করে ডেটা বিশ্লেষণ করতে, অন্য কোনো ক্লাউড প্রোভাইডারে এক্সপোর্ট করতে, অথবা আপনার নিজস্ব ML মডেলের জন্য ডেটা ব্যবহার করতে দেয়। BigQuery-তে এক্সপোর্ট করলে মেসেজের জন্য উপলব্ধ সমস্ত ডেটা অন্তর্ভুক্ত থাকে, মেসেজের ধরন বা মেসেজটি API অথবা নোটিফিকেশন কম্পোজার ব্যবহার করে পাঠানো হয়েছে কিনা, তা নির্বিশেষে।
এক্সপোর্টটি চালু করতে, প্রথমে BigQuery ডেটা এক্সপোর্ট ডকুমেন্টের ধাপগুলো অনুসরণ করুন। অ্যাপ ইনস্ট্যান্স লেভেলে প্রোগ্রাম্যাটিকভাবে এটি চালু করলে, আপনি এন্ড-ইউজারদের মেসেজ ডেলিভারি ডেটা বিশ্লেষণ করার জন্য তাদের কাছে অনুমতি চাইতে পারবেন (যা সুপারিশ করা হয়)। প্রোগ্রাম্যাটিকভাবে এক্সপোর্টটি চালু করতে এই নির্দেশাবলী অনুসরণ করুন:
অ্যান্ড্রয়েড
আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেন:
await FirebaseMessaging.instance.setDeliveryMetricsExportToBigQuery(true);
আইওএস
iOS-এর জন্য, আপনাকে AppDelegate.m ফাইলটি নিম্নলিখিত বিষয়বস্তু দিয়ে পরিবর্তন করতে হবে।
#import "AppDelegate.h"
#import "GeneratedPluginRegistrant.h"
#import <Firebase/Firebase.h>
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[GeneratedPluginRegistrant registerWithRegistry:self];
// Override point for customization after application launch.
return [super application:application didFinishLaunchingWithOptions:launchOptions];
}
- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
[[FIRMessaging extensionHelper] exportDeliveryMetricsToBigQueryWithMessageInfo:userInfo];
}
@end
ওয়েব
ওয়েবের জন্য, SDK-এর v9 সংস্করণটি ব্যবহার করতে আপনার সার্ভিস ওয়ার্কার পরিবর্তন করতে হবে। v9 সংস্করণটিকে বান্ডল করতে হয়, তাই সার্ভিস ওয়ার্কারটি চালু করার জন্য আপনাকে esbuild মতো একটি বান্ডলার ব্যবহার করতে হবে। এটি কীভাবে করা যায় তা দেখতে উদাহরণ অ্যাপটি দেখুন।
একবার আপনি v9 SDK-তে স্থানান্তরিত হয়ে গেলে, নিম্নলিখিত কোডটি ব্যবহার করতে পারবেন:
import {
experimentalSetDeliveryMetricsExportedToBigQueryEnabled,
getMessaging,
} from 'firebase/messaging/sw';
...
const messaging = getMessaging(app);
experimentalSetDeliveryMetricsExportedToBigQueryEnabled(messaging, true);
আপনার সার্ভিস ওয়ার্কারের নতুন সংস্করণটি web ফোল্ডারে এক্সপোর্ট করার জন্য yarn build চালাতে ভুলবেন না।
iOS-এর নোটিফিকেশনে ছবি প্রদর্শন করুন
অ্যাপল ডিভাইসগুলিতে, আগত FCM নোটিফিকেশনে FCM পেলোড থেকে ছবি দেখানোর জন্য, আপনাকে অবশ্যই একটি অতিরিক্ত নোটিফিকেশন সার্ভিস এক্সটেনশন যোগ করতে হবে এবং আপনার অ্যাপটিকে এটি ব্যবহার করার জন্য কনফিগার করতে হবে।
আপনি যদি ফায়ারবেস ফোন অথেন্টিকেশন ব্যবহার করেন, তাহলে আপনাকে অবশ্যই আপনার Podfile-এ Firebase Auth pod-টি যোগ করতে হবে।
ধাপ ১ - একটি নোটিফিকেশন সার্ভিস এক্সটেনশন যোগ করুন
- Xcode-এ, File > New > Target... এ ক্লিক করুন।
- একটি মোডাল সম্ভাব্য টার্গেটগুলোর একটি তালিকা প্রদর্শন করবে; স্ক্রল করে অথবা ফিল্টার ব্যবহার করে নোটিফিকেশন সার্ভিস এক্সটেনশন (Notification Service Extension ) নির্বাচন করুন। নেক্সট (Next) ক্লিক করুন।
- একটি পণ্যের নাম যোগ করুন (এই টিউটোরিয়ালটি অনুসরণ করতে 'ImageNotification' ব্যবহার করুন),
SwiftঅথবাObjective-Cনির্বাচন করুন, এবং Finish-এ ক্লিক করুন। - Activate- এ ক্লিক করে স্কিমটি সক্রিয় করুন।
ধাপ ২ - Podfile-এ টার্গেট যোগ করুন
সুইফট
আপনার নতুন এক্সটেনশনটি যাতে FirebaseMessaging সুইফট প্যাকেজটি অ্যাক্সেস করতে পারে, তা নিশ্চিত করতে এটিকে আপনার Runner টার্গেটে যোগ করুন:
নেভিগেটর থেকে, Firebase Apple প্ল্যাটফর্ম SDK যোগ করুন : ফাইল > প্যাকেজ নির্ভরতা যোগ করুন...
অনুসন্ধান করুন অথবা প্যাকেজের URL লিখুন:
none https://github.com/firebase/firebase-ios-sdkপ্রজেক্ট
Runnerযোগ করুন : প্যাকেজ যোগ করুনFirebaseMessaging নির্বাচন করুন এবং টার্গেট ImageNotification-এ যোগ করুন: প্যাকেজ যোগ করুন
উদ্দেশ্য-সি
Podfile-এ আপনার নতুন এক্সটেনশনটি যোগ করে নিশ্চিত করুন যে এটির Firebase/Messaging pod-এ অ্যাক্সেস রয়েছে:
নেভিগেটর থেকে পডফাইলটি খুলুন: Pods > Podfile
ফাইলটির একদম নিচে যান এবং যোগ করুন:
target 'ImageNotification' do use_frameworks! pod 'Firebase/Auth' # Add this line if you are using FirebaseAuth phone authentication pod 'Firebase/Messaging' endiosঅথবাmacosডিরেক্টরি থেকেpod installব্যবহার করে আপনার পডগুলো ইনস্টল বা আপডেট করুন।
ধাপ ৩ - এক্সটেনশন হেল্পারটি ব্যবহার করুন
এই পর্যায়ে, সবকিছু স্বাভাবিকভাবে চলতে থাকার কথা। শেষ ধাপটি হলো এক্সটেনশন হেল্পারটি চালু করা।
সুইফট
নেভিগেটর থেকে আপনার ImageNotification এক্সটেনশনটি নির্বাচন করুন।
NotificationService.swiftফাইলটি খুলুন।NotificationService.swiftফাইলের বিষয়বস্তু নিম্নলিখিত দিয়ে প্রতিস্থাপন করুন:import UserNotifications import FirebaseMessaging class NotificationService: UNNotificationServiceExtension { var contentHandler: ((UNNotificationContent) -> Void)? var bestAttemptContent: UNMutableNotificationContent? override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) { self.contentHandler = contentHandler bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent) Messaging.serviceExtension().populateNotificationContent(bestAttemptContent!, withContentHandler: contentHandler) } override func serviceExtensionTimeWillExpire() { if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent { contentHandler(bestAttemptContent) } } }
উদ্দেশ্য-সি
নেভিগেটর থেকে আপনার ImageNotification এক্সটেনশনটি নির্বাচন করুন।
NotificationService.mফাইলটি খুলুন।ফাইলের একদম উপরে,
NotificationService.hএর ঠিক পরেইFirebaseMessaging.hইম্পোর্ট করুন।NotificationService.mফাইলের বিষয়বস্তু নিম্নলিখিত দিয়ে প্রতিস্থাপন করুন:#import "NotificationService.h" #import "FirebaseMessaging.h" #import <FirebaseAuth/FirebaseAuth-Swift.h> // Add this line if you are using FirebaseAuth phone authentication #import <UIKit/UIKit.h> // Add this line if you are using FirebaseAuth phone authentication @interface NotificationService () <NSURLSessionDelegate> @property(nonatomic) void (^contentHandler)(UNNotificationContent *contentToDeliver); @property(nonatomic) UNMutableNotificationContent *bestAttemptContent; @end @implementation NotificationService /* Uncomment this if you are using Firebase Auth - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options { if ([[FIRAuth auth] canHandleURL:url]) { return YES; } return NO; } - (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts { for (UIOpenURLContext *urlContext in URLContexts) { [FIRAuth.auth canHandleURL:urlContext.URL]; } } */ - (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler { self.contentHandler = contentHandler; self.bestAttemptContent = [request.content mutableCopy]; // Modify the notification content here... [[FIRMessaging extensionHelper] populateNotificationContent:self.bestAttemptContent withContentHandler:contentHandler]; } - (void)serviceExtensionTimeWillExpire { // Called just before the extension will be terminated by the system. // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used. self.contentHandler(self.bestAttemptContent); } @end
ধাপ ৪ - পেলোডে ছবিটি যোগ করুন
আপনার নোটিফিকেশন পেলোডে এখন আপনি একটি ছবি যোগ করতে পারেন। আরও জানতে, কীভাবে একটি সেন্ড রিকোয়েস্ট তৈরি করতে হয় তা দেখুন।