ตั้งค่าแอปไคลเอ็นต์ 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 ที่เข้ากันได้ก่อนที่จะเข้าถึงคุณลักษณะต่างๆ หากต้องการเรียนรู้เพิ่มเติม โปรดดูที่ ตรวจสอบบริการ Google Play APK

ไอโอเอส+

  1. คุณต้องมีใบรับรอง APN ที่ถูกต้อง หากคุณยังไม่มี ตรวจสอบให้แน่ใจว่าได้สร้างไว้ใน ศูนย์สมาชิกนักพัฒนา Apple
  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 คลิกที่รายการนั้น จากนั้นคลิก Add

        เฟรมเวิร์กนี้จะปรากฏเฉพาะใน 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> เช่น:

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

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

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