הגדר אפליקציית לקוח Firebase Cloud Messaging עם C++

כדי לכתוב את אפליקציית לקוח Firebase Cloud Messaging עם C++, השתמש ב-API של Firebase Cloud Messaging . ה-C++ SDK עובד עבור פלטפורמות אנדרואיד ואפל כאחד, עם הגדרה נוספת הנדרשת עבור כל פלטפורמה.

הגדר את Firebase ואת FCM SDK

דְמוּי אָדָם

  1. אם עדיין לא עשית זאת, הוסף את Firebase לפרויקט C++ שלך .

    • בהוראות ההגדרה המקושרות, סקור את דרישות המכשיר והאפליקציה לשימוש ב-Firebase C++ SDK, כולל ההמלצה להשתמש ב-CMake כדי לבנות את האפליקציה שלך.

    • בקובץ build.gradle ברמת הפרויקט, הקפד לכלול את מאגר Maven של Google גם ב- buildscript וגם allprojects .

  2. צור אובייקט של אפליקציית Firebase, עובר בסביבת JNI ופעילות:

    app = ::firebase::App::Create(::firebase::AppOptions(), jni_env, activity);

  3. הגדר מחלקה המיישמת את ממשק firebase::messaging::Listener .

  4. אתחול FCM, העברת באפליקציה ומאזין בנוי:

    ::firebase::messaging::Initialize(app, listener);

  5. אפליקציות המסתמכות על ה-SDK של שירותי Google Play צריכות לבדוק את המכשיר עבור APK תואם לשירותי Google Play לפני הגישה לתכונות. למידע נוסף, עיין בבדוק את APK שירותי Google Play .

iOS+

  1. אתה צריך אישור APN תקף. אם עדיין אין לך אחד כזה, הקפד ליצור אחד ב- Apple Developer Member Center .
  2. אם עדיין לא עשית זאת, הוסף את Firebase לפרויקט C++ שלך . לאחר מכן, כדי להגדיר את הפרויקט שלך עבור FCM:
    1. ב-Podfile של הפרויקט שלך, הוסף את התלות של FCM:
      pod 'FirebaseMessaging'
    2. גרור את המסגרות firebase.framework ו- firebase_messaging.framework אל פרויקט ה-Xcode שלך ​​מה- SDK של Firebase C++ .
  3. הגדר את פרויקט ה-Xcode שלך ​​כדי לאפשר הודעות דחיפה:

    1. בחר את הפרויקט מאזור הניווט .
    2. בחר את יעד הפרויקט מאזור העורך .
    3. בחר בכרטיסייה כללי מאזור העורך .

      1. גלול מטה אל מסגרות וספריות מקושרות ולאחר מכן לחץ על הלחצן + כדי להוסיף מסגרות.
      2. בחלון שמופיע, גלול אל UserNotifications.framework , לחץ על ערך זה ולאחר מכן לחץ על הוסף .

        מסגרת זו מופיעה רק ב-Xcode v8 ואילך ונדרשת על ידי ספרייה זו.

    4. בחר בכרטיסייה יכולות מאזור העורך .

      1. העבר את הודעות הדחיפה למצב מופעל .
      2. גלול מטה אל מצבי רקע ולאחר מכן העבר אותו למצב מופעל .
      3. בחר התראות מרחוק תחת מצבי רקע .
  4. צור אובייקט של אפליקציית Firebase:

    app = ::firebase::App::Create(::firebase::AppOptions());

  5. הגדר מחלקה המיישמת את ממשק firebase::messaging::Listener .

  6. אתחול 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. למידע נוסף, ראה פונקציונליות זו המודגמת בדוגמאת ההתחלה המהירה אותה תוכל להוריד, להפעיל ולסקור.

כדי להוסיף התנהגות אחרת ומתקדמת יותר לאפליקציה שלך, עיין במדריכים לשליחת הודעות משרת אפליקציות:

זכור שתזדקק למימוש שרת כדי לעשות שימוש בתכונות אלה.