关闭应用程序后,GCM通知会崩溃应用程序

时间:2017-04-12 06:29:42

标签: android xamarin notifications google-cloud-messaging

当我的应用程序正在运行时(在前台和后台),我可以接收通知,并使用Android的NotificationManager向用户显示通知。但是,在将应用程序从最近移动后,当应用程序收到通知时,我收到消息Unfortunately, MyApp has stopped working

我知道应用程序应该能够在将它从最近的位置移开后接收通知,因为我已经设置了百度通知,并且我可以在刷掉应用程序后收到它们。但是对于GCM,它只会导致应用程序崩溃。以下是有问题的代码:

[BroadcastReceiver(Name = "com.my.pkg.MyGcmReceiver", Exported = true, Permission = "com.google.android.c2dm.permission.SEND")]
[IntentFilter(new string[] { "com.google.android.c2dm.intent.RECEIVE" }, Categories = new string[] { "com.my.pkg" })]
public class MyGcmReceiver : GcmReceiver
{
    public override void OnReceive(Context context, Intent intent)
    {
        base.OnReceive(context, intent);
        System.Diagnostics.Debug.WriteLine("MyGcmReceiver - OnReceive called &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
        CreateNotification();
    }

    private void CreateNotification()
    {
        NotificationCompat.Builder builder = new NotificationCompat.Builder(Xamarin.Forms.Forms.Context);

        builder.SetAutoCancel(true);
        builder.SetDefaults(NotificationCompat.DefaultAll);
        builder.SetSmallIcon(Resource.Drawable.icon);
        builder.SetContentTitle("HI");
        builder.SetContentText("MSG FROM GCM");
        builder.SetPriority((int)NotificationPriority.Max);

        NotificationManager manager = (NotificationManager)Xamarin.Forms.Forms.Context.GetSystemService(Context.NotificationService);

        manager.Notify(0, builder.Build());
    }
}

通过在CreateNotification();方法中注释掉OnReceive行,该应用不会崩溃,但当然它不会创建并显示通知。

1 个答案:

答案 0 :(得分:1)

正如我在评论中所说,使用FCM似乎更容易,因为它负责处理消息。

我使用Visual Studio 2017和Xamarin Forms版本2.3.224(它也适用于2.3.3.193)。我还在我的解决方案中附加了Nuget软件包的屏幕截图。我将Xamarin.Firebase.Messaging添加到Android项目而不是表单项目。enter image description here

要运行FCM,您必须创建一个帐户并下载google-services.json文件。有关此here

的更多信息

为了在Xamarin Forms中实现这一点,我在Android中创建了2个服务, 1依赖服务 2意向服务。

依赖服务只检查PlayService是否可用并获取FirebaseToken。

    public class PlayServices: IPlayService
{
    public string IsPlayServicesAvailable()
    {
        int resultCode = GoogleApiAvailability.Instance.IsGooglePlayServicesAvailable(Forms.Context);
        if (resultCode != ConnectionResult.Success)
        {
            if (GoogleApiAvailability.Instance.IsUserResolvableError(resultCode))
                return GoogleApiAvailability.Instance.GetErrorString(resultCode);
            return "This device is not supported";
        }
        return "Available";
    }

    public string FirebaseToken => FirebaseInstanceId.Instance.Token;
}

现在,w.r.t。 IntentService

    [Service]
[IntentFilter(new[] { "com.google.firebase.INSTANCE_ID_EVENT" })]
public class MyFirebaseIidService : FirebaseInstanceIdService
{
    const string TAG = "MyFirebaseIIDService";
    public override void OnTokenRefresh()
    {
        var refreshedToken = FirebaseInstanceId.Instance.Token;
        Log.Debug(TAG, "Refreshed token: " + refreshedToken);
        SendRegistrationToServer(refreshedToken);
    }
    void SendRegistrationToServer(string token)
    {
        // Add custom implementation, as needed.
    }

}

这将在应用程序启动后立即运行,并在应用程序启动后大约6-7秒内完成。这会从Firebase生成令牌并将其提供给应用。

虽然您不需要令牌(因为您可以将推送消息发送到已安装您应用的所有手机),但您可以使用它仅向此手机发送推送通知。

希望这有帮助