หากต้องการเขียนแอปไคลเอ็นต์ 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
ไปใช้ ของ Googleเริ่มต้น FCM โดยส่งในแอปและ Listener ที่สร้างขึ้น ดังนี้
::firebase::messaging::Initialize(app, listener);
แอปที่ใช้ SDK บริการ Google Play ควรตรวจสอบอุปกรณ์ สำหรับ APK ของบริการ Google Play ที่เข้ากันได้ก่อนเข้าถึงฟีเจอร์ ดูข้อมูลเพิ่มเติมได้ที่ ตรวจสอบ APK ของบริการ Google Play
iOS ขึ้นไป
- หากคุณยังไม่ได้ดำเนินการ
เพิ่ม Firebase ลงในโปรเจ็กต์ C++ จากนั้นให้ทำดังนี้
เพื่อตั้งค่าโปรเจ็กต์สำหรับ FCM:
- ใน Podfile ของโปรเจ็กต์ ให้เพิ่มทรัพยากร Dependency ของ FCM ดังนี้
pod 'FirebaseMessaging'
- ลาก
firebase.framework
และfirebase_messaging.framework
ลงในโปรเจ็กต์ Xcode จาก Firebase C++ SDK
- ใน Podfile ของโปรเจ็กต์ ให้เพิ่มทรัพยากร Dependency ของ FCM ดังนี้
อัปโหลดคีย์การตรวจสอบสิทธิ์ APN ไปยัง Firebase หากคุณยังไม่มีคีย์การตรวจสอบสิทธิ์ APNs โปรดสร้างคีย์ใน Apple Developer Member Center
-
ภายในโปรเจ็กต์ในคอนโซล Firebase ให้เลือก ไอคอนรูปเฟือง, เลือก การตั้งค่าโปรเจ็กต์ แล้วเลือก แท็บการรับส่งข้อความในระบบคลาวด์
-
ในคีย์การตรวจสอบสิทธิ์ AAP ในส่วนการกำหนดค่าแอป iOS ให้คลิกอัปโหลด
-
เรียกดูตำแหน่งที่คุณบันทึกกุญแจไว้ จากนั้นเลือกคีย์แล้วคลิก เปิด เพิ่มรหัสคีย์สำหรับคีย์ (มีอยู่ใน Apple Developer Member Center) แล้วคลิก อัปโหลด
-
กำหนดค่าโปรเจ็กต์ Xcode เพื่อเปิดใช้ข้อความ Push ดังนี้
- เลือกโปรเจ็กต์จากพื้นที่ตัวนำทาง
- เลือกเป้าหมายโปรเจ็กต์จากพื้นที่ตัวแก้ไข
เลือกแท็บทั่วไปจากพื้นที่ Editor
- เลื่อนลงไปที่เฟรมเวิร์กและไลบรารีที่ลิงก์ แล้วคลิก ปุ่ม + เพื่อเพิ่มเฟรมเวิร์ก
ในหน้าต่างที่ปรากฏขึ้น ให้เลื่อนไปที่ UserNotifications.framework คลิกที่รายการนั้น แล้วคลิก เพิ่ม
เฟรมเวิร์กนี้จะปรากฏใน Xcode v8 ขึ้นไป และ ต้องมีในไลบรารีนี้
เลือกแท็บความสามารถจากพื้นที่เครื่องมือแก้ไข
- เปลี่ยนข้อความ Push เป็นเปิด
- เลื่อนลงไปที่โหมดพื้นหลัง แล้วปรับสวิตช์เป็นเปิด
- เลือกการแจ้งเตือนระยะไกลในส่วนโหมดพื้นหลัง
สร้างออบเจ็กต์แอป Firebase ดังนี้
app = ::firebase::App::Create(::firebase::AppOptions());
กำหนดคลาสที่นำ
firebase::messaging::Listener
ไปใช้ ของ Googleเริ่มต้นการรับส่งข้อความในระบบคลาวด์ของ Firebase โดยการส่งในแอป และ ผู้ฟัง:
::firebase::messaging::Initialize(app, listener);
เข้าถึงโทเค็นการลงทะเบียนอุปกรณ์
เมื่อเริ่มต้นไลบรารี Firebase Cloud Messaging โทเค็นการลงทะเบียนจะเป็น
ที่ขอสำหรับอินสแตนซ์แอปไคลเอ็นต์ แอปจะได้รับโทเค็นที่มี
OnTokenReceived
Callback ซึ่งควรระบุไว้ในคลาสที่ติดตั้งใช้งาน
firebase::messaging::Listener
หากต้องการกำหนดเป้าหมายอุปกรณ์ดังกล่าว คุณจะต้องมีสิทธิ์เข้าถึงโทเค็นนี้
หมายเหตุเกี่ยวกับการส่งข้อความบน Android
เมื่อแอปไม่ทำงานเลยและผู้ใช้แตะการแจ้งเตือน
ตามค่าเริ่มต้นแล้ว ข้อความไม่ได้ถูกกำหนดเส้นทางผ่านแพลตฟอร์มของ FCM
Callback ในกรณีนี้ เพย์โหลดข้อความจะได้รับผ่าน Intent
ใช้ในการเริ่มต้นแอปพลิเคชัน หากต้องการให้ FCM ส่งต่อสายเรียกเข้าเหล่านี้
ไปยัง Callback ของไลบรารี 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++ เมื่อแอปอยู่เบื้องหน้า
(หรือเมื่อแอปอยู่ในเบื้องหลังและได้รับเพย์โหลดเฉพาะข้อมูลเท่านั้น)
ข้อความจะส่งผ่าน Callback รายการใดรายการหนึ่งของชั้นเรียนนี้ หากต้องการเพิ่ม
ลักษณะที่กำหนดเองในการจัดการข้อความ คุณจะต้องขยายเวลาของ FCM
ListenerService
เริ่มต้น:
import com.google.firebase.messaging.cpp.ListenerService; class MyListenerService extends ListenerService {
เมื่อลบล้างเมธอด ListenerService.onMessageReceived
แล้ว คุณจะทำสิ่งต่อไปนี้ได้
ดำเนินการตามรายการที่ได้รับ
ข้อความระยะไกล
และรับข้อมูลข้อความ:
@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
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 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 หากต้องการเรียนรู้เพิ่มเติม โปรดดูฟังก์ชันการทำงานนี้ ในช่วง ตัวอย่างเริ่มต้นอย่างรวดเร็ว ซึ่งคุณสามารถดาวน์โหลด เรียกใช้ และตรวจสอบได้
หากต้องการเพิ่มลักษณะการทำงานขั้นสูงอื่นๆ ในแอป โปรดดูคำแนะนำสำหรับการส่ง ข้อความจากเซิร์ฟเวอร์แอป:
โปรดทราบว่าคุณต้องมี การติดตั้งเซิร์ฟเวอร์ เพื่อใช้ประโยชน์จาก ใหม่ๆ