Xamarin Forms-Android-FCM-当应用程序处于前台、后台并滑动关闭时,请注意通知



我需要一些关于android推送通知的帮助。关于上下文,我已经阅读了几十篇关于如何为android实现推送通知的堆栈溢出帖子。我看到的所有帖子都只涵盖了问题的一部分。我已经能够成功地接收推送通知,并在应用程序处于前台或后台时显示提醒通知,但当应用程序被关闭时,它就不起作用了。当应用程序被关闭时,为了在状态栏上显示通知,您需要使用";"通知";在有效载荷中的对象而不是"对象";数据";对象

我试图实现的是——当应用程序处于前台、后台和关闭状态时,我需要一个状态栏通知、一个声音和一个提醒通知。

代码、有效负载json和清单配置的秘密配方是什么?我手机上的任何主要应用程序——易趣、etsy、亚马逊和我下载的大多数应用程序——都可以做到这一切,所以无论一些fcm外的指南怎么说,这都是可能的。

这是我们FireBaseMessagingService中的onMessageReceived方法:

public override void OnMessageReceived(RemoteMessage message)
{
try
{
base.OnMessageReceived(message);
string messageBody = string.Empty;
string messageTitle = string.Empty;
if (message.GetNotification() != null)
{
messageTitle = message.GetNotification().Title;
messageBody = message.GetNotification().Body;
}
else
{
if (message.Data.Values.Count == 1)
{
messageTitle = "Alerts Occurred";
messageBody = message.Data.Values.First();
}
else if (message.Data.Values.Count == 2)
{
messageTitle = message.Data.Values.ToList()[0];
messageBody = message.Data.Values.ToList()[1];
}
}
SendLocalNotification(messageTitle, messageBody);
}
catch (Exception e)
{
NotificationHubHelper.LogInfo($"Error receiving message on device: {e.Message}");
}
}
private void SendLocalNotification(string title, string body)
{
try
{
_notificationBadgeCount++;
var intent = new Intent(this, typeof(MainActivity));
intent.AddFlags(ActivityFlags.ClearTop);
intent.PutExtra("message", body);
var pendingIntent = PendingIntent.GetActivity(this, 0, intent, PendingIntentFlags.OneShot);
int notificationIconId = 
Resources.GetIdentifier(NotificationHubHelper.AndroidNotificationIconImage, "drawable", 
AppInfo.PackageName);
NotificationHubHelper.LogInfo($"Found notification icon with id: {notificationIconId}");
var notificationBuilder = new NotificationCompat.Builder(this, 
NotificationHubHelper.NotificationChannelName)
.SetContentTitle(title)
.SetSmallIcon(notificationIconId) //.SetSmallIcon(ApplicationInfo.Icon)
.SetContentText(body)
.SetAutoCancel(true)
.SetShowWhen(false)
.SetContentIntent(pendingIntent)
.SetPriority((int)NotificationPriority.Max);
if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
{
notificationBuilder.SetChannelId(NotificationHubHelper.NotificationChannelName);
}
var notificationManager = NotificationManager.FromContext(this);
notificationManager.Notify(0, notificationBuilder.Build());
CrossBadge.Current.SetBadge(_notificationBadgeCount);
}
catch (Exception e)
{
NotificationHubHelper.LogInfo($"Error sending local notification on device: {e.Message}");
}
}

这是我们的清单:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" 
android:versionName="1.0.9" package="HIDDEN_FROM_POST" android:installLocation="auto">
<uses-sdk android:minSdkVersion="23" android:targetSdkVersion="29" />
<application android:allowBackup="false" android:label="HIDDEN_FROM_POST" 
android:icon="@drawable/HIDDEN_FROM_POST">
<meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="HIDDEN_FROM_POST" />
<meta-data android:name="com.google.android.gms.version" 
android:value="@integer/google_play_services_version" />
<uses-library android:name="org.apache.http.legacy" android:required="false" />
<provider android:name="android.support.v4.content.FileProvider" 
android:authorities="${applicationId}.fileprovider" android:exported="false" 
android:grantUriPermissions="true">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" 
android:resource="@xml/file_paths"></meta-data>
</provider>
<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>
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/HIDDEN_FROM_POST" />
</application>
<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" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="com.anddoes.launcher.permission.UPDATE_COUNT"/>
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS"/>
<uses-permission android:name="com.android.launcher.permission.WRITE_SETTINGS"/>
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />
<uses-permission android:name="com.htc.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="com.htc.launcher.permission.UPDATE_SHORTCUT" /> 
<uses-permission android:name="com.sec.android.provider.badge.permission.READ" />
<uses-permission android:name="com.sec.android.provider.badge.permission.WRITE" />
<uses-permission android:name="com.sonyericsson.home.permission.BROADCAST_BADGE" />
<uses-permission android:name="com.sonymobile.home.permission.PROVIDER_INSERT_BADGE" />
</manifest>

最后,这里是我们尝试过的最新有效载荷:

{
"notification":{
"title":"Portugal vs. Denmark",
"body":"great match!"
},
"data":{
"message":"this is a message",
"title":"title"
}
}

如上所述,当应用程序被关闭时,我们会收到一个状态栏通知,当应用处于后台时会收到一条状态栏通知;当应用处于前台时,我们还会收到一条带有提醒的状态栏通知。

我们如何在所有情况下获得提醒通知?

Len

它与普通通知基本相同。在Android 8.0及之后的版本中,您只能通过将通知通道的重要性级别设置为IMPORTANCE_HIGH来暂停通知。例如:

NotificationChannel notificationChannel = new NotificationChannel("","",NotificationImportance.High);

它还允许用户直接在手机上设置通知的重要性级别。可以实现紧急暂停。

对于8.0之前的Android版本,请在notificationBuilder中添加SetFullScreenIntent

notificationBuilder.SetFullScreenIntent(pendingIntent,true); 

或者激活声音和振动提示。

这可能是一个很长的机会,但经过大量挖掘,我发现当在后台时,尤其是当被刷走时,你无法访问XamarinForms对象,因为它只有在你真正完成启动活动时才会实例化。

例如,如果这实际上是在使用DependencyService或另一个表单库,则会出现错误。

CrossBadge.Current.SetBadge(_notificationBadgeCount)

还请确保从您的通知服务器将优先级设置为high,默认情况下这是正常的,如果被刷走,不会导致应用程序被唤醒。

priority: "high",
android: {
priority: "high",
notification: {
title: title,
body: body,
sound: "default",
priority: "high",
sticky: false,
defaultSound: true,
defaultVibrateTimings: true,
},
data: {        
title: title,
body: body
}
}

相关内容

  • 没有找到相关文章

最新更新