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 โดยส่งผ่านสภาพแวดล้อมและกิจกรรม JNI

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

  3. กำหนดคลาสที่ใช้ firebase::messaging::Listener interface

  4. เริ่มต้น FCM ผ่านแอพและผู้ฟังที่สร้าง:

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

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

iOS

  1. คุณต้องมีใบรับรอง APN ที่ ถูกต้อง หากคุณยังไม่มีโปรดอ้างถึง Provision APNs SSL Certificates
  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 จากส่วน Editor

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

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

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

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

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

  5. กำหนดคลาสที่ใช้ firebase::messaging::Listener interface

  6. เริ่มต้น Firebase Cloud Messaging ส่งผ่านแอปและผู้ฟังที่สร้าง:

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

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

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

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