یک برنامه مشتری Firebase Cloud Messaging با C++ راه اندازی کنید

برای نوشتن برنامه مشتری Firebase Cloud Messaging با C++، از Firebase Cloud Messaging API استفاده کنید. C++ SDK برای هر دو پلتفرم اندروید و اپل کار می کند و برای هر پلتفرم نیاز به تنظیمات اضافی است.

Firebase و FCM SDK را راه اندازی کنید

اندروید

  1. اگر قبلاً این کار را نکرده اید، Firebase را به پروژه C++ خود اضافه کنید .

    • در دستورالعمل‌های راه‌اندازی مرتبط، الزامات دستگاه و برنامه را برای استفاده از Firebase C++ SDK، از جمله توصیه استفاده از CMake برای ساختن برنامه‌تان، مرور کنید.

    • در فایل build.gradle در سطح پروژه خود، مطمئن شوید که مخزن Maven Google را در هر دو بخش buildscript و allprojects خود قرار دهید.

  2. ایجاد یک شی App Firebase، عبور از محیط JNI و Activity:

    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 ایجاد کرده‌اید.
  2. اگر قبلاً این کار را نکرده اید، Firebase را به پروژه C++ خود اضافه کنید . سپس، برای تنظیم پروژه خود برای FCM:
    1. در Podfile پروژه خود، وابستگی FCM را اضافه کنید:
      pod 'FirebaseMessaging'
    2. چارچوب های firebase.framework و firebase_messaging.framework را از Firebase C++ SDK به پروژه Xcode خود بکشید.
  3. پروژه Xcode خود را برای فعال کردن Push Notifications پیکربندی کنید:

    1. پروژه را از ناحیه Navigator انتخاب کنید.
    2. هدف پروژه را از ناحیه ویرایشگر انتخاب کنید.
    3. برگه عمومی را از ناحیه ویرایشگر انتخاب کنید.

      1. به پایین به Frameworks and Libraries مرتبط بروید، سپس برای افزودن فریمورک‌ها روی دکمه + کلیک کنید.
      2. در پنجره ای که ظاهر می شود، به UserNotifications.framework بروید، روی آن ورودی کلیک کنید، سپس روی افزودن کلیک کنید.

        این فریم ورک فقط در Xcode v8 به بعد ظاهر می شود و توسط این کتابخانه مورد نیاز است.

    4. برگه قابلیت ها را از ناحیه ویرایشگر انتخاب کنید.

      1. Push Notifications را روی On قرار دهید.
      2. به سمت پایین به حالت‌های پس‌زمینه بروید، سپس آن را به روشن تغییر دهید.
      3. اعلان‌های راه دور را در حالت‌های پس‌زمینه انتخاب کنید.
  4. یک شی برنامه Firebase ایجاد کنید:

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

  5. کلاسی را تعریف کنید که رابط firebase::messaging::Listener پیاده سازی کند.

  6. راه‌اندازی پیام‌رسانی ابری Firebase، ارسال در برنامه و یک شنونده ساخته شده:

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

به رمز ثبت دستگاه دسترسی پیدا کنید

پس از راه اندازی کتابخانه Firebase Cloud Messaging، یک نشانه ثبت نام برای نمونه برنامه مشتری درخواست می شود. برنامه توکن را با پاسخ تماس OnTokenReceived دریافت می کند، که باید در کلاسی که firebase::messaging::Listener پیاده سازی می کند، تعریف شود.

اگر می‌خواهید آن دستگاه خاص را هدف قرار دهید، باید به این نشانه دسترسی داشته باشید.

نکته ای در مورد تحویل پیام در اندروید

وقتی برنامه اصلاً اجرا نمی‌شود و کاربر روی یک اعلان ضربه می‌زند، پیام به‌طور پیش‌فرض از طریق تماس‌های داخلی FCM ارسال نمی‌شود. در این مورد، بارهای پیام از طریق یک Intent که برای شروع برنامه استفاده می شود دریافت می شود. برای اینکه FCM این پیام‌های دریافتی را به فراخوانی کتابخانه C++ ارسال کند، باید روش onNewIntent را در Activity خود لغو کنید و 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 ارسال می‌شود، اما در برخی موارد ممکن است بخواهید رفتار پیش‌فرض را لغو کنید. برای انجام این کار در Android، باید کلاس های سفارشی بنویسید که com.google.firebase.messaging.cpp.ListenerService را گسترش داده و همچنین AndroidManifest.xml پروژه خود را به روز کنید.

نادیده گرفتن روش های ListenerService .

ListenerService کلاس جاوا است که پیام های دریافتی ارسال شده به برنامه را رهگیری می کند و آنها را به کتابخانه 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 هستید. برای کسب اطلاعات بیشتر، این عملکرد نشان داده شده در نمونه شروع سریع را ببینید که می توانید آن را دانلود، اجرا و مرور کنید.

برای افزودن سایر رفتارهای پیشرفته تر به برنامه خود، به راهنمای ارسال پیام از سرور برنامه مراجعه کنید:

به خاطر داشته باشید که برای استفاده از این ویژگی ها به اجرای سرور نیاز دارید.