כדי לכתוב את אפליקציית לקוח Firebase Cloud Messaging עם C++, השתמש ב-API של Firebase Cloud Messaging . ה-C++ SDK עובד עבור פלטפורמות אנדרואיד ואפל כאחד, עם הגדרה נוספת הנדרשת עבור כל פלטפורמה.
הגדר את Firebase ואת FCM SDK
דְמוּי אָדָם
אם עדיין לא עשית זאת, הוסף את Firebase לפרויקט C++ שלך .
בהוראות ההגדרה המקושרות, סקור את דרישות המכשיר והאפליקציה לשימוש ב-Firebase C++ SDK, כולל ההמלצה להשתמש ב-CMake כדי לבנות את האפליקציה שלך.
בקובץ
build.gradle
ברמת הפרויקט, הקפד לכלול את מאגר Maven של Google גם ב-buildscript
וגםallprojects
.
צור אובייקט של אפליקציית Firebase, עובר בסביבת JNI ופעילות:
app = ::firebase::App::Create(::firebase::AppOptions(), jni_env, activity);
הגדר מחלקה המיישמת את ממשק
firebase::messaging::Listener
.אתחול FCM, העברת באפליקציה ומאזין בנוי:
::firebase::messaging::Initialize(app, listener);
אפליקציות המסתמכות על ה-SDK של שירותי Google Play צריכות לבדוק את המכשיר עבור APK תואם לשירותי Google Play לפני הגישה לתכונות. למידע נוסף, עיין בבדוק את APK שירותי Google Play .
iOS+
- אתה צריך אישור APN תקף. אם עדיין אין לך אחד כזה, הקפד ליצור אחד ב- Apple Developer Member Center .
- אם עדיין לא עשית זאת, הוסף את Firebase לפרויקט C++ שלך . לאחר מכן, כדי להגדיר את הפרויקט שלך עבור FCM:
- ב-Podfile של הפרויקט שלך, הוסף את התלות של FCM:
pod 'FirebaseMessaging'
- גרור את המסגרות
firebase.framework
ו-firebase_messaging.framework
אל פרויקט ה-Xcode שלך מה- SDK של Firebase C++ .
- ב-Podfile של הפרויקט שלך, הוסף את התלות של FCM:
הגדר את פרויקט ה-Xcode שלך כדי לאפשר הודעות דחיפה:
- בחר את הפרויקט מאזור הניווט .
- בחר את יעד הפרויקט מאזור העורך .
בחר בכרטיסייה כללי מאזור העורך .
- גלול מטה אל מסגרות וספריות מקושרות ולאחר מכן לחץ על הלחצן + כדי להוסיף מסגרות.
בחלון שמופיע, גלול אל UserNotifications.framework , לחץ על ערך זה ולאחר מכן לחץ על הוסף .
מסגרת זו מופיעה רק ב-Xcode v8 ואילך ונדרשת על ידי ספרייה זו.
בחר בכרטיסייה יכולות מאזור העורך .
- העבר את הודעות הדחיפה למצב מופעל .
- גלול מטה אל מצבי רקע ולאחר מכן העבר אותו למצב מופעל .
- בחר התראות מרחוק תחת מצבי רקע .
צור אובייקט של אפליקציית Firebase:
app = ::firebase::App::Create(::firebase::AppOptions());
הגדר מחלקה המיישמת את ממשק
firebase::messaging::Listener
.אתחול Firebase Cloud Messaging, העברת באפליקציה ומאזין בנוי:
::firebase::messaging::Initialize(app, listener);
גש לאסימון רישום המכשיר
עם האתחול של ספריית הודעות הענן של Firebase, מתבקש אסימון רישום עבור מופע אפליקציית הלקוח. האפליקציה תקבל את האסימון עם ההתקשרות חזרה OnTokenReceived
, שאמורה להיות מוגדרת במחלקה המיישמת firebase::messaging::Listener
.
אם אתה רוצה למקד למכשיר הספציפי הזה, תצטרך גישה לאסימון זה.
הערה לגבי מסירת הודעות באנדרואיד
כאשר האפליקציה אינה פועלת כלל ומשתמש מקיש על הודעה, ההודעה אינה מנותבת, כברירת מחדל, דרך השיחות המובנות של FCM. במקרה זה, עומסי הודעות מתקבלים דרך Intent
המשמשת להפעלת האפליקציה. כדי ש-FCM יעביר את ההודעות הנכנסות הללו ל-C++ של ספריית ההתקשרות חזרה, עליך לעקוף את השיטה onNewIntent
בפעילות שלך ולהעביר את Intent
ל- MessageForwardingService
.
import com.google.firebase.messaging.MessageForwardingService; class MyActivity extends Activity { private static final String TAG = "MyActvity"; @Override protected void onNewIntent(Intent intent) { Log.d(TAG, "A message was sent to this app while it was in the background."); Intent message = new Intent(this, MessageForwardingService.class); message.setAction(MessageForwardingService.ACTION_REMOTE_INTENT); message.putExtras(intent); message.setData(intent.getData()); // For older versions of Firebase C++ SDK (< 7.1.0), use `startService`. // startService(message); MessageForwardingService.enqueueWork(this, message); } }
להודעות שהתקבלו בזמן שהאפליקציה ברקע יש את התוכן של שדה ההתראות שלהן כדי לאכלס את ההתראה במגש המערכת, אך תוכן ההתראה הזה לא יועבר ל-FCM. כלומר, Message::notification
יהיה ריק.
לסיכום:
מצב האפליקציה | הוֹדָעָה | נתונים | שניהם |
---|---|---|---|
חֲזִית | OnMessageReceived | OnMessageReceived | OnMessageReceived |
רקע כללי | מגש מערכת | OnMessageReceived | הודעה: מגש מערכת נתונים: בתוספות של הכוונה. |
טיפול בהודעות מותאם אישית באנדרואיד
כברירת מחדל, הודעות שנשלחות לאפליקציה מועברות אל ::firebase::messaging::Listener::OnMessageReceived
, אך במקרים מסוימים ייתכן שתרצה לעקוף את התנהגות ברירת המחדל. כדי לעשות זאת באנדרואיד תצטרך לכתוב שיעורים מותאמים אישית שמרחיבים את com.google.firebase.messaging.cpp.ListenerService
וכן לעדכן את AndroidManifest.xml
של הפרויקט שלך.
לעקוף שיטות ListenerService
.
ListenerService
הוא מחלקת Java המיירטת הודעות נכנסות שנשלחות לאפליקציה ומנתבת אותן לספריית C++. כאשר האפליקציה נמצאת בחזית (או כאשר האפליקציה היא הרקע והיא מקבלת מטען נתונים בלבד), הודעות יעברו דרך אחת מההתקשרויות חוזרות הניתנות במחלקה זו. כדי להוסיף התנהגות מותאמת אישית לטיפול בהודעות, תצטרך להרחיב את ברירת המחדל של ListenerService
של FCM:
import com.google.firebase.messaging.cpp.ListenerService; class MyListenerService extends ListenerService {
על ידי עקיפה של השיטה ListenerService.onMessageReceived
, תוכל לבצע פעולות על סמך אובייקט RemoteMessage שהתקבל ולקבל את נתוני ההודעה:
@Override public void onMessageReceived(RemoteMessage message) { Log.d(TAG, "A message has been received."); // Do additional logic... super.onMessageReceived(message); }
ListenerService
יש גם כמה שיטות אחרות שנמצאות בשימוש בתדירות נמוכה יותר. ניתן לעקוף גם את אלה, למידע נוסף עיין בהפניה של FirebaseMessagingService .
@Override public void onDeletedMessages() { Log.d(TAG, "Messages have been deleted on the server."); // Do additional logic... super.onDeletedMessages(); } @Override public void onMessageSent(String messageId) { Log.d(TAG, "An outgoing message has been sent."); // Do additional logic... super.onMessageSent(messageId); } @Override public void onSendError(String messageId, Exception exception) { Log.d(TAG, "An outgoing message encountered an error."); // Do additional logic... super.onSendError(messageId, exception); }
עדכן את AndroidManifest.xml
לאחר כתיבת המחלקות המותאמות אישית שלך, הם חייבים להיכלל ב- AndroidManifest.xml
כדי להיכנס לתוקף. ודא שהמניפסט כולל את כלי המיזוג על ידי הכרזה על התכונה המתאימה בתוך התג <manifest>
, כך:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.google.firebase.messaging.cpp.samples" xmlns:tools="http://schemas.android.com/tools">
בארכיון firebase_messaging_cpp.aar
יש קובץ AndroidManifest.xml
שמצהיר על ברירת המחדל של ListenerService
של FCM. מניפסט זה בדרך כלל מוזג עם המניפסט הספציפי לפרויקט, כך ה- ListenerService
מסוגל לפעול. יש להחליף שירות ListenerService
זה בשירות מאזינים מותאם אישית. זה מושג על ידי הסרת ברירת המחדל של ListenerService
והוספת השירות המותאם אישית, שניתן לעשות עם השורות הבאות בקובץ AndroidManifest.xml
של הפרויקטים שלך:
<service android:name="com.google.firebase.messaging.cpp.ListenerService" tools:node="remove" />
<service android:name="com.google.firebase.messaging.cpp.samples.MyListenerService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT"/> </intent-filter> </service>
גרסאות חדשות של Firebase C++ SDK (7.1.0 ואילך) משתמשות ב- JobIntentService
הדורש שינויים נוספים בקובץ AndroidManifest.xml
.
<service android:name="com.google.firebase.messaging.MessageForwardingService" android:permission="android.permission.BIND_JOB_SERVICE" android:exported="false" > </service>
מנע אתחול אוטומטי
FCM מייצר אסימון רישום למיקוד מכשירים. כאשר נוצר אסימון, הספרייה מעלה את המזהה ונתוני התצורה ל-Firebase. אם ברצונך לקבל הסכמה מפורשת לפני השימוש באסימון, תוכל למנוע יצירת בזמן הגדרה על ידי השבתת FCM (וב-Android, Analytics). כדי לעשות זאת, הוסף ערך מטא נתונים ל- Info.plist
שלך (לא GoogleService-Info.plist
שלך) בפלטפורמות של Apple, או AndroidManifest.xml
שלך ב-Android:
דְמוּי אָדָם
<?xml version="1.0" encoding="utf-8"?> <application> <meta-data android:name="firebase_messaging_auto_init_enabled" android:value="false" /> <meta-data android:name="firebase_analytics_collection_enabled" android:value="false" /> </application>
מָהִיר
FirebaseMessagingAutoInitEnabled = NO
כדי להפעיל מחדש את FCM, אתה יכול לבצע שיחת זמן ריצה:
::firebase::messaging::SetTokenRegistrationOnInitEnabled(true);
ערך זה נמשך בכל הפעלה מחדש של האפליקציה לאחר ההגדרה.
טיפול בהודעות עם קישורים עמוקים באנדרואיד
FCM מאפשרת שליחת הודעות המכילות קישור עמוק לאפליקציה שלך. כדי לקבל הודעות המכילות קישור עמוק, עליך להוסיף מסנן כוונות חדש לפעילות המטפלת בקישורי עומק עבור האפליקציה שלך. מסנן הכוונות אמור לתפוס קישורים עמוקים של הדומיין שלך. אם ההודעות שלך אינן מכילות קישור עמוק, תצורה זו אינה הכרחית. ב-AndroidManifest.xml:
<intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <data android:host="CHANGE_THIS_DOMAIN.example.com" android:scheme="http"/> <data android:host="CHANGE_THIS_DOMAIN.example.com" android:scheme="https"/> </intent-filter>
אפשר גם לציין תו כללי כדי להפוך את מסנן הכוונות לגמיש יותר. לדוגמה:
<intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <data android:host="*.example.com" android:scheme="http"/> <data android:host="*.example.com" android:scheme="https"/> </intent-filter>
כאשר משתמשים מקישים על התראה המכילה קישור לסכימה ולמארח שאתה מציין, האפליקציה שלך תתחיל את הפעילות עם מסנן הכוונות הזה כדי לטפל בקישור.
הצעדים הבאים
לאחר הגדרת אפליקציית הלקוח, אתה מוכן לשלוח הודעות במורד הזרם והודעות נושא עם ה-Firebase. למידע נוסף, ראה פונקציונליות זו המודגמת בדוגמאת ההתחלה המהירה אותה תוכל להוריד, להפעיל ולסקור.
כדי להוסיף התנהגות אחרת ומתקדמת יותר לאפליקציה שלך, עיין במדריכים לשליחת הודעות משרת אפליקציות:
זכור שתזדקק למימוש שרת כדי לעשות שימוש בתכונות אלה.