| เลือกแพลตฟอร์ม | iOS+ Android Web Flutter Unity C++ |
คู่มือนี้อธิบายวิธีเริ่มต้นใช้งาน Firebase Cloud Messaging ในแอปไคลเอ็นต์ C++ เพื่อให้คุณส่งข้อความได้อย่างน่าเชื่อถือ
หากต้องการเขียนแอปไคลเอ็นต์ Firebase Cloud Messaging ข้ามแพลตฟอร์มด้วย C++ ให้ใช้ API Firebase Cloud Messaging C++ SDK ใช้ได้กับทั้งแพลตฟอร์ม Android และ Apple โดยต้องมีการตั้งค่าเพิ่มเติมบางอย่างสำหรับแต่ละแพลตฟอร์ม ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีการทำงานของ C++ SDK สำหรับ iOS และ Android กับ FCM ได้ที่ทำความเข้าใจ Firebase สำหรับ C++
ตั้งค่า Firebase และ SDK ของ FCM
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+
- เพิ่ม 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 ให้คลิกอัปโหลดเพื่ออัปโหลดคีย์การตรวจสอบสิทธิ์เวอร์ชันพัฒนาหรือคีย์การตรวจสอบสิทธิ์เวอร์ชันที่ใช้งานจริง หรือทั้ง 2 อย่าง ทั้งนี้คุณต้องระบุอย่างน้อย 1 รายการ
- เรียกดูตำแหน่งที่คุณบันทึกคีย์ไว้ เลือกคีย์ แล้วคลิกเปิด เพิ่มรหัสคีย์สำหรับคีย์ (ดูได้ใน Apple Developer Member Center) แล้วคลิกอัปโหลด
-
ในคอนโซล Firebase ให้ไปที่
กำหนดค่าโปรเจ็กต์ Xcode เพื่อเปิดใช้ข้อความ Push โดยทำดังนี้
- เลือกโปรเจ็กต์จากพื้นที่แถบนำทาง
- เลือกเป้าหมายโปรเจ็กต์จากพื้นที่เครื่องมือแก้ไข
เลือกแท็บทั่วไปจากพื้นที่เครื่องมือแก้ไข
- เลื่อนไปที่เฟรมเวิร์กและไลบรารีที่ลิงก์ แล้วคลิกปุ่ม + เพื่อเพิ่มเฟรมเวิร์ก
ในหน้าต่างที่ปรากฏขึ้น ให้เลื่อนไปที่ UserNotifications.framework คลิกรายการ แล้วคลิกเพิ่ม
เฟรมเวิร์กนี้จะปรากฏใน Xcode v8 ขึ้นไปเท่านั้น และไลบรารีนี้จำเป็นต้องใช้
เลือกแท็บความสามารถจากพื้นที่เครื่องมือแก้ไข
- เปลี่ยนข้อความ Push เป็นเปิด
- เลื่อนไปที่โหมดพื้นหลัง แล้วเปลี่ยนเป็นเปิด
- เลือกการแจ้งเตือนระยะไกลในส่วนโหมดเบื้องหลัง
สร้างออบเจ็กต์แอป Firebase โดยทำดังนี้
app = ::firebase::App::Create(::firebase::AppOptions());
กำหนดคลาสที่ใช้อินเทอร์เฟซ
firebase::messaging::Listenerเริ่มต้น Firebase Cloud Messaging โดยส่งแอปและ Listener ที่สร้างขึ้น
::firebase::messaging::Initialize(app, listener);
เข้าถึงรหัสการติดตั้ง Firebase
เปิดใช้การลงทะเบียนโดยใช้รหัสการติดตั้ง Firebase
หากต้องการเปิดใช้การลงทะเบียนอินสแตนซ์แอปกับ FCM โดยใช้รหัสการติดตั้ง Firebase (FID) คุณต้องเปิดใช้ FID ในการกำหนดค่าของแอปสำหรับทั้งแพลตฟอร์ม Android และ Apple ก่อน โดยทำดังนี้
Android
เพิ่มองค์ประกอบ <meta-data> ต่อไปนี้ภายในองค์ประกอบ <application> ของ AndroidManifest.xml:
<meta-data android:name="firebase_messaging_installation_id_enabled" android:value="true" />
Swift
เพิ่มคีย์ FirebaseMessagingInstallationIdEnabled ลงใน Info.plist และตั้งค่าเป็น YES ดังนี้
FirebaseMessagingInstallationIdEnabled = YES
ใช้ Listener onRegistrationReceived
เมื่อเริ่มต้นไลบรารี Firebase Cloud Messaging ไลบรารีจะลงทะเบียนอินสแตนซ์แอปไคลเอ็นต์เพื่อรับข้อความโดยใช้รหัสการติดตั้ง Firebase (FID) แอปจะได้รับ FID พร้อมกับ Callback OnRegistrationReceived ซึ่งควรกำหนดไว้ในการติดตั้งใช้งาน firebase::messaging::Listener ดังนี้
class MyListener : public firebase::messaging::Listener { public: void OnRegistrationReceived(const char* installation_id) override { LogMessage("Received Firebase Installation ID: %s", installation_id); // TODO: Send the Firebase Installation ID (FID) to your app server to // target this device for messages. } };
หากต้องการกำหนดเป้าหมายอินสแตนซ์ของแอปที่เฉพาะเจาะจง ให้ส่ง FID ไปยังเซิร์ฟเวอร์แอปและจัดเก็บโดยใช้วิธีที่ต้องการ
ลงทะเบียนด้วยตนเองเมื่อปิดใช้การเริ่มต้นอัตโนมัติ
นอกจากนี้ คุณยังทริกเกอร์การลงทะเบียนด้วย FCM ด้วยตนเองขณะรันไทม์ได้โดยใช้ Register() ดังนี้
// Manually register with FCM firebase::Future<void> register_future = firebase::messaging::Register(); register_future.OnCompletion([](const firebase::Future<void>& future) { if (future.status() == firebase::kFutureStatusComplete && future.error() == 0) { // Note: The registered Firebase Installation ID is delivered to the // OnRegistrationReceived callback. LogMessage("Registered with FCM"); } });
เข้าถึงโทเค็นการลงทะเบียน FCM (เลิกใช้งานแล้ว)
เมื่อเริ่มต้นไลบรารี Firebase Cloud Messaging ระบบจะขอโทเค็นการลงทะเบียนสำหรับอินสแตนซ์แอปไคลเอ็นต์ แอปจะได้รับโทเค็นพร้อมกับ Callback OnTokenReceived ซึ่งควรกำหนดไว้ในคลาสที่ใช้ firebase::messaging::Listener
หากต้องการกำหนดเป้าหมายอินสแตนซ์แอปที่เฉพาะเจาะจง คุณจะต้องมีสิทธิ์เข้าถึงโทเค็นนี้
หมายเหตุเกี่ยวกับการส่งข้อความใน Android
เมื่อแอปไม่ได้ทำงานเลยและผู้ใช้แตะการแจ้งเตือน โดยค่าเริ่มต้น ระบบจะไม่กำหนดเส้นทางข้อความผ่าน Callback ในตัวของ FCM ในกรณีนี้ ระบบจะรับเพย์โหลดข้อความผ่าน 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 |
การแจ้งเตือน: ถาดระบบ ข้อมูล: ในส่วนเสริมของ Intent |
การจัดการข้อความที่กำหนดเองใน Android
โดยค่าเริ่มต้น ระบบจะส่งการแจ้งเตือนที่ส่งไปยังแอปไปยัง ::firebase::messaging::Listener::OnMessageReceived แต่ในบางกรณีคุณอาจต้องการลบล้างลักษณะการทำงานเริ่มต้น หากต้องการดำเนินการนี้ใน Android คุณจะต้องเขียนคลาสที่กำหนดเองซึ่งขยาย com.google.firebase.messaging.cpp.ListenerService รวมถึงอัปเดต AndroidManifest.xml ของโปรเจ็กต์
ลบล้างเมธอด ListenerService รายการ
ListenerService คือคลาส Java ที่สกัดกั้นข้อความขาเข้าที่ส่งไปยังแอปและกำหนดเส้นทางไปยังไลบรารี C++ เมื่อแอปทำงานอยู่เบื้องหน้า (หรือเมื่อแอปทำงานอยู่เบื้องหลังและได้รับเพย์โหลดที่มีเฉพาะข้อมูล) ข้อความจะส่งผ่าน Callback รายการใดรายการหนึ่งที่มีให้ในคลาสนี้ หากต้องการเพิ่มลักษณะการทำงานที่กำหนดเองลงในการจัดการข้อความ คุณจะต้องขยาย 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 ยังมีวิธีอื่นๆ อีก 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 (และ Analytics ใน Android) โดยเพิ่มค่าข้อมูลเมตาลงใน 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::SetRegistrationOnInitEnabled(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 นี้เพื่อจัดการลิงก์
ขั้นตอนถัดไป
หลังจากทำตามขั้นตอนการตั้งค่าเสร็จแล้ว คุณมีตัวเลือกต่อไปนี้ในการดำเนินการต่อด้วย FCM สำหรับ C++