หากต้องการเขียนFirebase Cloud Messagingแอปไคลเอ็นต์ข้ามแพลตฟอร์มด้วย C++ ให้ใช้ API ของ Firebase Cloud Messaging 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 โดยส่ง App และ Listener ที่สร้างขึ้น
::firebase::messaging::Initialize(app, listener);
แอปที่ใช้ SDK ของบริการ Google Play ควรตรวจสอบอุปกรณ์ เพื่อหา APK ของบริการ Google Play ที่เข้ากันได้ก่อนที่จะเข้าถึงฟีเจอร์ ดูข้อมูลเพิ่มเติมได้ที่ ตรวจสอบ APK ของบริการ Google Play
- หากยังไม่ได้ดำเนินการ ให้
เพิ่ม Firebase ลงในโปรเจ็กต์ C++ จากนั้น
หากต้องการตั้งค่าโปรเจ็กต์สำหรับ FCM ให้ทำดังนี้
- เพิ่มทรัพยากร Dependency ของ FCM ใน Podfile ของโปรเจ็กต์
pod 'FirebaseMessaging'
- ลากเฟรมเวิร์ก
firebase.framework
และfirebase_messaging.framework
ไปยังโปรเจ็กต์ Xcode จาก Firebase C++ SDK
- เพิ่มทรัพยากร Dependency ของ FCM ใน Podfile ของโปรเจ็กต์
อัปโหลดคีย์การตรวจสอบสิทธิ์ APNs ไปยัง Firebase หากยังไม่มีคีย์การตรวจสอบสิทธิ์ APNs โปรดสร้างคีย์ใน Apple Developer Member Center
-
ภายในโปรเจ็กต์ในFirebaseคอนโซล ให้เลือกไอคอน รูปเฟือง เลือก การตั้งค่าโปรเจ็กต์ แล้วเลือกแท็บ Cloud Messaging
-
ในคีย์การตรวจสอบสิทธิ์ APNs ภายในการกำหนดค่าแอป iOS ให้คลิกปุ่มอัปโหลด
-
เรียกดูตำแหน่งที่คุณบันทึกคีย์ เลือกคีย์ แล้วคลิกเปิด เพิ่มรหัสคีย์สำหรับคีย์ (มีอยู่ใน ศูนย์สมาชิกนักพัฒนาซอฟต์แวร์ของ Apple) แล้วคลิก อัปโหลด
-
กำหนดค่าโปรเจ็กต์ Xcode เพื่อเปิดใช้ข้อความ Push โดยทำดังนี้
- เลือกโปรเจ็กต์จากพื้นที่ Navigator
- เลือกเป้าหมายของโปรเจ็กต์จากพื้นที่ของเอดิเตอร์
เลือกแท็บทั่วไปจากพื้นที่แก้ไข
- เลื่อนลงไปที่เฟรมเวิร์กและไลบรารีที่ลิงก์ แล้วคลิกปุ่ม + เพื่อเพิ่มเฟรมเวิร์ก
ในหน้าต่างที่ปรากฏขึ้น ให้เลื่อนไปที่ UserNotifications.framework คลิกรายการดังกล่าว แล้วคลิก เพิ่ม
เฟรมเวิร์กนี้จะปรากฏใน Xcode v8 ขึ้นไปเท่านั้น และไลบรารีนี้จำเป็นต้องใช้
เลือกแท็บความสามารถจากพื้นที่เอดิเตอร์
- เปลี่ยนข้อความ Push เป็นเปิด
- เลื่อนลงไปที่โหมดเบื้องหลัง แล้วเปลี่ยนเป็นเปิด
- เลือกการแจ้งเตือนระยะไกลในส่วนโหมดเบื้องหลัง
สร้างออบเจ็กต์แอป Firebase
app = ::firebase::App::Create(::firebase::AppOptions());
กำหนดคลาสที่ใช้
firebase::messaging::Listener
อินเทอร์เฟซเริ่มต้น Firebase Cloud Messaging โดยส่ง App และ 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
จะเป็นค่า Null
บทสรุปมีดังนี้:
สถานะของแอป | การแจ้งเตือน | ข้อมูล | ทั้งสอง |
---|---|---|---|
พื้นหน้า | OnMessageReceived |
OnMessageReceived |
OnMessageReceived |
ข้อมูลเบื้องต้น | ถาดระบบ | OnMessageReceived |
การแจ้งเตือน: ถาดระบบ ข้อมูล: ในส่วนพิเศษของ Intent |
การจัดการข้อความที่กำหนดเองใน 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
ยังมีวิธีการอื่นๆ อีก 2-3 วิธีที่ใช้ไม่บ่อยนัก
คุณสามารถลบล้างค่าเหล่านี้ได้เช่นกัน ดูข้อมูลเพิ่มเติมได้ที่ข้อมูลอ้างอิงของ 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 นี้
จะผสานรวมกับไฟล์ Manifest เฉพาะของโปรเจ็กต์ ซึ่งเป็นวิธีที่ทำให้ 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 Link ใน Android
FCM อนุญาตให้ส่งข้อความที่มี Deep Link ไปยังแอปของคุณ หากต้องการรับข้อความที่มี Deep Link คุณต้องเพิ่มตัวกรอง Intent ใหม่ ไปยังกิจกรรมที่จัดการ Deep Link สำหรับแอปของคุณ ตัวกรอง Intent ควร จับ Deep Link ของโดเมนของคุณ หากข้อความไม่มี Deep Link ก็ไม่จำเป็นต้องกำหนดค่านี้ ใน 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 มีความยืดหยุ่นมากขึ้นได้ด้วย เช่น
<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>
เมื่อผู้ใช้แตะการแจ้งเตือนที่มีลิงก์ไปยังสคีมาและโฮสต์ที่คุณระบุ แอปจะเริ่มกิจกรรมด้วยตัวกรอง Intent นี้เพื่อจัดการลิงก์
ขั้นตอนถัดไป
หลังจากตั้งค่าแอปไคลเอ็นต์แล้ว คุณก็พร้อมที่จะส่งข้อความดาวน์สตรีมและข้อความตามหัวข้อด้วย Firebase ดูข้อมูลเพิ่มเติมได้ที่การสาธิตฟังก์ชันนี้ ในตัวอย่างการเริ่มต้นใช้งานอย่างรวดเร็ว ซึ่งคุณสามารถดาวน์โหลด เรียกใช้ และตรวจสอบได้
หากต้องการเพิ่มลักษณะการทำงานอื่นๆ ที่ซับซ้อนมากขึ้นให้กับแอป โปรดดูคำแนะนำสำหรับการส่ง ข้อความจากเซิร์ฟเวอร์ของแอป
โปรดทราบว่าคุณต้องมีการติดตั้งใช้งานฝั่งเซิร์ฟเวอร์จึงจะใช้ฟีเจอร์เหล่านี้ได้