我们有一个跨平台表单应用程序(Xamarin(。对于推送通知,我们使用Plugin.PushNotification1.3.0。在iOS上,一切似乎都很好。但在安卓系统上,我们有时会遇到问题,我们的注册ID会失效,或者至少看起来是这样。当我们的服务器向FCM发送消息时,我们得到的响应是注册ID不再注册。这种情况只发生在某些设备上。过期时间毫无意义,因为在一个案例中,它发生在3天后。
也没有OnTokenRefresh事件。我们总是在打开应用程序时将当前ID发送到服务器,当然,如果OnTokenRefresh会被触发。
有人知道这个问题吗?无论出于何种原因,如果应用程序关闭,而id无效,会发生什么?或者可能与安卓奥利奥有关?我们正在尝试验证,但目前似乎只发生在最近的设备上。
我们把问题缩小了一点。在安卓系统中,该事件被调用,但不以Xamarin窗体调用。所以这是有效的:
public override void OnCreate()
{
base.OnCreate();
AppContext = this.ApplicationContext;
if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
{
PushNotificationManager.DefaultNotificationChannelId = "myEvents";
PushNotificationManager.DefaultNotificationChannelName = "myChannel";
}
PushNotificationManager.SoundUri = Uri.Parse($"{ContentResolver.SchemeAndroidResource}://{AppContext.PackageName}/raw/alarm");
// this seems to get called
CrossPushNotification.Current.OnTokenRefresh += (s, p) =>
{
System.Diagnostics.Debug.WriteLine($"TOKEN : {p.Token}");
};
#if DEBUG
PushNotificationManager.Initialize(this, true);
#else
PushNotificationManager.Initialize(this,false);
#endif
}
而这个OnTokenRefresh没有:
public partial class App : Application
{
public new static App Current;
public App()
{
InitializeComponent();
Current = this;
MainPage = new MainPage();
var crossPushListener = CrossPushNotificationListener.Instance;
}
}
CrossPushNotificationListener:
namespace MobileApp1
{
public class CrossPushNotificationListener
{
private static CrossPushNotificationListener _instance;
public static CrossPushNotificationListener Instance
{
get { return _instance ?? (_instance = new CrossPushNotificationListener()); }
private set { _instance = value; }
}
public CrossPushNotificationListener()
{
CrossPushNotification.Current.OnTokenRefresh += OnTokenRefreshNotify;
}
// this function is not executed. Does that make sense?
private async void OnTokenRefreshNotify(object sender, PushNotificationTokenEventArgs args)
{
System.Diagnostics.Debug.WriteLine($"TOKEN : {args.Token}");
Upload(args.Token);
}
}
}
只要应用程序在运行,两者都可以工作。但如果应用程序关闭,则只执行Android代码。
这有道理吗?
当应用程序运行时,一切都很好,只是在不运行时没有。
该服务似乎只能在没有XamarinForms的情况下执行Android代码。我们通过实施解决了这个问题
CrossPushNotification.Current.OnTokenRefresh += (s, p) =>
{
SendToken(p.Token);
};
在没有任何XamarinForms的Android中(因此也没有dependencyServices(。
感谢您的反馈。