我按照本演练在Xamarin表单应用中创建推送通知
https://learn.microsoft.com/en-us/azure/notification-hubs/notification-hubs-android-push-notification-google-fcm-get-started
我已经成功地与NotificationHub集成,当应用程序处于焦点或后台时,我可以在设备上接收测试消息
然而,我无法使应用程序唤醒以接收消息,这是具有通知的主要原因
有很多关于这个问题的帖子,我花了一下午的时间阅读了很多,但我还没有找到任何有效的东西,即使其他人坚持他们这样做
我正在摩托罗拉设备上构建,而不是模拟器
我的清单部分看起来是这样的:
<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"/>
<receiver android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver" android:exported="false" />
<receiver android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="${applicationId}" />
</intent-filter>
</receiver>
SendNotification方法-我修改了示例代码,使其能够在Android UI中显示,它可以进行
var intent = new Intent(this, typeof(MainActivity));
intent.AddFlags(ActivityFlags.ClearTop);
intent.PutExtra("message", body);
var pendingIntent = PendingIntent.GetActivity(this, 0, intent, PendingIntentFlags.OneShot);
var notificationBuilder = new NotificationCompat.Builder(this, Authenticate.Constants.NotificationChannelName)
.SetContentTitle("XamarinNotify Message")
.SetSmallIcon(Resource.Drawable.ic_launcher)
.SetContentText(body)
.SetAutoCancel(true)
.SetShowWhen(false)
.SetContentIntent(pendingIntent);
if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
{
notificationBuilder.SetChannelId(Authenticate.Constants.NotificationChannelName);
}
var notificationManager = NotificationManager.FromContext(this);
notificationManager.Notify(0, notificationBuilder.Build());
// Awesome - this displays the message in the UI but only when the app is running
var notificationManagerCompat = NotificationManagerCompat.From(this);
notificationManager.Notify(0, notificationBuilder.Build());
然而,如果我强制停止应用程序,则在手动重新启动应用程序之前,通知将永远不会到达
我不知道:
- 我做错什么了吗
- 如果我需要实现某种服务,它是什么?会唤醒应用程序的东西?我曾考虑过让Worker使用PeriodicWorkRequest,但无法确定这是否是正确的方法,如果是,我希望在计时器运行时调用它什么
- 我也研究了BroadcastReceiver,但微软网站上示例中使用的一些软件包现在已经被弃用,比如WakefulBroadcastReceive,这让我研究了2
尝试将JSON密钥"notification"放在对firebase API的请求中,但使用"data">
{
"to": "/topics/journal",
"notification": {
"title" : "title",
"text": "data!",
"icon": "ic_notification"
}
}
在这种情况下,只有当您的应用程序处于前台时,这些消息才会触发onMessageReceived()
回调
{
"to": "/topics/dev_journal",
"data": {
"text":"text",
"title":"",
"line1":"Journal",
"line2":"刊物"
}
}
在这种情况下,即使您的应用程序处于前台/后台/终止,这些消息也会触发onMessageReceived()
回调
但这也是一个取决于设备的主题,FCM无法完全控制。
你可以参考的越多https://stackoverflow.com/a/37845174/10768653
以及https://stackoverflow.com/a/43131488/10768653