Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

ตั้งค่าแอปไคลเอนต์ Firebase Cloud Messaging ด้วย C++

การเขียนข้ามแพลตฟอร์ม app ลูกค้าของคุณ Firebase Cloud Messaging ด้วย C ++ ใช้ Firebase Cloud Messaging API C++ SDK ใช้งานได้ทั้ง Android และ iOS โดยต้องมีการตั้งค่าเพิ่มเติมสำหรับแต่ละแพลตฟอร์ม

ตั้งค่า Firebase และ FCM SDK

Android

  1. หากคุณยังไม่ได้ เพิ่ม Firebase กับ C ++ โครงการของคุณ

    • ในคำแนะนำการตั้งค่าที่เชื่อมโยง ให้ตรวจสอบข้อกำหนดของอุปกรณ์และแอปสำหรับการใช้ Firebase C++ SDK รวมถึงคำแนะนำในการใช้ CMake เพื่อสร้างแอปของคุณ

    • ในโครงการระดับ build.gradle ไฟล์ให้แน่ใจว่าจะรวมถึงพื้นที่เก็บข้อมูล Maven ของ Google ในทั้งสองของคุณ buildscript และ allprojects ส่วน

  2. สร้างวัตถุ Firebase App ผ่านในสภาพแวดล้อม JNI และกิจกรรม:

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

  3. กำหนดระดับที่ดำเนินการ firebase::messaging::Listener อินเตอร์เฟซ

  4. เตรียม FCM, ผ่านใน App และสร้างฟัง:

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

  5. แอปที่ใช้ SDK บริการ Google Play ควรตรวจสอบอุปกรณ์เพื่อหา APK ของบริการ Google Play ที่เข้ากันได้ก่อนที่จะเข้าถึงคุณลักษณะ ต้องการเรียนรู้เพิ่มเติมโปรดดูที่การ ตรวจสอบการบริการ Google Play เอพีเค

iOS

  1. คุณต้องมี APNs ใบรับรอง ถ้าคุณไม่ได้หนึ่งให้แน่ใจว่าจะสร้างหนึ่งใน แอปเปิ้ลผู้พัฒนาศูนย์สมาชิก
  2. หากคุณยังไม่ได้ เพิ่ม Firebase กับ C ++ โครงการของคุณ จากนั้น ในการตั้งค่าโครงการของคุณสำหรับ FCM:
    1. ในโครงการของคุณ Podfile เพิ่มการพึ่งพา FCM นี้:
      pod 'Firebase/Messaging'
    2. ลาก firebase.framework และ firebase_messaging.framework กรอบในโครงการ Xcode ของคุณจาก Firebase c ++ SDK
  3. กำหนดค่าโครงการ Xcode ของคุณเพื่อเปิดใช้งานการแจ้งเตือนแบบพุช:

    1. เลือกโครงการจากพื้นที่นาวิเกเตอร์
    2. เลือกเป้าหมายโครงการจากพื้นที่แก้ไข
    3. เลือกแท็บ General จากพื้นที่แก้ไข

      1. เลื่อนลงไปกรอบที่เชื่อมโยงและห้องสมุดแล้วคลิกปุ่ม + เพื่อเพิ่มกรอบ
      2. ในหน้าต่างที่ปรากฏขึ้นให้เลื่อนไป UserNotifications.framework คลิกที่รายการนั้นแล้วคลิก Add

        เฟรมเวิร์กนี้จะปรากฏเฉพาะใน Xcode v8 และใหม่กว่า และจำเป็นสำหรับไลบรารีนี้

    4. เลือกแท็บความสามารถจากพื้นที่แก้ไข

      1. การแจ้งเตือนสวิทช์กดไปที่ On
      2. เลื่อนลงไปที่โหมดพื้นหลังแล้วสลับไปเมื่อวันที่
      3. เลือกการแจ้งเตือนระยะไกลภายใต้โหมดพื้นหลัง
  4. สร้างวัตถุ Firebase App:

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

  5. กำหนดระดับที่ดำเนินการ firebase::messaging::Listener อินเตอร์เฟซ

  6. เตรียม Firebase เมฆส่งข้อความผ่านใน App และสร้างฟัง:

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

เข้าถึงโทเค็นการลงทะเบียนอุปกรณ์

เมื่อเริ่มต้นไลบรารี Firebase Cloud Messaging จะมีการขอโทเค็นการลงทะเบียนสำหรับอินสแตนซ์แอปไคลเอ็นต์ app ที่จะได้รับโทเค็นกับ OnTokenReceived โทรกลับซึ่งควรจะกำหนดไว้ในคลาสที่ใช้ firebase::messaging::Listener

หากคุณต้องการกำหนดเป้าหมายอุปกรณ์เฉพาะนั้น คุณจะต้องเข้าถึงโทเค็นนี้

หมายเหตุเกี่ยวกับการส่งข้อความบน Android

เมื่อแอปไม่ทำงานเลย และผู้ใช้แตะที่การแจ้งเตือน ข้อความจะไม่ถูกส่งผ่านการโทรกลับในตัวของ FCM ตามค่าเริ่มต้น ในกรณีนี้ payloads ข้อความที่ได้รับผ่านการ 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 การแจ้งเตือน: ถาดระบบ
ข้อมูล: ในส่วนเพิ่มเติมของเจตนา

การจัดการข้อความแบบกำหนดเองบน Android

โดยค่าเริ่มต้นการแจ้งเตือนที่ส่งไปยังแอปจะส่งผ่านไป ::firebase::messaging::Listener::OnMessageReceived แต่ในบางกรณีคุณอาจต้องการที่จะยกเลิกการทำงานเริ่มต้น การทำเช่นนี้บน Android ของคุณจะต้องเขียนเรียนที่กำหนดเองที่ขยาย 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) การทำเช่นนี้เพิ่มมูลค่าข้อมูลเมตาที่คุณ Info.plist (ไม่ใช่ของคุณ GoogleService-Info.plist ) บน iOS หรือคุณ AndroidManifest.xml บน Android:

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 ต้องการเรียนรู้เพิ่มเติมโปรดดูที่การทำงานนี้แสดงให้เห็นใน ตัวอย่าง QuickStart ซึ่งคุณสามารถดาวน์โหลด, วิ่งและทบทวน

หากต้องการเพิ่มลักษณะการทำงานขั้นสูงอื่นๆ ให้กับแอปของคุณ โปรดดูคำแนะนำในการส่งข้อความจากเซิร์ฟเวอร์แอป:

โปรดจำไว้ว่าคุณจะต้องมี การใช้งานเซิร์ฟเวอร์ ที่จะทำให้การใช้งานของคุณสมบัติเหล่านี้