我需要在DESKTOP统一应用程序上使用Firebase Cloud Messaging

时间:2019-06-26 13:55:54

标签: firebase unity3d firebase-cloud-messaging

我已经在Unity项目中安装了东西,但是我需要知道是否能够将推送通知发送到运行Unity的独立桌面(Windows或Mac)应用程序。

我知道实时数据库说它仅适用于IOS / Android,但我个人认为它可以像现在正在制作的那样在桌面应用程序上运行。这可以与Cloud Messaging一起使用吗?

请帮助。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Firebase.Messaging;

public class NotificationManager : MonoBehaviour
{


    public void OnMessageReceived(object sender, MessageReceivedEventArgs e)
    {
        Debug.Log("From: " + e.Message.From);
        Debug.Log("Message ID: " + e.Message.MessageId);
    }


}

我无法从Firebase控制台发送测试通知,因为它尚无法识别任何内容,但我尚未部署或完全构建它。我只是想在编辑器中测试功能。

1 个答案:

答案 0 :(得分:1)

不幸的是,firebase云消息传递在Unity中没有桌面SDK(有关支持的桌面产品的列表,请参见this link)。

但是,根据您的用例,您也许可以使用Realtime Database解决此问题。如果只想可靠地将消息实时发送到正在运行的应用程序实例,则可以执行以下操作: 1)使用Firebase身份验证进行身份验证(建议从匿名身份验证或电子邮件地址/密码开始)。

2)RTDB中的某些节点只能由接收者读取,但是任何登录的用户都可以写入(确保用户不能住彼此的消息,这是对写入UID的另一种限制,或者只是确保您无法覆盖规则中的消息)。

3)将侦听器附加到用户的RTDB节点上,以侦听传入的新消息。

4)写入节点以发送消息。

因此,我在RTDB中设置了这样的数据库规则集:

{
  "rules": {
    ".read": false,
    ".write": false,
    "messages": {
      "$read_uid": {
        "$write_uid": {
          ".read": "$write_uid == auth.uid || $read_uid == auth.uid",
          ".write": "$write_uid == auth.uid || $read_uid == auth.uid"
        },
        ".read": "$read_uid == auth.uid",
        ".write": "$read_uid == auth.uid || newData.val() == auth.uid"
      }
    }
  }
}

您可以在其中读/写message / your_uid或messages / some_uid / your_uid下的任何内容。

您可以create your node使用:

public class Register : MonoBehaviour
{
    public void RegisterUser(string username, string password)
    {
        FirebaseAuth.DefaultInstance.CreateUserWithEmailAndPasswordAsync(username, password).ContinueWithOnMainThread(
            task =>
            {
                if (task.IsCompleted)
                {
                    var databaseReference = FirebaseDatabase.DefaultInstance.RootReference;
                    databaseReference.Child("messages").SetValueAsync(task.Result.UserId);
                }
            });
    }
}

您可以通过以下方式listen to changes

public class ListenForMessages : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        FirebaseDatabase.DefaultInstance
            .GetReference($"/messages/{FirebaseAuth.DefaultInstance.CurrentUser.UserId}")
            .ValueChanged += HandleValueChanged;
    }

    private void HandleValueChanged(object sender, ValueChangedEventArgs e)
    {
        Debug.Log("Do something with " + e.Snapshot);
    }
}

然后发送一条消息变为:

public class SendMessage : MonoBehaviour
{
    public void SendMessageToUser(string uid, string message)
    {
        FirebaseDatabase.DefaultInstance
            .GetReference($"/messages/{uid}/{FirebaseAuth.DefaultInstance.CurrentUser.UserId}").Push()
            .SetValueAsync(message);
    }
}

这几乎不是完整的代码集,并且我已经验证了它可以编译(并且模拟器中的数据库规则看起来正确)。但是我还没有构建完整的测试应用来验证所有内容。

希望这会有所帮助,如果这不能满足您当前的需求,我们深表歉意。随时通过normal support channel发送针对台式机FCM的功能请求,然后继续进行Unity GitHub pageopen source C++ SDK,以跟踪Firebase游戏的进展情况(包括桌面支持) )。

-帕特里克