এই নির্দেশিকাটি বর্ণনা করে কিভাবে আপনার মোবাইল এবং ওয়েব ক্লায়েন্ট অ্যাপগুলিতে Firebase Cloud Messaging সেট আপ করবেন যাতে আপনি নির্ভরযোগ্যভাবে বার্তা গ্রহণ করতে পারেন।
একটি Flutter অ্যাপে বার্তা গ্রহণ করুন
একটি ডিভাইসের অবস্থার উপর নির্ভর করে, আগত বার্তাগুলি ভিন্নভাবে পরিচালনা করা হয়। এই পরিস্থিতিগুলি বুঝতে এবং আপনার নিজস্ব অ্যাপ্লিকেশনে FCM কীভাবে সংহত করবেন তা বুঝতে, প্রথমে একটি ডিভাইস কোন বিভিন্ন অবস্থায় থাকতে পারে তা নির্ধারণ করা গুরুত্বপূর্ণ:
রাজ্য | বিবরণ |
---|---|
অগ্রভাগ | যখন অ্যাপ্লিকেশনটি খোলা থাকে, তখন দৃশ্যমান এবং ব্যবহারযোগ্য। |
পটভূমি | যখন অ্যাপ্লিকেশনটি খোলা থাকে, কিন্তু ব্যাকগ্রাউন্ডে (কম করা) থাকে। এটি সাধারণত তখন ঘটে যখন ব্যবহারকারী ডিভাইসে "হোম" বোতাম টিপে থাকেন, অ্যাপ সুইচার ব্যবহার করে অন্য অ্যাপে স্যুইচ করেন, অথবা অ্যাপ্লিকেশনটি অন্য ট্যাবে (ওয়েব) খোলা থাকে। |
সমাপ্ত | যখন ডিভাইসটি লক থাকে অথবা অ্যাপ্লিকেশনটি চালু না থাকে। |
FCM ব্যবহার করে অ্যাপ্লিকেশনটি বার্তা পেলোড গ্রহণ করার আগে কয়েকটি পূর্বশর্ত পূরণ করতে হবে:
- আবেদনপত্রটি কমপক্ষে একবার খোলা থাকতে হবে (FCM-এ নিবন্ধনের অনুমতি দেওয়ার জন্য)।
- iOS-এ, যদি ব্যবহারকারী অ্যাপ সুইচার থেকে অ্যাপ্লিকেশনটি সোয়াইপ করে সরিয়ে ফেলেন, তাহলে ব্যাকগ্রাউন্ড মেসেজগুলি আবার কাজ শুরু করার জন্য এটি ম্যানুয়ালি পুনরায় খুলতে হবে।
- অ্যান্ড্রয়েডে, যদি ব্যবহারকারী ডিভাইস সেটিংস থেকে অ্যাপটি জোর করে বন্ধ করে দেয়, তাহলে বার্তাগুলি কাজ শুরু করার জন্য এটি ম্যানুয়ালি পুনরায় খুলতে হবে।
- ওয়েবে, আপনার ওয়েব পুশ সার্টিফিকেটের সাথে অবশ্যই একটি টোকেন (
getToken()
ব্যবহার করে) অনুরোধ করেছেন।
বার্তা গ্রহণের অনুমতির অনুরোধ করুন
iOS, macOS, ওয়েব এবং Android 13 (অথবা নতুন) এ, আপনার ডিভাইসে FCM পেলোড গ্রহণ করার আগে, আপনাকে প্রথমে ব্যবহারকারীর অনুমতি নিতে হবে।
firebase_messaging
প্যাকেজটি requestPermission
পদ্ধতি ব্যবহার করে অনুমতির অনুরোধ করার জন্য একটি API প্রদান করে। এই API বেশ কয়েকটি নামযুক্ত আর্গুমেন্ট গ্রহণ করে যা আপনি যে ধরণের অনুমতির অনুরোধ করতে চান তা নির্ধারণ করে, যেমন নোটিফিকেশন পেলোড ধারণকারী মেসেজিং Siri ব্যবহার করে শব্দ ট্রিগার করতে পারে বা বার্তা পড়তে পারে কিনা। ডিফল্টরূপে, পদ্ধতিটি বুদ্ধিমান ডিফল্ট অনুমতির অনুরোধ করে। রেফারেন্স API প্রতিটি অনুমতি কীসের জন্য তার সম্পূর্ণ ডকুমেন্টেশন সরবরাহ করে।
শুরু করতে, আপনার অ্যাপ্লিকেশন থেকে পদ্ধতিটি কল করুন (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
এর অন্যান্য বৈশিষ্ট্যগুলি বর্তমান ডিভাইসে কোনও নির্দিষ্ট অনুমতি সক্রিয়, অক্ষম, নাকি সমর্থিত নয় তা ফেরত দেয়।
একবার অনুমতি মঞ্জুর হয়ে গেলে এবং বিভিন্ন ধরণের ডিভাইসের অবস্থা বোঝা গেলে, আপনার অ্যাপ্লিকেশনটি এখন আগত FCM পেলোডগুলি পরিচালনা করা শুরু করতে পারে।
বার্তা পরিচালনা
আপনার অ্যাপ্লিকেশনের বর্তমান অবস্থার উপর ভিত্তি করে, বিভিন্ন ধরণের বার্তার আগত পেলোডগুলি পরিচালনা করার জন্য বিভিন্ন বাস্তবায়নের প্রয়োজন হয়:
অগ্রভাগের বার্তা
আপনার অ্যাপ্লিকেশনটি ফোরগ্রাউন্ডে থাকাকালীন বার্তাগুলি পরিচালনা করতে, 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
রয়েছে, যেখানে পেলোড সম্পর্কে বিভিন্ন তথ্য বিশদভাবে বর্ণনা করা হয়েছে, যেমন এটি কোথা থেকে এসেছে, অনন্য আইডি, পাঠানোর সময়, এতে কোনও বিজ্ঞপ্তি ছিল কিনা এবং আরও অনেক কিছু। যেহেতু আপনার অ্যাপ্লিকেশনটি অগ্রভাগে থাকাকালীন বার্তাটি পুনরুদ্ধার করা হয়েছিল, তাই আপনি সরাসরি আপনার Flutter অ্যাপ্লিকেশনের অবস্থা এবং প্রেক্ষাপট অ্যাক্সেস করতে পারবেন।
ফোরগ্রাউন্ড এবং বিজ্ঞপ্তি বার্তা
অ্যাপ্লিকেশনটি ফোরগ্রাউন্ডে থাকাকালীন যে বিজ্ঞপ্তি বার্তাগুলি আসে সেগুলি অ্যান্ড্রয়েড এবং iOS উভয় ক্ষেত্রেই ডিফল্টরূপে দৃশ্যমান বিজ্ঞপ্তি প্রদর্শন করবে না। তবে, এই আচরণটি ওভাররাইড করা সম্ভব:
- অ্যান্ড্রয়েডে, আপনাকে অবশ্যই একটি "উচ্চ অগ্রাধিকার" বিজ্ঞপ্তি চ্যানেল তৈরি করতে হবে।
- iOS-এ, আপনি অ্যাপ্লিকেশনটির জন্য উপস্থাপনা বিকল্পগুলি আপডেট করতে পারেন।
ব্যাকগ্রাউন্ড মেসেজ
অ্যান্ড্রয়েড, অ্যাপল এবং ওয়েব ভিত্তিক প্ল্যাটফর্মগুলিতে ব্যাকগ্রাউন্ড বার্তা পরিচালনার প্রক্রিয়া আলাদা।
অ্যাপল প্ল্যাটফর্ম এবং অ্যান্ড্রয়েড
একটি onBackgroundMessage
হ্যান্ডলার নিবন্ধন করে ব্যাকগ্রাউন্ড বার্তাগুলি পরিচালনা করুন। বার্তাগুলি গ্রহণ করা হলে, একটি আইসোলেট তৈরি হয় (শুধুমাত্র অ্যান্ড্রয়েড, iOS/macOS-এর জন্য আলাদা আইসোলেটের প্রয়োজন হয় না) যা আপনাকে আপনার অ্যাপ্লিকেশনটি চলমান না থাকলেও বার্তাগুলি পরিচালনা করতে দেয়।
আপনার ব্যাকগ্রাউন্ড মেসেজ হ্যান্ডলার সম্পর্কে কিছু জিনিস মনে রাখতে হবে:
- এটি অবশ্যই একটি বেনামী ফাংশন হওয়া উচিত নয়।
- এটি অবশ্যই একটি শীর্ষ-স্তরের ফাংশন হতে হবে (যেমন, এমন কোনও ক্লাস পদ্ধতি নয় যার জন্য প্রাথমিককরণ প্রয়োজন)।
- Flutter সংস্করণ 3.3.0 বা উচ্চতর ব্যবহার করার সময়, ফাংশন ঘোষণার ঠিক উপরে
@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 ক্রিয়াকলাপ সম্পাদন করতে পারেন (যেমন স্থানীয় স্টোরেজ আপডেট করা), অন্যান্য প্লাগইনের সাথে যোগাযোগ করতে পারেন ইত্যাদি।
যত তাড়াতাড়ি সম্ভব আপনার যুক্তি সম্পন্ন করার পরামর্শ দেওয়া হচ্ছে। দীর্ঘ, নিবিড় কাজ চালানো ডিভাইসের কর্মক্ষমতাকে প্রভাবিত করে এবং OS প্রক্রিয়াটি বন্ধ করে দিতে পারে। যদি কাজগুলি 30 সেকেন্ডের বেশি সময় ধরে চলে, তাহলে ডিভাইসটি স্বয়ংক্রিয়ভাবে প্রক্রিয়াটি বন্ধ করে দিতে পারে।
ওয়েব
ওয়েবে, একটি জাভাস্ক্রিপ্ট সার্ভিস ওয়ার্কার লিখুন যা ব্যাকগ্রাউন্ডে চলে। ব্যাকগ্রাউন্ড বার্তা পরিচালনা করার জন্য সার্ভিস ওয়ার্কার ব্যবহার করুন।
শুরু করতে, আপনার 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>
ট্যাগটি পরিবর্তন করে কর্মী নিবন্ধন করতে পারেন যা Flutter বুটস্ট্র্যাপ করে:
<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>
এরপর আপনার Flutter অ্যাপ্লিকেশনটি পুনরায় চালু করুন। কর্মী নিবন্ধিত হবে এবং যেকোনো ব্যাকগ্রাউন্ড বার্তা এই ফাইলটি ব্যবহার করে পরিচালনা করা হবে।
মিথস্ক্রিয়া পরিচালনা
যেহেতু বিজ্ঞপ্তিগুলি একটি দৃশ্যমান সংকেত, তাই ব্যবহারকারীরা তাদের সাথে যোগাযোগ করতে (টিপে) স্বাভাবিক। অ্যান্ড্রয়েড এবং iOS উভয় ক্ষেত্রেই ডিফল্ট আচরণ হল অ্যাপ্লিকেশনটি খোলা। যদি অ্যাপ্লিকেশনটি বন্ধ করা হয় তবে এটি শুরু হবে; যদি এটি পটভূমিতে থাকে তবে এটি অগ্রভাগে আনা হবে।
কোনও বিজ্ঞপ্তির বিষয়বস্তুর উপর নির্ভর করে, অ্যাপ্লিকেশনটি খোলার সময় আপনি ব্যবহারকারীর মিথস্ক্রিয়া পরিচালনা করতে চাইতে পারেন। উদাহরণস্বরূপ, যদি কোনও বিজ্ঞপ্তি ব্যবহার করে একটি নতুন চ্যাট বার্তা পাঠানো হয় এবং ব্যবহারকারী এটি টিপে দেন, তাহলে অ্যাপ্লিকেশনটি খোলার সময় আপনি নির্দিষ্ট কথোপকথনটি খুলতে চাইতে পারেন।
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 বা বিজ্ঞপ্তি কম্পোজার ব্যবহার করে পাঠানো হয়েছে কিনা তা নির্বিশেষে।
রপ্তানি সক্ষম করতে, প্রথমে Understand ডেলিভারি ডকুমেন্টের ধাপগুলি অনুসরণ করুন, তারপর এই নির্দেশাবলী অনুসরণ করুন:
অ্যান্ড্রয়েড
আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেন:
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 বিজ্ঞপ্তিগুলির জন্য, আপনাকে একটি অতিরিক্ত বিজ্ঞপ্তি পরিষেবা এক্সটেনশন যোগ করতে হবে এবং এটি ব্যবহারের জন্য আপনার অ্যাপটি কনফিগার করতে হবে।
আপনি যদি Firebase ফোন প্রমাণীকরণ ব্যবহার করেন, তাহলে আপনার Podfile-এ Firebase Auth পড যোগ করতে হবে।
ধাপ ১ - একটি বিজ্ঞপ্তি পরিষেবা এক্সটেনশন যোগ করুন
- এক্সকোডে, ফাইল > নতুন > লক্ষ্য... এ ক্লিক করুন।
- একটি মডেল সম্ভাব্য লক্ষ্যবস্তুর একটি তালিকা উপস্থাপন করবে; নোটিফিকেশন সার্ভিস এক্সটেনশন নির্বাচন করতে স্ক্রোল করুন বা ফিল্টারটি ব্যবহার করুন। পরবর্তী ক্লিক করুন।
- একটি পণ্যের নাম যোগ করুন (এই টিউটোরিয়ালের সাথে "ImageNotification" ব্যবহার করুন),
Swift
অথবাObjective-C
নির্বাচন করুন এবং Finish এ ক্লিক করুন। - সক্রিয় করুন ক্লিক করে স্কিমটি সক্রিয় করুন।
ধাপ ২ - পডফাইলে লক্ষ্য যোগ করুন
সুইফট
আপনার নতুন এক্সটেনশনটি আপনার Runner
টার্গেটে যোগ করে FirebaseMessaging
swift প্যাকেজে অ্যাক্সেস পাচ্ছে কিনা তা নিশ্চিত করুন:
ন্যাভিগেটর থেকে, Firebase Apple platforms SDK যোগ করুন : File > Add Package Dependencies...
প্যাকেজ URL অনুসন্ধান করুন বা লিখুন:
none https://github.com/firebase/firebase-ios-sdk
প্রজেক্ট
Runner
যোগ করুন : প্যাকেজ যোগ করুনFirebaseMessaging বেছে নিন এবং ImageNotification টার্গেটে যোগ করুন: প্যাকেজ যোগ করুন
অবজেক্টিভ-সি
আপনার নতুন এক্সটেনশনটি পডফাইলে যোগ করে Firebase/Messaging
পডে অ্যাক্সেস আছে কিনা তা নিশ্চিত করুন:
নেভিগেটর থেকে, পডফাইলটি খুলুন: পডস > পডফাইল
ফাইলের নীচে যান এবং যোগ করুন:
target 'ImageNotification' do use_frameworks! pod 'Firebase/Auth' # Add this line if you are using FirebaseAuth phone authentication pod 'Firebase/Messaging' end
ios
অথবা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
ধাপ ৪ - পেলোডে ছবিটি যোগ করুন
আপনার নোটিফিকেশন পেলোডে, আপনি এখন একটি ছবি যোগ করতে পারেন। আরও জানতে, কীভাবে একটি প্রেরণ অনুরোধ তৈরি করবেন তা দেখুন।