【问题标题】:How to disable Firebase push notifications in Unity from client side application?如何从客户端应用程序禁用 Unity 中的 Firebase 推送通知?
【发布时间】:2019-10-04 20:11:02
【问题描述】:

我已将 Firebase 集成到 Unity 项目中,并且一切正常。如果用户想在他的应用程序中禁用推送通知,我想集成禁用推送通知。我还没有在代码中找到解决方案,还有一个与我相同的未解决问题,所以我发布新问题以防万一有人提出解决方案。

【问题讨论】:

    标签: firebase unity3d firebase-cloud-messaging


    【解决方案1】:

    您可以使用 FCM 发送两种类型的消息:通知消息和数据消息。

    如果您的应用程序处于活动状态,通知消息将传递到您的应用程序代码,该代码可以决定如何处理它。当应用程序未激活时,系统会自动显示通知消息。没有办法抑制这种行为。

    数据消息总是传递到您的应用程序代码,它可以决定如何处理它们。

    因此,如果您想允许用户禁止显示消息,您只需要发送数据消息,然后在您的应用程序代码中显示它们。

    请注意,或者,您可以找到一种不向禁用通知的用户发送消息的方法。究竟如何做到这一点取决于您的实施。例如:如果您直接发送到 FCM 实例 ID 令牌,您可以跳过禁用推送通知的用户的令牌。如果您使用主题订阅来发送消息,您可以创建一个用户订阅的主题以禁用通知,然后create conditions to exclude delivery to that topic

    【讨论】:

    • 这是个问题,我没有订阅主题,我只是在应用程序启动时初始化 firebase,通知(应用程序外部)即将到来。因此,我查看了 firebase unity 包,但没有找到可以调用以以某种方式取消订阅用户的方法。我看到的唯一一件事就是取消订阅一个主题。
    • 听起来您正在向 FCM 实例 ID 令牌发送我提到的通知消息。在这种情况下,当您的应用程序未处于活动状态时,无法抑制系统处理这些问题的方式。您必须发送数据消息才能控制在这种情况下发生的情况。
    • 感谢您的澄清。我将阅读有关数据消息的更多信息,看看它们是否适合我的目的。基本上,即使应用程序未处于活动状态,我也想发送通知,但要让用户选择关闭它们。
    • 好的,明白了。还有一件事,数据消息到底是什么?我一直在查看控制台中的 firebase Cloud Messaging 选项,但没有看到任何其他发送远程消息的方式,或者我找错了地方?
    • 控制台只能发送通知消息。见stackoverflow.com/questions/40726030/…
    【解决方案2】:

    我通过使用 Firebase 消息传递主题 并调用 SubscribeAsync()UnsubscribeAsync() 设法做到了这一点。

    private void Start()
    {
        if ( notificationsAreOn ) 
           InitFirebaseMessaging();
        else 
           DisableFirebase();
    }
    
        private void DisableFirebase()
        {
            Firebase.FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith( task => 
            {            
                var dependencyStatus = task.Result;
    
                if ( dependencyStatus == Firebase.DependencyStatus.Available ) 
                {    
                    FirebaseAnalytics.SetAnalyticsCollectionEnabled( false );
                    Firebase.Messaging.FirebaseMessaging.UnsubscribeAsync("VeryCoolTopic");
                    Firebase.Messaging.FirebaseMessaging.TokenReceived += null;
                    Firebase.Messaging.FirebaseMessaging.MessageReceived += null;        
                } 
                else 
                {
                    UnityEngine.Debug.LogError(
                        System.String.Format("Could not resolve all Firebase dependencies: {0}", dependencyStatus)
                    );
                }
            });
        }
    
        private void InitFirebaseMessaging()
        {
    
            Firebase.FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith( task => 
            {            
                var dependencyStatus = task.Result;
    
                if ( dependencyStatus == Firebase.DependencyStatus.Available ) 
                {    
                    FirebaseAnalytics.SetAnalyticsCollectionEnabled( true );
                    Firebase.Messaging.FirebaseMessaging.SubscribeAsync("VeryCoolTopic");
                    Firebase.Messaging.FirebaseMessaging.TokenReceived += OnTokenReceived;
                    Firebase.Messaging.FirebaseMessaging.MessageReceived += OnMessageReceived;        
                } 
                else 
                {
                    UnityEngine.Debug.LogError(
                        System.String.Format("Could not resolve all Firebase dependencies: {0}", dependencyStatus)
                    );
                }
            });
        }
    
    

    然后在 Firebase 控制台中创建消息时,使用主题作为目标而不是用户细分。

    您也可以通过使用DeleteTokenAsync() 删除 Firebase 令牌来禁用整个 Firebase,但我尚未对此进行测试,因为使用订阅和取消订阅的方法对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-28
      • 1970-01-01
      • 2011-04-26
      • 2012-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多