Check out what’s new from Firebase@ Google I/O 2021, and join our alpha program for early access to the new Remote Config personalization feature. Learn more

הגדר אפליקציית לקוח העברת מסרים של Firebase באמצעות C ++

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

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

דְמוּי אָדָם

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

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

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

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

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

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

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

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

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

iOS

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

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

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

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

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

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

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

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

  6. אתחל את הודעות הענן של Firebase, העבר את האפליקציה והאזין בנוי:

    ::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());
    startService(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 שמכריז על ברירת המחדל של FCM ListenerService . המניפסט הזה מוזג בדרך כלל עם המניפסט הספציפי לפרויקט, וכך מסוגל ListenerService לפעול. שירות ListenerService הזה צריך להיות מוחלף בשירות המאזינים של cusom. זה מושג על ידי הסרת ברירת המחדל של 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>

מנע אתחול אוטומטי

FCM מייצר אסימון רישום למיקוד למכשירים. כאשר נוצר אסימון, הספרייה מעלה את המזהה ונתוני התצורה ל- Firebase. אם ברצונך לקבל הסכמה מפורשת לפני השימוש באסימון, תוכל למנוע ייצור בזמן התצורה על ידי השבתת FCM (וב- Android, Analytics). לשם כך, הוסף ערך מטא-נתונים ל- Info.plist שלך (ולא GoogleService-Info.plist ) ב- iOS, או ל- 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>

iOS

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

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

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