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

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

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

Android

  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 ไปใช้ ของ Google

  4. เริ่มต้น FCM โดยส่งในแอปและ Listener ที่สร้างขึ้น ดังนี้

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

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

iOS ขึ้นไป

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

    1. ภายในโปรเจ็กต์ในคอนโซล Firebase ให้เลือก ไอคอนรูปเฟือง, เลือก การตั้งค่าโปรเจ็กต์ แล้วเลือก แท็บการรับส่งข้อความในระบบคลาวด์

    2. ในคีย์การตรวจสอบสิทธิ์ AAP ในส่วนการกำหนดค่าแอป iOS ให้คลิกอัปโหลด

    3. เรียกดูตำแหน่งที่คุณบันทึกกุญแจไว้ จากนั้นเลือกคีย์แล้วคลิก เปิด เพิ่มรหัสคีย์สำหรับคีย์ (มีอยู่ใน Apple Developer Member Center) แล้วคลิก อัปโหลด

  3. กำหนดค่าโปรเจ็กต์ Xcode เพื่อเปิดใช้ข้อความ Push ดังนี้

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

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

        เฟรมเวิร์กนี้จะปรากฏใน Xcode v8 ขึ้นไป และ ต้องมีในไลบรารีนี้

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

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

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

  5. กำหนดคลาสที่นำ firebase::messaging::Listener ไปใช้ ของ Google

  6. เริ่มต้นการรับส่งข้อความในระบบคลาวด์ของ Firebase โดยการส่งในแอป และ ผู้ฟัง:

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

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

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

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

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

เมื่อแอปไม่ทำงานเลยและผู้ใช้แตะการแจ้งเตือน ตามค่าเริ่มต้นแล้ว ข้อความไม่ได้ถูกกำหนดเส้นทางผ่านแพลตฟอร์มของ FCM Callback ในกรณีนี้ เพย์โหลดข้อความจะได้รับผ่าน Intent ใช้ในการเริ่มต้นแอปพลิเคชัน หากต้องการให้ FCM ส่งต่อสายเรียกเข้าเหล่านี้ ไปยัง Callback ของไลบรารี 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++ เมื่อแอปอยู่เบื้องหน้า (หรือเมื่อแอปอยู่ในเบื้องหลังและได้รับเพย์โหลดเฉพาะข้อมูลเท่านั้น) ข้อความจะส่งผ่าน Callback รายการใดรายการหนึ่งของชั้นเรียนนี้ หากต้องการเพิ่ม ลักษณะที่กำหนดเองในการจัดการข้อความ คุณจะต้องขยายเวลาของ FCM ListenerServiceเริ่มต้น:

import com.google.firebase.messaging.cpp.ListenerService;

class MyListenerService extends ListenerService {

เมื่อลบล้างเมธอด ListenerService.onMessageReceived แล้ว คุณจะทำสิ่งต่อไปนี้ได้ ดำเนินการตามรายการที่ได้รับ ข้อความระยะไกล และรับข้อมูลข้อความ:

@Override
public void onMessageReceived(RemoteMessage message) {
  Log.d(TAG, "A message has been received.");
  // Do additional logic...
  super.onMessageReceived(message);
}

นอกจากนี้ ListenerService ยังมีวิธีอื่นๆ อีก 2-3 วิธีที่ใช้ไม่บ่อยนัก พารามิเตอร์เหล่านี้อาจถูกลบล้างได้เช่นกัน สำหรับข้อมูลเพิ่มเติม โปรดดูที่ 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 ไฟล์ Manifest นี้ โดยปกติจะรวมเข้ากับไฟล์ Manifest เฉพาะโปรเจ็กต์ ซึ่งเป็นวิธีที่ 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

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>

Swift

FirebaseMessagingAutoInitEnabled = NO

หากต้องการเปิดใช้ FCM อีกครั้ง คุณสามารถเรียกใช้รันไทม์ได้โดยทำดังนี้

::firebase::messaging::SetTokenRegistrationOnInitEnabled(true);

ค่านี้จะยังคงอยู่กับการรีสตาร์ทแอปเมื่อตั้งค่าแล้ว

FCM อนุญาตให้ส่งข้อความที่มี Deep Link ไปยังแอปของคุณได้ หากต้องการรับข้อความที่มี Deep Link คุณจะต้องเพิ่มตัวกรอง Intent ใหม่ ไปยังกิจกรรมที่จัดการ Deep Link สำหรับแอปของคุณ ตัวกรอง Intent ควร ตรวจจับ Deep Link ในโดเมนของคุณ หากข้อความไม่มี Deep Link การกำหนดค่านี้ไม่จำเป็น ใน 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 ได้ ได้อย่างยืดหยุ่น เช่น

<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>

เมื่อผู้ใช้แตะการแจ้งเตือนที่มีลิงก์ไปยังรูปแบบและโฮสต์คุณ แอปของคุณจะเริ่มกิจกรรมด้วยตัวกรอง Intent นี้เพื่อจัดการกับ ลิงก์

ขั้นตอนถัดไป

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

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

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