当前位置: 首页 > 知识库问答 >
问题:

Xamarin- MainActivity。当应用程序在后台被单击时,使用错误的推送通知参数调用OnNewIntent

逑翰翮
2023-03-14

我有以下代码。当用户在后台或关闭应用程序时点击推送通知时,MainActivity。OnNewIntent被调用,但意图缺少处理推送通知时放入的额外内容。如果单击通知时应用程序处于前台,则intent参数具有额外功能,并得到正确处理。

    [Service]
    [IntentFilter(new[] {"com.google.firebase.MESSAGING_EVENT"})]
    [IntentFilter(new[] {"com.google.firebase.INSTANCE_ID_EVENT"})]
    public class MyFirebaseMessagingService : FirebaseMessagingService
    {
        public override void OnMessageReceived(RemoteMessage message)
        {
            var intent = new Intent(this, typeof(MainActivity));
            intent.PutExtra("source", "notification");
            intent.PutExtra("title", message.GetNotification()?.Title ?? "");
            intent.PutExtra("body", message.GetNotification()?.Body ?? "");
            foreach (var extra in message.Data)
            {
                intent.PutExtra(extra.Key, extra.Value);
            }
            string category = "Miscellaneous";
            if (message.Data.ContainsKey("category")
                && !string.IsNullOrWhiteSpace(message.Data["category"]))
            {
                category = message.Data["category"];
            }

            intent.AddFlags(ActivityFlags.ClearTop);
            var pendingIntent = PendingIntent.GetActivity(this, 0, intent, PendingIntentFlags.OneShot);

            var notificationBuilder = new NotificationCompat.Builder(this, category);

            notificationBuilder.SetContentTitle(message.GetNotification()?.Title)
                .SetSmallIcon(Resource.Drawable.notificationicon)
                .SetContentText(message.GetNotification()?.Body)
                .SetAutoCancel(true)
                .SetShowWhen(false)
                .SetPriority(1)
                .SetContentIntent(pendingIntent)
                .SetCategory(category)
                .SetChannelId(category);

            var notificationManager = NotificationManager.FromContext(this);

            notificationManager.Notify(0, notificationBuilder.Build());
        }
    }

我的MainActivity的OnNewIntent方法如下:

        protected override async void OnNewIntent(Intent intent)
        {
            base.OnNewIntent(intent);

            if (intent.Extras != null
                && intent.Extras.ContainsKey("source")
                && "notification".Equals((string)intent.Extras.Get("source")))
            {
               this.GetLog().Info("Houston, we have liftoff!");
            }
        }

当应用程序打开时用户单击推送通知时,我们点击日志消息。当用户在应用关闭时或在后台单击时,不会因为意图而点击它。附加内容为空。我找不到任何有帮助的文章或问题。思潮?

更新:

当应用程序在Firebase中处于后台时如何处理通知

这个问题让我半途而废。通过在从服务器发送消息时删除json中的通知对象,我现在可以在应用程序处于后台时处理通知。但当它完全关闭时仍然不行。

共有1个答案

潘宝
2023-03-14

这里发生了一些问题。

  1. 问题的一部分似乎实际上是服务器端在创建消息推送。请参阅此处:如何在Firebase中后台处理应用程序通知

我只是确保通知的 json 不包含通知 {} 对象,只包含数据 {} 对象。

我删除了启动活动(如果可以通过启动活动完成此操作,我将使用更新的答案进行报告

我使用了以下代码

public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        protected override async void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            
            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);

            LoadApplication(new App(GetType().Assembly, GetIntentExtras()));

            // THIS LINE IS THE KEY TO GETTING THE EXTRAS WHEN THE APP IS FIRST OPENING, SUCH AS WHEN CLICKING ON A PUSH NOTIFICATION 
            // THIS LINE'S LOCATION IS IMPORTANT- ANY HIGHER AND IT WILL NOT HAVE THE EXTRAS YET
            await ProcessIntent(Intent);
        }

        protected override async void OnNewIntent(Intent intent)
        {
            base.OnNewIntent(intent);

            await ProcessIntent(intent);
        }

        private async Task ProcessIntent(Intent intent)
        {
            if (intent.Extras != null
                && intent.Extras.ContainsKey("source")
                && "notification".Equals((string)intent.Extras.Get("source")))
            {
                this.GetLog().Info("Houston, we have liftoff!");
            }
        }
    }
 类似资料:
  • 我已经在我的应用程序上实现了推送通知,它们工作得很好。我遇到的问题是,当我点击下拉菜单中的它们时,它们会立即重新加载应用程序。为了解决这个问题,我让应用程序创建了一个新的活动实例。这现在打开了一个新的页面,但当点击从这个新的页面返回时,它有同样的问题,并重新加载整个应用程序。

  • 我正在尝试构建一个实时聊天应用程序。 我已经整合了https://pub.dev/packages/flutter_local_notifications用于推送通知的软件包,这是有效的。 我没有使用Firebase,我正在使用我自己的自定义后端,使用https://socket.io/进行实时聊天。 我想在用户发送聊天信息时接收推送通知。推送通知在应用程序处于前台或后台时起作用。但是,当我从进程

  • 当应用程序在后台时,如何更新包含数据负载的Firebase推送通知?有没有办法在通知中指定通知id给Firebase API? 完整的项目在github https://github.com/akshatashan/FireBaseCloudMessagingDemo中

  • index.js中的代码 bgmessaging.js中的代码负责应用程序在后台时的推送 为了在应用程序处于前台时带来图像,我使用了下面的代码:-

  • 我的应用程序有推送通知(FCM)。当应用程序在前台运行时,我可以在onMessageReceived()函数中获取数据负载。当应用程序在后台运行或应用程序完全关闭时,不会调用onMessageReceived()函数。我的问题是,当app在后台或关闭时,是否可能获得数据有效载荷? 提前道谢!

  • 我想为一个聊天应用程序实现FCM推送通知服务,我遵循Firebase文档中的步骤,当通知从Firebase控制台发送到我的设备时,我会得到通知。当我尝试使用http post to https://FCM.googleapis.com/FCM/send通过FCM将通知通过服务器端发送到设备时: 当应用程序处于活动状态并且我正在将此通知发送到我的设备时,Im在我的控制台日志中收到以下消息,所以我认为