关闭应用程序时未收到 Xamarin Forms Android 推送通知

Posted

技术标签:

【中文标题】关闭应用程序时未收到 Xamarin Forms Android 推送通知【英文标题】:Xamarin Forms Android Push Notifications not received when app has been swiped closed 【发布时间】:2021-06-13 17:58:51 【问题描述】:

去年我在我的 Xamarin Forms 应用程序中配置了推送通知,本周决定更新到新的 SDK,在 ios 上这很顺利,但在 android 上我遇到了问题。

我已尝试在此处复制文档:https://docs.microsoft.com/en-us/azure/notification-hubs/xamarin-notification-hubs-push-notifications-android-gcm 并相信我已经完成了 90% 的工作,因为我的应用程序在前台和后台时会很高兴地收到推送通知,但我的应用程序无法在以下情况下收到推送通知它已被关闭(不是强制关闭)。我知道这 100% 不是设备问题,因为我使用 FirebaseService 类测试了旧配置并且工作正常。我也在使用“数据”通知。

发送推送通知时,我能够在设备日志中找到以下错误消息“错误(6621)/AndroidRuntime:java.lang.NullPointerException:尝试调用接口方法'void com.microsoft。 windowsazure.messaging.notificationhubs.NotificationListener.onPushNotificationReceived(android.content.Context, com.microsoft.windowsazure.messaging.notificationhubs.NotificationMessage)' 在空对象引用上"

请查看下面我的 MainActivity 类的代码。

[Activity(Label = "AndroidNotificationTest", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, LaunchMode = LaunchMode.SingleTop, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize)]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    
        internal static readonly string CHANNEL_ID = "my_notification_channel";

        protected override void OnCreate(Bundle savedInstanceState)
        
            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar;

            base.OnCreate(savedInstanceState);

            // Listen for push notifications
            NotificationHub.SetListener(new AzureListener());

            // Start the SDK
            NotificationHub.Start(this.Application, Constants.NotificationHubName, Constants.ListenConnectionString);
            NotificationHub.AddTag("Developer");

            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
            LoadApplication(new App());

            CreateNotificationChannel();
        

        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
        
            Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        

        void CreateNotificationChannel()
        
            if (Build.VERSION.SdkInt < BuildVersionCodes.O)
                return;

            NotificationChannel channel = new NotificationChannel(CHANNEL_ID, "FCM Notifications", NotificationImportance.Default)
            
                Description = "Firebase Cloud Messages appear in this channel"
            ;

            NotificationManager notificationManager = (NotificationManager)GetSystemService(NotificationService);
            notificationManager.CreateNotificationChannel(channel);
        
    

    internal class AzureListener : Java.Lang.Object, INotificationListener
    
        public void OnPushNotificationReceived(Context context, INotificationMessage message)
        
            Console.WriteLine($"Message received with title message.Title and body message.Body");
        
    

还有我的 Android 清单文件。

<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.package.appname">
    <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="29" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <application android:label="AndroidNotificationTest.Android" android:theme="@style/MainTheme"></application>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
</manifest>

我已经为此花费了几天时间,但在这个阶段我对问题所在感到困惑。

【问题讨论】:

您可以将问题发布到github.com/Azure/azure-notificationhubs-xamarin/issues。 我已将问题发布在那里,谢谢 Lucas。 尝试使 OnPushNotificationReceived 异步。异步无效 OnPushNotificationReceived 你好梅丽莎,你有关于这个问题的最新消息吗?因为我遇到了同样的问题,所以在我在 GitHub Xamarin.Components repo 上提交了一个问题,这里 github.com/xamarin/XamarinComponents/issues/1255 参考了您的原始问题。 找到了!一旦应用程序以发布模式部署,即使应用程序被刷出,通知也可以。 【参考方案1】:

也许我的工作代码可以帮助你。

我在使用 AzureListener 类的新文档之前编写了这段代码,但它仍然有效。

Xamarin forms: Push notification is not working on Android 7.1.2

        //if i want more than one notification ,different unique value in every call
    Random u = new Random ();

    if (Build.VERSION.SdkInt >= BuildVersionCodes.O) 

        string channelName = Resources.GetString (Resource.String.channel_name);

        NotificationCompat.Builder notificationBuilder;



             notificationBuilder = new NotificationCompat.Builder (this, channelName)
                    .SetContentTitle (title)
                    .SetSmallIcon (Resource.Drawable.ic_stat_g)
                    .SetContentText (messageBody)
                    .SetAutoCancel (true)
                    .SetContentIntent (pendingIntent);


        var notificationManager = GetSystemService (Context.NotificationService) as NotificationManager;


        NotificationChannel channel = new NotificationChannel (channelName, "notification channel", NotificationImportance.Default);
        notificationManager.CreateNotificationChannel (channel);

        notificationManager.Notify (u.Next(), notificationBuilder.Build ());


     
    else
    

        NotificationCompat.Builder notificationBuilder;


             notificationBuilder = new NotificationCompat.Builder (this)
                .SetContentTitle (title)
                .SetSmallIcon (Resource.Drawable.ic_stat_g)
                .SetContentText (messageBody)
                .SetAutoCancel (true)
                .SetContentIntent (pendingIntent);


        var notificationManager = GetSystemService (Context.NotificationService) as NotificationManager;

        notificationManager.Notify (u.Next(), notificationBuilder.Build ());
    

【讨论】:

嗨,Mich,不幸的是,这段代码没有运气。从我收到的错误消息来看,我认为问题不是 OnPushNotificationReceived 方法中的代码,而是尝试调用实际方法本身。我还尝试根据您上面的评论使方法异步,但也没有运气。您现在是否在代码中使用 Azure 侦听器类? 您好,根据您的问题,我在通知中心再次看到了更改。文档将我发送到这里 github.com/Azure/azure-notificationhubs-dotnet/tree/main/… ......而且此代码没有 Azure 侦听器 对不起,我没有更新这个功能的示例。 是的,我以前在 FirebaseService 中使用过这样的代码,它运行良好,但我想我会更新我的代码以匹配我在原始问题中链接的新文档。我想我将不得不返回,直到团队可以提供工作样本,正如我在许多不同平台上所要求的那样,并且支持团队可以给我答案。 如果您找到解决方案,请在此处发布!

以上是关于关闭应用程序时未收到 Xamarin Forms Android 推送通知的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin.iOS - 设备关闭时推送通知

Xamarin Forms:如何在 Xamarin ios 应用程序中检查 GPS 是打开还是关闭?

Xamarin.Forms 和 Xamarin Native 有啥区别? [关闭]

在Xamarin.Forms应用程序中离开页面后,Webview不会关闭

Xamarin Forms:具有内联标记支持的自定义条目 [关闭]

React Native v Xamarin Forms - 选择跨平台应用程序环境[关闭]