我使用的是Xamarin.Forms,但我在处理推送通知方面遇到了一些问题。 只有当app位于前台时,它们才能正常工作。
当应用程序处于后台时,所有通知都会被正确接收并显示,但我无法让它们振动甚至开启。我发现了很多文档,但它已经很老了,大多数时候,推荐的方法都被弃用了。
无论如何,我有 FirebaseMessagingService 来处理FCM事件,这是生成推送通知的操作:
void SendNotification(RemoteMessage message)
{
var intent = new Intent(this, typeof(MainActivity));
intent.AddFlags(ActivityFlags.ClearTop);
intent.PutExtra("type", message.Data["type"]);
var pendingIntent = PendingIntent.GetActivity(this, 0, intent, PendingIntentFlags.OneShot);
NotificationManager notificationManager = (NotificationManager)ApplicationContext.GetSystemService(NotificationService);
NotificationCompat.Builder builder = null;
if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.O)
{
var importance = NotificationImportance.Default;
NotificationChannel notificationChannel = new NotificationChannel("ID", "Name", importance);
notificationManager.CreateNotificationChannel(notificationChannel);
builder = new NotificationCompat.Builder(ApplicationContext, notificationChannel.Id);
}
else
builder = new NotificationCompat.Builder(ApplicationContext);
builder = builder
.SetSmallIcon(Resource.Drawable.icon)
.SetDefaults((int)((int)NotificationDefaults.Sound | (int)NotificationDefaults.Vibrate))
.SetAutoCancel(true)
.SetContentTitle(message.GetNotification().Title)
.SetContentText(message.GetNotification().Body)
.SetContentIntent(pendingIntent)
.SetLights(65536, 1000, 500)
.SetVibrate(new long[] { 1000, 1000, 1000 })
.SetPriority((int)NotificationPriority.High);
PowerManager pm = (PowerManager)ApplicationContext.GetSystemService(PowerService);
WakeLock wl = pm.NewWakeLock(WakeLockFlags.Partial, "TAG");
wl.Acquire(15000);
notificationManager.Notify(0, builder.Build());
wl.Release();
}
我还在Android.Manifest文件中添加了这些行:
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE"/>
之前非常简单,但我一直在尝试添加新功能,例如WAKE_LOCK部分或创建Builder对象时Android版本的区别。 仅当app位于前台时才会振动。
我甚至尝试使用James Montemagno的Vibrate插件或使用Android.Vibrator类,当应用程序处于后台时,他们也没有工作。
我愿意接受这里的建议。感谢。
答案 0 :(得分:0)
在奥利奥(+)上,您必须通过EnableVibration(true)
启用NotificationChannel channel;
channel = notificationManager.GetNotificationChannel(myUrgentChannel);
if (channel == null)
{
channel = new NotificationChannel(myUrgentChannel, channelName, NotificationImportance.High);
channel.EnableVibration(true);
channel.EnableLights(true);
channel.SetSound(
RingtoneManager.GetDefaultUri(RingtoneType.Notification),
new AudioAttributes.Builder().SetUsage(AudioUsageKind.Notification).Build()
);
channel.LockscreenVisibility = NotificationVisibility.Public;
notificationManager.CreateNotificationChannel(channel);
}
channel.Dispose();
上的振动。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:text="A"
android:id="@+id/A"
android:layout_width="match_parent"
android:layout_height="0dp"
android:padding="10dip"
android:layout_weight="1" />
<Button
android:text="B"
android:id="@+id/B"
android:layout_width="match_parent"
android:layout_height="0dp"
android:padding="10dip"
android:layout_weight="1" />
</LinearLayout>
答案 1 :(得分:0)
在一遍又一遍地检查所有内容后,我只需要将其添加到有效负载中。我不知道必须包括它才能让它振动。我无法以编程方式修改此行为,但我确信这是可能的。
"notification":{
"sound":"default"
}
在此发现 Vibration on push-notification not working when phone locked/app not open