当我的应用程序正在运行时(在前台和后台),我可以接收通知,并使用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
行,该应用不会崩溃,但当然它不会创建并显示通知。
答案 0 :(得分:1)
正如我在评论中所说,使用FCM似乎更容易,因为它负责处理消息。
我使用Visual Studio 2017和Xamarin Forms版本2.3.224(它也适用于2.3.3.193)。我还在我的解决方案中附加了Nuget软件包的屏幕截图。我将Xamarin.Firebase.Messaging添加到Android项目而不是表单项目。
要运行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生成令牌并将其提供给应用。
虽然您不需要令牌(因为您可以将推送消息发送到已安装您应用的所有手机),但您可以使用它仅向此手机发送推送通知。
希望这有帮助