หากต้องการเขียนแอปไคลเอนต์ Firebase Cloud Messaging ข้ามแพลตฟอร์มด้วย C++ ให้ใช้ Firebase Cloud Messaging API C++ SDK ใช้งานได้กับทั้งแพลตฟอร์ม Android และ Apple โดยมีการตั้งค่าเพิ่มเติมบางอย่างที่จำเป็นสำหรับแต่ละแพลตฟอร์ม
ตั้งค่า Firebase และ FCM SDK
Android
หากคุณยังไม่ได้ดำเนินการ ให้ เพิ่ม Firebase ในโครงการ C++ ของ คุณ
ในคำแนะนำการตั้งค่าที่เชื่อมโยง ให้ตรวจสอบข้อกำหนดของอุปกรณ์และแอปสำหรับการใช้ Firebase C++ SDK รวมถึงคำแนะนำในการใช้ CMake เพื่อสร้างแอปของคุณ
ในไฟล์
build.gradle
ระดับโปรเจ็กต์ของคุณ ตรวจสอบให้แน่ใจว่าได้รวมที่เก็บ Maven ของ Google ไว้ในทั้งส่วนbuildscript
และallprojects
สร้างวัตถุแอป Firebase ส่งผ่านในสภาพแวดล้อม JNI และกิจกรรม:
app = ::firebase::App::Create(::firebase::AppOptions(), jni_env, activity);
กำหนดคลาสที่ใช้อินเตอร์เฟส
firebase::messaging::Listener
เริ่มต้น FCM ผ่านแอพและ Listener ที่สร้างขึ้น:
::firebase::messaging::Initialize(app, listener);
แอปที่ใช้ SDK บริการ Google Play ควรตรวจสอบอุปกรณ์เพื่อหา APK บริการ Google Play ที่เข้ากันได้ก่อนที่จะเข้าถึงคุณลักษณะ หากต้องการเรียนรู้เพิ่มเติม โปรดดูที่ ตรวจสอบ APK ของบริการ Google Play
iOS+
- คุณต้องมีใบรับรอง APN ที่ถูกต้อง หากคุณยังไม่มี โปรดสร้างใน Apple Developer Member Center
- หากคุณยังไม่ได้ดำเนินการ ให้ เพิ่ม Firebase ในโครงการ C++ ของ คุณ จากนั้น ในการตั้งค่าโครงการของคุณสำหรับ FCM:
- ใน Podfile ของโปรเจ็กต์ของคุณ ให้เพิ่มการพึ่งพา FCM:
pod 'FirebaseMessaging'
- ลากเฟรมเวิร์ก
firebase.framework
และfirebase_messaging.framework
ลงในโปรเจ็กต์ Xcode จาก Firebase C++ SDK
- ใน Podfile ของโปรเจ็กต์ของคุณ ให้เพิ่มการพึ่งพา FCM:
กำหนดค่าโปรเจ็กต์ Xcode ของคุณเพื่อเปิดใช้งานการแจ้งเตือนแบบพุช:
- เลือกโปรเจ็กต์จาก พื้นที่เนวิเกเตอร์
- เลือกเป้าหมายโครงการจาก พื้นที่ Editor
เลือกแท็บ ทั่วไป จาก พื้นที่ตัวแก้ไข
- เลื่อนลงไปที่ Linked Frameworks and Libraries จากนั้นคลิกปุ่ม + เพื่อเพิ่มเฟรมเวิร์ก
ในหน้าต่างที่ปรากฏขึ้น ให้เลื่อนไปที่ UserNotifications.framework คลิกที่รายการนั้น จากนั้นคลิก Add
เฟรมเวิร์กนี้ปรากฏใน Xcode v8 และใหม่กว่าเท่านั้น และจำเป็นสำหรับไลบรารีนี้
เลือกแท็บ ความสามารถ จาก พื้นที่ตัวแก้ไข
- เปลี่ยน การแจ้งเตือนแบบพุช เป็น เปิด
- เลื่อนลงไปที่ โหมดพื้นหลัง แล้วเปลี่ยนเป็น เปิด
- เลือก การแจ้งเตือนระยะไกล ภายใต้ โหมดพื้นหลัง
สร้างวัตถุแอป Firebase:
app = ::firebase::App::Create(::firebase::AppOptions());
กำหนดคลาสที่ใช้อินเตอร์เฟส
firebase::messaging::Listener
เริ่มต้น 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 โดยปกติแล้ว ไฟล์ Manifest นี้จะรวมกับรายการเฉพาะของโปรเจ็กต์ ซึ่งเป็นวิธีที่ 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.0.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);
ค่านี้ยังคงอยู่ในการรีสตาร์ทแอปเมื่อตั้งค่า
การจัดการข้อความด้วย Deep Links บน Android
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 หากต้องการเรียนรู้เพิ่มเติม ดูฟังก์ชันการทำงานนี้ที่แสดงไว้ใน ตัวอย่าง การเริ่มต้นอย่างรวดเร็วซึ่งคุณสามารถดาวน์โหลด เรียกใช้ และตรวจทานได้
หากต้องการเพิ่มลักษณะการทำงานขั้นสูงอื่นๆ ให้กับแอปของคุณ โปรดดูคำแนะนำในการส่งข้อความจากเซิร์ฟเวอร์แอป:
โปรดทราบว่าคุณจะต้อง ติดตั้งเซิร์ฟเวอร์ เพื่อใช้คุณสมบัติเหล่านี้