หากต้องการเขียนแอปไคลเอ็นต์ 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 ที่เข้ากันได้ก่อนที่จะเข้าถึงคุณลักษณะต่างๆ หากต้องการเรียนรู้เพิ่มเติม โปรดดูที่ Check for Google Play services APK
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 ของคุณเพื่อเปิดใช้งานการแจ้งเตือนแบบพุช:
- เลือกโครงการจาก พื้นที่เนวิเกเตอร์
- เลือกเป้าหมายโครงการจาก พื้นที่ตัวแก้ไข
เลือกแท็บ ทั่วไป จาก พื้นที่ตัวแก้ไข
- เลื่อนลงไปที่ Linked Frameworks and Libraries จากนั้นคลิกปุ่ม + เพื่อเพิ่มเฟรมเวิร์ก
ในหน้าต่างที่ปรากฏขึ้น ให้เลื่อนไปที่ UserNotifications.framework คลิกที่รายการนั้น จากนั้นคลิก เพิ่ม
เฟรมเวิร์กนี้ปรากฏใน 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 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 แบบกำหนดเอง ซึ่งทำได้โดยการลบ 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 หากต้องการเรียนรู้เพิ่มเติม โปรดดูฟังก์ชันนี้ที่แสดงอยู่ใน ตัวอย่างการเริ่มต้นอย่างรวดเร็ว ซึ่งคุณสามารถดาวน์โหลด เรียกใช้ และตรวจทานได้
หากต้องการเพิ่มลักษณะการทำงานขั้นสูงอื่นๆ ให้กับแอปของคุณ โปรดดูคำแนะนำสำหรับการส่งข้อความจากเซิร์ฟเวอร์แอป:
โปรดทราบว่าคุณจะต้อง ติดตั้งเซิร์ฟเวอร์ เพื่อใช้คุณสมบัติเหล่านี้