应用后台闲置时OnMessageReceived函数无法触发问题求助
FCM消息触发异常问题
完全关闭应用后,点击收到的通知可正常触发OnMessageReceived函数;但应用处于后台闲置状态时,点击通知该函数无法触发。尝试移除Notification字段,仅通过Data字段发送通知,结果完全收不到消息。以下是处理消息的Unity脚本及Firebase函数的TypeScript代码:
Unity脚本
using System.Collections.Generic; using UnityEngine; using Firebase.Messaging; using Firebase; using UnityEngine.Networking; using Firebase.Auth; public class FirebaseMessagingController : MonoBehaviour { public static FirebaseMessagingController Instance { get; private set; } //public string firebaseFunctionsUrl; public FirebaseRealtimeDatabase firebaseRealtimeDatabase; public FirebaseUser currentUser; public string userId; public string userName; private void OnEnable() { SubscribeEvent(); } private void OnDisable() { UnSubscribeEvent(); } private void Awake() { if (Instance == null) { Instance = this; DontDestroyOnLoad(gameObject); } else { Destroy(gameObject); } } public void SubscribeEvent() { FirebaseMessaging.TokenReceived += OnTokenReceived; FirebaseMessaging.MessageReceived += OnMessageReceived; } public void UnSubscribeEvent() { FirebaseMessaging.TokenReceived -= OnTokenReceived; FirebaseMessaging.MessageReceived -= OnMessageReceived; } public async void GetTokenAsync() { var task = FirebaseMessaging.GetTokenAsync(); await task; if (task.IsCompleted) { Debug.Log("GET TOKEN ASYNC " + task.Result); firebaseRealtimeDatabase.StartCoroutineSaveUserIdToken(task.Result); } } // 디바이스 토큰 수신 이벤트 핸들러 private void OnTokenReceived(object sender, TokenReceivedEventArgs token) { Debug.Log($"디바이스 토큰: {token.Token}"); if (!PlayerPrefs.HasKey("Token")) { firebaseRealtimeDatabase.StartCoroutineSaveUserIdToken(token.Token); PlayerPrefs.SetString("Token", token.Token); } } private void OnMessageReceived(object sender, MessageReceivedEventArgs e) { Debug.Log("Received a new message"); e.Message.Data.TryGetValue("click_action", out var clickAction); Debug.Log("clickAction : " + clickAction); if (clickAction == "********_MESSAGE") { Debug.Log("*********_MESSAGE"); // 딥링크 처리 if (e.Message.Data.TryGetValue("deep_link", out var deepLink)) { Debug.Log("deepLink Process : " + deepLink); DynamicDeepLinkController.Instance.onDeepLinkActivated(deepLink); } } } public void SendMessage(string latitude, string longitude) { // Firebase Functions 엔드포인트 URL string url = "https://************.cloudfunctions.net/sendMessage"; string message = $"{userName} left a message at {latitude},{longitude}"; // 요청에 필요한 데이터 구성 var formData = new WWWForm(); formData.AddField("writerUid", DynamicDeepLinkController.Instance.writerUid); formData.AddField("userId", userId); formData.AddField("userName", userName); formData.AddField("latitude", latitude); formData.AddField("longitude", longitude); formData.AddField("message", message); // 요청 보내기 UnityWebRequest request = UnityWebRequest.Post(url, formData); request.SendWebRequest(); // 응답 처리 if (request.result != UnityWebRequest.Result.Success) { Debug.LogError("Failed to send message: " + request.error); } else { if (request.responseCode >= 200 && request.responseCode < 300) { Debug.Log("Message sent successfully"); } else { Debug.LogError("Failed to send message. Response code: " + request.responseCode); } } } }
Firebase函数TypeScript代码
import * as functions from "firebase-functions"; import * as admin from "firebase-admin"; import serviceAccount from "../service-account.json"; // Firebase Admin SDK 초기화 admin.initializeApp({ credential: admin.credential.cert(serviceAccount as admin.ServiceAccount), databaseURL: "https://*********-default-rtdb.firebaseio.com/", }); // FCM 인스턴스 가져오기 const fcm = admin.messaging(); export const sendMessage = functions.https.onRequest(async (req, res) => { const writerUid = req.body.writerUid as string; const userId = req.body.userId as string; const userName = req.body.userName as string; const latitude = req.body.latitude as string; const longitude = req.body.longitude as string; const receivedMessage = req.body.message as string; const userNameReplace = userName.replace(" ", "+"); // 사용자 아이디를 기반으로 토큰 검색 const tokenSnapshot = await admin.database().ref(`users/${writerUid}/token`).once("value"); const token = tokenSnapshot.val(); functions.logger.log(`writerUid : ${writerUid}`); functions.logger.log(`userId : ${userId}`); functions.logger.log(`userName : ${userName}`); functions.logger.log(`token : ${token}`); functions.logger.log(`latitude : ${latitude}`); functions.logger.log(`longitude : ${longitude}`); functions.logger.log(`receivedMessage : ${receivedMessage}`); functions.logger.log(`userNameReplace : ${userNameReplace}`); if (!token) { res.status(404).send("User token not found"); return; } functions.logger.log(`click_action : ********://message?${latitude}?${longitude}?${userId}?${userNameReplace}`); // 메시지 페이로드 생성 const message = { notification: { title: userName, body: receivedMessage, }, data: { // title: userName, // body: receivedMessage, click_action: "********_MESSAGE", deep_link: `********://message?${latitude}?${longitude}?${userId}?${userNameReplace}`, }, token: token, }; // 메시지 보내기 try { await fcm.send(message); functions.logger.log("메시지를 성공적으로 보냈습니다."); res.status(200).send("Message sent successfully"); } catch (error) { functions.logger.log("메시지 보내기 중 오류가 발생했습니다:", error); res.status(500).send("Error sending message"); } });
内容的提问来源于stack exchange,提问作者Roy
相关产品推荐
相关产品推荐

