หากต้องการเขียนแอปไคลเอ็นต์ Firebase Cloud Messaging ข้ามแพลตฟอร์มด้วย C++ ให้ใช้ Firebase Cloud Messaging API C++ SDK ทำงานได้กับทั้งแพลตฟอร์ม Android และ Apple โดยต้องมีการตั้งค่าเพิ่มเติมบางอย่างสำหรับแต่ละแพลตฟอร์ม
ตั้งค่า Firebase และ FCM SDK
หุ่นยนต์
หากคุณยังไม่ได้ เพิ่ม 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 ที่เข้ากันได้ก่อนที่จะเข้าถึงคุณลักษณะต่างๆ หากต้องการเรียนรู้เพิ่มเติม โปรดดูที่ ตรวจสอบบริการ Google Play APK
ไอโอเอส+
- คุณต้องมีใบรับรอง APN ที่ถูกต้อง หากคุณยังไม่มี ตรวจสอบให้แน่ใจว่าได้สร้างไว้ใน ศูนย์สมาชิกนักพัฒนา Apple
- หากคุณยังไม่ได้ เพิ่ม Firebase ในโครงการ C++ ของคุณ จากนั้น หากต้องการตั้งค่าโปรเจ็กต์ของคุณสำหรับ FCM ให้ทำดังนี้
- ใน Podfile ของโปรเจ็กต์ของคุณ ให้เพิ่มการพึ่งพา FCM:
pod 'FirebaseMessaging'
- ลากเฟรม
firebase.framework
และfirebase_messaging.framework
ไปยังโปรเจ็กต์ Xcode ของคุณจาก Firebase C++ SDK
- ใน Podfile ของโปรเจ็กต์ของคุณ ให้เพิ่มการพึ่งพา FCM:
กำหนดค่าโครงการ Xcode ของคุณเพื่อเปิดใช้งานการแจ้งเตือนแบบพุช:
- เลือกโครงการจาก พื้นที่นาวิเกเตอร์
- เลือกเป้าหมายโครงการจาก พื้นที่ตัวแก้ไข
เลือกแท็บ ทั่วไป จาก พื้นที่ตัวแก้ไข
- เลื่อนลงไปที่ 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 โดยปกติรายการนี้จะรวมเข้ากับรายการเฉพาะของโครงการ ซึ่งเป็นวิธีที่ 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.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:
หุ่นยนต์
<?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>
สวิฟท์
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 หากต้องการเรียนรู้เพิ่มเติม ดูฟังก์ชันนี้ที่แสดงใน ตัวอย่างการเริ่มต้นอย่างรวดเร็ว ซึ่งคุณสามารถดาวน์โหลด เรียกใช้ และตรวจสอบได้
หากต้องการเพิ่มลักษณะการทำงานขั้นสูงอื่นๆ ให้กับแอปของคุณ โปรดดูคำแนะนำในการส่งข้อความจากเซิร์ฟเวอร์แอป:
โปรดทราบว่าคุณจะต้อง ติดตั้งเซิร์ฟเวอร์ เพื่อใช้คุณสมบัติเหล่านี้