Google is committed to advancing racial equity for Black communities. See how.
หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

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

หากต้องการเขียนแอปไคลเอ็นต์ 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 ส่งผ่านในแอพและผู้ฟังที่สร้างขึ้น:

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

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

iOS

  1. คุณต้องมีใบรับรอง APN ที่ ถูกต้อง หากคุณยังไม่มีโปรดดู ใบรับรอง SSL ของ Provision 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. เลือกเป้าหมายโครงการจาก พื้นที่ Editor
    3. เลือกแท็บ General จาก พื้นที่ Editor

      1. เลื่อนลงไปที่ Linked Frameworks and Libraries จากนั้นคลิกปุ่ม + เพื่อเพิ่ม Frameworks
      2. ในหน้าต่างที่ปรากฏขึ้นให้เลื่อนไปที่ UserNotifications.framework คลิกที่รายการนั้นจากนั้นคลิก เพิ่ม

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

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

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

    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());
    startService(message);
  }
}

ข้อความที่ได้รับในขณะที่แอปทำงานอยู่เบื้องหลังจะมีเนื้อหาของช่องการแจ้งเตือนที่ใช้เพื่อเติมข้อมูลการแจ้งเตือนในถาดระบบ แต่เนื้อหาการแจ้งเตือนนั้นจะไม่ถูกสื่อสารกับ FCM นั่นคือ Message::notification จะเป็นโมฆะ

สรุป:

สถานะของแอป การแจ้งเตือน ข้อมูล ทั้งสอง
เบื้องหน้า OnMessageReceived OnMessageReceived OnMessageReceived
พื้นหลัง ถาดระบบ OnMessageReceived การแจ้งเตือน: ถาดระบบ
ข้อมูล: นอกเหนือจากเจตนา

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

โดยค่าเริ่มต้นการแจ้งเตือนที่ส่งไปยังแอปจะถูกส่งไปที่ ::firebase::messaging::Listener::OnMessageReceived แต่ในบางกรณีคุณอาจต้องการลบล้างพฤติกรรมเริ่มต้น ในการดำเนินการนี้บน Android คุณจะต้องเขียนคลาสที่กำหนดเองซึ่งขยาย com.google.firebase.messaging.cpp.ListenerService รวมทั้งอัปเดต AndroidManifest.xml ของโครงการของคุณ

แทนที่ ListenerService Methods

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 นี้จำเป็นต้องแทนที่ด้วยบริการ cusom 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>

ป้องกันการเริ่มต้นอัตโนมัติ

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

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

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