หากต้องการเขียนแอปไคลเอ็นต์ Firebase Cloud Messaging แบบข้ามแพลตฟอร์มด้วย Unity ให้ใช้ Firebase Cloud Messaging API Unity SDK ใช้งานได้กับทั้ง Android และ Apple โดยต้องมีการตั้งค่าเพิ่มเติมสำหรับแต่ละแพลตฟอร์ม
ก่อนเริ่มต้น
ข้อกำหนดเบื้องต้น
ติดตั้ง Unity 2021 LTS ขึ้นไป การสนับสนุน Unity 2020 ถือว่าเลิกใช้งานแล้ว และเราจะไม่รองรับอีกต่อไปหลังจากการเปิดตัวเวอร์ชันหลักครั้งถัดไป เวอร์ชันก่อนหน้าอาจใช้งานร่วมกันได้เช่นกัน แต่จะไม่ได้รับการรองรับอย่างเต็มรูปแบบ
(แพลตฟอร์ม Apple เท่านั้น) ติดตั้งสิ่งต่อไปนี้
- Xcode 13.3.1 ขึ้นไป
- CocoaPods 1.12.0 ขึ้นไป
ตรวจสอบว่าโปรเจ็กต์ Unity ของคุณเป็นไปตามข้อกำหนดต่อไปนี้
- สำหรับ iOS — กำหนดเป้าหมายเป็น iOS 13 ขึ้นไป
- สำหรับ tvOS - กำหนดเป้าหมายเป็น tvOS 13 ขึ้นไป
- สำหรับ Android — กำหนดเป้าหมายเป็น API ระดับ 21 (Lollipop) ขึ้นไป
ตั้งค่าอุปกรณ์หรือใช้โปรแกรมจำลองเพื่อเรียกใช้โปรเจ็กต์ Unity
สำหรับ iOS หรือ tvOS - ตั้งค่าอุปกรณ์จริงเพื่อเรียกใช้แอป แล้วทำตามขั้นตอนต่อไปนี้
- รับคีย์การตรวจสอบสิทธิ์ข้อความ Push ของ Apple สำหรับบัญชีนักพัฒนาแอป Apple
- เปิดใช้ข้อความ Push ใน XCode ในส่วนแอป > ความสามารถ
สำหรับ Android - โปรแกรมจำลองต้องใช้ภาพโปรแกรมจำลองกับ Google Play
- ลงชื่อเข้าใช้ Firebase ด้วยบัญชี Google
หากยังไม่มีโปรเจ็กต์ Unity และต้องการลองใช้ผลิตภัณฑ์ Firebase เพียงอย่างเดียว คุณสามารถดาวน์โหลดตัวอย่างการเริ่มต้นใช้งานอย่างรวดเร็วของเรา
ขั้นตอนที่ 1: สร้างโปรเจ็กต์ Firebase
คุณต้องสร้างโปรเจ็กต์ Firebase เพื่อเชื่อมต่อกับโปรเจ็กต์ Unity ก่อนจึงจะเพิ่ม Firebase ลงในโปรเจ็กต์ Unity ได้ ไปที่ทําความเข้าใจโปรเจ็กต์ Firebase เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับโปรเจ็กต์ Firebase
ขั้นตอนที่ 2: ลงทะเบียนแอปกับ Firebase
คุณสามารถลงทะเบียนแอปหรือเกมอย่างน้อย 1 แอปหรือเกมเพื่อเชื่อมต่อกับโปรเจ็กต์ Firebase
ไปที่คอนโซล Firebase
คลิกไอคอน Unity (
) ตรงกลางหน้าภาพรวมโปรเจ็กต์เพื่อเปิดเวิร์กโฟลว์การตั้งค่าหากเพิ่มแอปลงในโปรเจ็กต์ Firebase อยู่แล้ว ให้คลิกเพิ่มแอปเพื่อแสดงตัวเลือกแพลตฟอร์ม
เลือกเป้าหมายของบิลด์ในโปรเจ็กต์ Unity ที่ต้องการลงทะเบียน หรือจะเลือกลงทะเบียนทั้ง 2 เป้าหมายพร้อมกันเลยก็ได้
ป้อนรหัสเฉพาะแพลตฟอร์มของโปรเจ็กต์ Unity
สำหรับ iOS — ป้อนรหัส iOS ของโปรเจ็กต์ Unity ในช่องรหัสกลุ่ม iOS
สำหรับ Android - ป้อนรหัส Android ของโปรเจ็กต์ Unity ในช่องชื่อแพ็กเกจ Android
คำว่าชื่อแพ็กเกจและรหัสแอปพลิเคชันมักใช้แทนกันได้
(ไม่บังคับ) ป้อนชื่อเล่นเฉพาะแพลตฟอร์มของโปรเจ็กต์ Unity
ชื่อเล่นเหล่านี้เป็นตัวระบุภายในเพื่อความสะดวกและจะปรากฏให้คุณเห็นในคอนโซล Firebase เท่านั้นคลิกลงทะเบียนแอป
ขั้นตอนที่ 3: เพิ่มไฟล์การกําหนดค่า Firebase
รับไฟล์การกําหนดค่า Firebase สําหรับแพลตฟอร์มที่ต้องการในเวิร์กโฟลว์การตั้งค่าFirebaseคอนโซล
สำหรับ iOS ให้คลิกดาวน์โหลด GoogleService-Info.plist
สำหรับ Android - คลิกดาวน์โหลด google-services.json
เปิดหน้าต่างโปรเจ็กต์ของโปรเจ็กต์ Unity จากนั้นย้ายไฟล์การกำหนดค่าไปยังโฟลเดอร์
Assets
กลับไปที่คอนโซล Firebase ในเวิร์กโฟลว์การตั้งค่า ให้คลิกถัดไป
ขั้นตอนที่ 4: เพิ่ม Firebase Unity SDK
ในคอนโซล Firebase ให้คลิกดาวน์โหลด Firebase Unity SDK จากนั้นแตกไฟล์ SDK ในที่ที่สะดวก
คุณสามารถดาวน์โหลด Firebase Unity SDK อีกครั้งได้ทุกเมื่อ
SDK ของ Firebase Unity ไม่ได้เจาะจงแพลตฟอร์ม
ในโปรเจ็กต์ Unity แบบเปิด ให้ไปที่เนื้อหา > นําเข้าแพ็กเกจ > แพ็กเกจที่กําหนดเอง
จาก SDK ที่แยกไฟล์แล้ว ให้เลือกผลิตภัณฑ์ Firebase ที่รองรับที่ต้องการใช้ในแอป
เราขอแนะนําให้เปิดใช้ Google Analytics ในโปรเจ็กต์เพื่อให้ได้รับประสบการณ์การใช้งาน Firebase Cloud Messaging ที่ดีที่สุด นอกจากนี้ ในการตั้งค่า Analytics คุณยังต้องเพิ่มแพ็กเกจ Firebase สําหรับ Analytics ลงในแอปด้วย
เปิดใช้ Analytics
- เพิ่มแพ็กเกจ Firebase สําหรับ Google Analytics โดยทำดังนี้
FirebaseAnalytics.unitypackage
- เพิ่มแพ็กเกจสำหรับ Firebase Cloud Messaging โดยทำดังนี้
FirebaseMessaging.unitypackage
ไม่ได้เปิดใช้ Analytics
เพิ่มแพ็กเกจสำหรับ Firebase Cloud Messaging โดยทำดังนี้
FirebaseMessaging.unitypackage
- เพิ่มแพ็กเกจ Firebase สําหรับ Google Analytics โดยทำดังนี้
คลิกนำเข้า ในหน้าต่างนำเข้าแพ็กเกจ Unity
กลับไปที่คอนโซล Firebase ในเวิร์กโฟลว์การตั้งค่า ให้คลิกถัดไป
ขั้นตอนที่ 5: ยืนยันข้อกำหนดเวอร์ชันบริการ Google Play
SDK Firebase Unity สำหรับ Android ต้องใช้ Google Play services ซึ่งต้องอัปเดตเป็นเวอร์ชันล่าสุดก่อนจึงจะใช้ SDK ได้
เพิ่มคำสั่ง using
และโค้ดการเริ่มต้นต่อไปนี้ที่จุดเริ่มต้นของแอปพลิเคชัน คุณสามารถตรวจสอบและอัปเดต Google Play services เป็นเวอร์ชันที่ Firebase Unity SDK กำหนด (ไม่บังคับ) ก่อนเรียกใช้เมธอดอื่นๆ ใน SDK
using Firebase.Extensions;
Firebase.FirebaseApp.CheckAndFixDependenciesAsync().ContinueWithOnMainThread(task => {
var dependencyStatus = task.Result;
if (dependencyStatus == Firebase.DependencyStatus.Available) {
// Create and hold a reference to your FirebaseApp,
// where app is a Firebase.FirebaseApp property of your application class.
app = Firebase.FirebaseApp.DefaultInstance;
// Set a flag here to indicate whether Firebase is ready to use by your app.
} else {
UnityEngine.Debug.LogError(System.String.Format(
"Could not resolve all Firebase dependencies: {0}", dependencyStatus));
// Firebase Unity SDK is not safe to use here.
}
});
โปรเจ็กต์ Unity ได้รับการลงทะเบียนและกำหนดค่าให้ใช้ Firebase แล้ว
อัปโหลดคีย์การตรวจสอบสิทธิ์ APNs เพื่อรับการสนับสนุนจาก Apple
อัปโหลดคีย์การตรวจสอบสิทธิ์ APNs ไปยัง Firebase หากยังไม่มีคีย์การตรวจสอบสิทธิ์ APNs โปรดสร้างคีย์ในศูนย์สมาชิกนักพัฒนาแอปของ Apple
-
ในโปรเจ็กต์ในคอนโซล Firebase ให้เลือกไอคอนรูปเฟือง เลือกการตั้งค่าโปรเจ็กต์ แล้วเลือกแท็บการรับส่งข้อความระบบคลาวด์
-
ในส่วนคีย์การตรวจสอบสิทธิ์ APNs ใต้การกำหนดค่าแอป iOS ให้คลิกปุ่มอัปโหลด
-
เรียกดูตำแหน่งที่คุณบันทึกคีย์ไว้ เลือกคีย์ แล้วคลิกเปิด เพิ่มรหัสคีย์สำหรับคีย์ (ดูได้ใน ศูนย์สมาชิกนักพัฒนาแอปของ Apple) แล้วคลิกอัปโหลด
เปิดใช้ข้อความ Push ในแพลตฟอร์ม Apple
ขั้นตอนที่ 1: เพิ่มเฟรมเวิร์กการแจ้งเตือนผู้ใช้
คลิกโปรเจ็กต์ใน Xcode แล้วเลือกแท็บทั่วไปจากพื้นที่แก้ไข
เลื่อนลงไปที่เฟรมเวิร์กและไลบรารีที่ลิงก์ แล้วคลิกปุ่ม + เพื่อเพิ่มเฟรมเวิร์ก
ในหน้าต่างที่ปรากฏขึ้น ให้เลื่อนไปที่ UserNotifications.framework แล้วคลิกรายการนั้น จากนั้นคลิกเพิ่ม
ขั้นตอนที่ 2: เปิดใช้ข้อความ Push
คลิกโปรเจ็กต์ใน Xcode แล้วเลือกแท็บความสามารถจากพื้นที่แก้ไข
สลับข้อความ Push เป็นเปิด
เลื่อนลงไปที่โหมดเบื้องหลัง แล้วเปลี่ยนเป็นเปิด
เลือกช่องทำเครื่องหมายการแจ้งเตือนจากระยะไกลในส่วนโหมดเบื้องหลัง
เริ่มต้น Firebase Cloud Messaging
ระบบจะเริ่มต้นใช้งานไลบรารี Firebase Cloud Message เมื่อเพิ่มตัวแฮนเดิลสำหรับเหตุการณ์ TokenReceived
หรือ MessageReceived
เมื่อเริ่มต้นระบบ ระบบจะขอโทเค็นการลงทะเบียนสําหรับอินสแตนซ์แอปไคลเอ็นต์ แอปจะได้รับโทเค็นที่มีเหตุการณ์ OnTokenReceived
ซึ่งควรแคชไว้เพื่อใช้ภายหลัง คุณต้องใช้โทเค็นนี้หากต้องการกำหนดเป้าหมายข้อความไปยังอุปกรณ์เครื่องนี้โดยเฉพาะ
นอกจากนี้ คุณจะต้องลงทะเบียนเข้าร่วมกิจกรรม OnMessageReceived
ด้วยหากต้องการรับข้อความขาเข้า
การตั้งค่าทั้งหมดจะมีลักษณะดังนี้
public void Start() { Firebase.Messaging.FirebaseMessaging.TokenReceived += OnTokenReceived; Firebase.Messaging.FirebaseMessaging.MessageReceived += OnMessageReceived; } public void OnTokenReceived(object sender, Firebase.Messaging.TokenReceivedEventArgs token) { UnityEngine.Debug.Log("Received Registration Token: " + token.Token); } public void OnMessageReceived(object sender, Firebase.Messaging.MessageReceivedEventArgs e) { UnityEngine.Debug.Log("Received a new message from: " + e.Message.From); }
การกำหนดค่ากิจกรรมจุดแรกเข้าของ Android
ใน Android Firebase Cloud Messaging จะมาพร้อมกับกิจกรรมจุดแรกเข้าที่กําหนดเองซึ่งจะแทนที่ UnityPlayerActivity
เริ่มต้น หากคุณไม่ได้ใช้จุดแรกเข้าที่กำหนดเอง การเปลี่ยนทดแทนนี้จะดำเนินการโดยอัตโนมัติและคุณไม่จําเป็นต้องดําเนินการใดๆ เพิ่มเติม แอปที่ไม่ได้ใช้จุดแรกเข้าเริ่มต้น Activity หรือแอปที่ระบุ Assets/Plugins/AndroidManifest.xml
ของตนเองจะต้องมีการกําหนดค่าเพิ่มเติม
Firebase Cloud Messaging ปลั๊กอิน Unity ใน Android จะมาพร้อมกับไฟล์เพิ่มเติม 2 ไฟล์ ดังนี้
Assets/Plugins/Android/libmessaging_unity_player_activity.jar
มีกิจกรรมชื่อMessagingUnityPlayerActivity
ซึ่งมาแทนที่UnityPlayerActivity
มาตรฐานAssets/Plugins/Android/AndroidManifest.xml
สั่งให้แอปใช้MessagingUnityPlayerActivity
เป็นจุดแรกเข้าของแอป
ไฟล์เหล่านี้มีให้เนื่องจาก UnityPlayerActivity
เริ่มต้นไม่ได้จัดการ onStop
, การเปลี่ยนผ่านวงจรกิจกรรม onRestart
หรือติดตั้งใช้งาน onNewIntent
ซึ่งจําเป็นสําหรับ Firebase Cloud Messaging ในการจัดการข้อความขาเข้าอย่างถูกต้อง
การกำหนดค่ากิจกรรมจุดแรกเข้าที่กำหนดเอง
หากแอปไม่ได้ใช้ UnityPlayerActivity
เริ่มต้น คุณจะต้องนํา AndroidManifest.xml
ที่ระบุออก และตรวจสอบว่า Activity ที่กําหนดเองจัดการการเปลี่ยนผ่านทั้งหมดของวงจรชีวิตของ Activity ของ Android อย่างเหมาะสม (ดูตัวอย่างวิธีทําได้ที่ด้านล่าง) หากกิจกรรมที่กําหนดเองขยายUnityPlayerActivity
คุณสามารถขยายcom.google.firebase.MessagingUnityPlayerActivity
แทนได้ ซึ่งจะใช้เมธอดที่จําเป็นทั้งหมด
หากคุณใช้กิจกรรมที่กําหนดเองและไม่ได้ขยายcom.google.firebase.MessagingUnityPlayerActivity
คุณควรใส่ข้อมูลโค้ดต่อไปนี้ในกิจกรรม
/** * Workaround for when a message is sent containing both a Data and Notification payload. * * When the app is in the background, if a message with both a data and notification payload is * received the data payload is stored on the Intent passed to onNewIntent. By default, that * intent does not get set as the Intent that started the app, so when the app comes back online * it doesn't see a new FCM message to respond to. As a workaround, we override onNewIntent so * that it sends the intent to the MessageForwardingService which forwards the message to the * FirebaseMessagingService which in turn sends the message to the application. */ @Override protected void onNewIntent(Intent intent) { 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); } /** * Dispose of the mUnityPlayer when restarting the app. * * This ensures that when the app starts up again it does not start with stale data. */ @Override protected void onCreate(Bundle savedInstanceState) { if (mUnityPlayer != null) { mUnityPlayer.quit(); mUnityPlayer = null; } super.onCreate(savedInstanceState); }
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>
หมายเหตุเกี่ยวกับการนำส่งข้อความใน Android
เมื่อแอปไม่ทํางานเลยและผู้ใช้แตะการแจ้งเตือน ระบบจะไม่ส่งข้อความผ่าน Callback ในตัวของ FCM โดยค่าเริ่มต้น ในกรณีนี้ ระบบจะรับเพย์โหลดข้อความผ่าน Intent
ที่ใช้เพื่อเริ่มแอปพลิเคชัน
ข้อความที่ได้รับขณะที่แอปทำงานอยู่เบื้องหลังจะมีเนื้อหาของช่องการแจ้งเตือนที่ใช้ในการสร้างการแจ้งเตือนในถาดระบบ แต่ระบบจะไม่ส่งเนื้อหาการแจ้งเตือนนั้นไปยัง FCM กล่าวคือ FirebaseMessage.Notification
จะเป็นค่า Null
บทสรุปมีดังนี้:
สถานะแอป | การแจ้งเตือน | ข้อมูล | ทั้งสอง |
---|---|---|---|
พื้นหน้า | Firebase.Messaging.FirebaseMessaging.MessageReceived |
Firebase.Messaging.FirebaseMessaging.MessageReceived |
Firebase.Messaging.FirebaseMessaging.MessageReceived |
ข้อมูลเบื้องต้น | ถาดระบบ | Firebase.Messaging.FirebaseMessaging.MessageReceived |
การแจ้งเตือน: ถาดระบบ ข้อมูล: ในข้อมูลเพิ่มเติมของ Intent |
ป้องกันการเริ่มต้นอัตโนมัติ
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.FirebaseMessaging.TokenRegistrationOnInitEnabled = true;
ค่านี้จะยังคงอยู่เมื่อแอปรีสตาร์ทอีกครั้งหลังจากตั้งค่าแล้ว
การจัดการ Messages ด้วย 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 ดูข้อมูลเพิ่มเติมได้จากตัวอย่างการเริ่มต้นใช้งานที่สาธิตฟังก์ชันนี้
หากต้องการเพิ่มลักษณะการทำงานขั้นสูงอื่นๆ ในแอป โปรดดูคู่มือการส่งข้อความจากเซิร์ฟเวอร์แอป
โปรดทราบว่าคุณจะต้องติดตั้งใช้งานเซิร์ฟเวอร์จึงจะใช้ฟีเจอร์เหล่านี้ได้