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

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

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

דְמוּי אָדָם

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

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

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

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

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

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

  4. Initialize FCM, עובר את App מאזין נבנה:

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

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

iOS+

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

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

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

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

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

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

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

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

  6. Initialize Firebase Cloud Messaging, עובר את App מאזין נבנה:

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

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>

גירסאות חדשות של 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). כדי לעשות זאת, להוסיף ערך metadata כדי שלך Info.plist (לא שלך GoogleService-Info.plist ) על פלטפורמות אפל, או שלך AndroidManifest.xml על אנדרואיד:

דְמוּי אָדָם

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

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

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