关闭应用程序时未收到 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 Forms:如何在 Xamarin ios 应用程序中检查 GPS 是打开还是关闭?
Xamarin.Forms 和 Xamarin Native 有啥区别? [关闭]
在Xamarin.Forms应用程序中离开页面后,Webview不会关闭