Catch up on highlights from Firebase at Google I/O 2023. Learn more

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

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

ตั้งค่า 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 ส่งผ่านแอปและ Listener ที่สร้างขึ้น:

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

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

iOS+

  1. คุณต้องมีใบรับรอง APN ที่ถูกต้อง หากคุณยังไม่มี ให้สร้างใน Apple Developer Member Center
  2. หากคุณยังไม่ได้ ดำเนินการ ให้เพิ่ม Firebase ในโครงการ C++ ของคุณ จากนั้น ในการตั้งค่าโครงการของคุณสำหรับ FCM:
    1. ใน Podfile ของโปรเจ็กต์ของคุณ ให้เพิ่มการพึ่งพา FCM:
      pod 'FirebaseMessaging'
    2. ลากเฟรม firebase.framework และ firebase_messaging.framework ไปยังโปรเจ็กต์ Xcode จาก Firebase C++ SDK
  3. กำหนดค่าโครงการ Xcode ของคุณเพื่อเปิดใช้งานการแจ้งเตือนแบบพุช:

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

      1. เลื่อนลงไปที่ Linked Frameworks and Libraries จากนั้นคลิกปุ่ม + เพื่อเพิ่มเฟรมเวิร์ก
      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 ผ่านแอปและ Listener ที่สร้างขึ้น:

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

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

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

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

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

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

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

ตามค่าเริ่มต้น การแจ้งเตือนที่ส่งไปยังแอปจะถูกส่งผ่านไปยัง ::firebase::messaging::Listener::OnMessageReceived แต่ในบางกรณี คุณอาจต้องการแทนที่พฤติกรรมเริ่มต้น ในการทำเช่นนี้บน Android คุณจะต้องเขียนคลาสแบบกำหนดเองที่ขยาย 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 นี้จำเป็นต้องแทนที่ด้วยบริการ Listener แบบกำหนดเอง ซึ่งทำได้โดยการลบ 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 หากต้องการเรียนรู้เพิ่มเติม โปรดดูฟังก์ชันนี้ที่แสดงอยู่ใน ตัวอย่างการเริ่มต้นอย่างรวดเร็ว ซึ่งคุณสามารถดาวน์โหลด เรียกใช้ และตรวจทานได้

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

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