Catch up on everthing we announced at this year's Firebase Summit. Learn more

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

การเขียนข้ามแพลตฟอร์ม app ลูกค้าของคุณ 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 App ผ่านในสภาพแวดล้อม JNI และกิจกรรม:

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

  3. กำหนดระดับที่ดำเนินการ firebase::messaging::Listener อินเตอร์เฟซ

  4. เตรียม FCM, ผ่านใน App และสร้างฟัง:

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

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

iOS+

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

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

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

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

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

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

  5. กำหนดระดับที่ดำเนินการ firebase::messaging::Listener อินเตอร์เฟซ

  6. เตรียม Firebase เมฆส่งข้อความผ่านใน App และสร้างฟัง:

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

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

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

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

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

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

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

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

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