【问题标题】:Unable to open my android background application (Xamarin) on receipt of Firebase Cloud Messaging收到 Firebase 云消息时无法打开我的 android 后台应用程序 (Xamarin)
【发布时间】:2017-09-23 08:30:59
【问题描述】:

我有一个 Xamarin Android 应用程序。收到推送通知后,如果应用程序处于活动状态并且在前台,我可以打开应用程序。但是,如果应用程序在后台或被杀死,应用程序将无法打开。

已遵循以下页面中所述的 Xamarin 指南,但提供的代码也不起作用。 https://developer.xamarin.com/guides/android/application_fundamentals/notifications/remote-notifications-with-fcm/

我想在收到 FCM 推送通知后采取行动(阅读打开)。如果应用程序已经打开,则可以成功。我错过了什么吗?详情如下

AndroidManifest.xml

<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>

FirebaseInstanceIdService 实现

[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);
        SendRegistrationToAppServer(refreshedToken);
    }


    void SendRegistrationToAppServer(string token)
    {
        // Add custom implementation here as needed.

        var android_id = Android.OS.Build.Serial;
        App.AccessCode(token, android_id);
    }

}

FirebaseMessagingService 实现

    [Service]
[IntentFilter(new [] { "com.google.firebase.MESSAGING_EVENT" })]
public class MyFCMListenerService: FirebaseMessagingService {
 Intent intent;

 public override void OnMessageReceived(RemoteMessage message) {
  Thread thread = new Thread(() => {
   Log.Debug("MyGcmListenerService", "Message: thread");
   PushHandler pushHandler = PushHandler.GetPushHander();
   pushHandler.OnReceiveNewNotification(msg, pushType.ToString());

  });
  thread.Start();
 }
}

Package.config

    <?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="AndHUD" version="1.2.0" targetFramework="MonoAndroid60" />
  <package id="Plugin.CurrentActivity" version="1.0.1" targetFramework="monoandroid71" />
  <package id="SQLite.Net.Core-PCL" version="3.1.1" targetFramework="MonoAndroid60" />
  <package id="SQLite.Net-PCL" version="3.1.1" targetFramework="MonoAndroid60" />
  <package id="Xam.Plugin.Connectivity" version="3.0.2" targetFramework="monoandroid71" />
  <package id="Xam.Plugin.DeviceInfo" version="3.0.1" targetFramework="monoandroid71" />
  <package id="Xamarin.Android.Support.Animated.Vector.Drawable" version="25.4.0.2" targetFramework="monoandroid71" />
  <package id="Xamarin.Android.Support.Annotations" version="25.4.0.2" targetFramework="monoandroid71" />
  <package id="Xamarin.Android.Support.Compat" version="25.4.0.2" targetFramework="monoandroid71" />
  <package id="Xamarin.Android.Support.Core.UI" version="25.4.0.2" targetFramework="monoandroid71" />
  <package id="Xamarin.Android.Support.Core.Utils" version="25.4.0.2" targetFramework="monoandroid71" />
  <package id="Xamarin.Android.Support.Design" version="25.4.0.2" targetFramework="monoandroid71" />
  <package id="Xamarin.Android.Support.Fragment" version="25.4.0.2" targetFramework="monoandroid71" />
  <package id="Xamarin.Android.Support.Media.Compat" version="25.4.0.2" targetFramework="monoandroid71" />
  <package id="Xamarin.Android.Support.Transition" version="25.4.0.2" targetFramework="monoandroid71" />
  <package id="Xamarin.Android.Support.v4" version="25.4.0.2" targetFramework="monoandroid71" />
  <package id="Xamarin.Android.Support.v7.AppCompat" version="25.4.0.2" targetFramework="monoandroid71" />
  <package id="Xamarin.Android.Support.v7.CardView" version="25.4.0.2" targetFramework="monoandroid71" />
  <package id="Xamarin.Android.Support.v7.MediaRouter" version="25.4.0.2" targetFramework="monoandroid71" />
  <package id="Xamarin.Android.Support.v7.Palette" version="25.4.0.2" targetFramework="monoandroid71" />
  <package id="Xamarin.Android.Support.v7.RecyclerView" version="25.4.0.2" targetFramework="monoandroid71" />
  <package id="Xamarin.Android.Support.Vector.Drawable" version="25.4.0.2" targetFramework="monoandroid71" />
  <package id="Xamarin.Build.Download" version="0.4.7" targetFramework="monoandroid71" />
  <package id="Xamarin.Firebase.Common" version="42.1021.1" targetFramework="monoandroid71" />
  <package id="Xamarin.Firebase.Iid" version="42.1021.1" targetFramework="monoandroid71" />
  <package id="Xamarin.Firebase.Messaging" version="42.1021.1" targetFramework="monoandroid71" />
  <package id="Xamarin.Forms" version="2.3.4.270" targetFramework="monoandroid71" />
  <package id="Xamarin.GooglePlayServices.Base" version="42.1021.1" targetFramework="monoandroid71" />
  <package id="Xamarin.GooglePlayServices.Basement" version="42.1021.1" targetFramework="monoandroid71" />
  <package id="Xamarin.GooglePlayServices.Tasks" version="42.1021.1" targetFramework="monoandroid71" />
</packages>

另外,如果我使用规定的配置FirebaseApp.InitializeApp(this); 然后即使在前台也无法打开应用程序。为了解决这个问题,已经使用 google-services.json

我这样做是为了配置

var options = new FirebaseOptions.Builder()
            .SetApplicationId("1:******:*****")
            .SetApiKey("*******-a6-cEUkjxB6EqiO9zmkNcmu")
            //.SetDatabaseUrl("Firebase-Database-Url")
            .SetGcmSenderId("******")
            .Build();

            var firebaseApp = FirebaseApp.InitializeApp(this, options);
            // Generate token in background thread
            Task.Run(() => {
                var instanceID = FirebaseInstanceId.Instance;
                instanceID.DeleteInstanceId();
                var iid1 = instanceID.Token;
                var iid2 = instanceID.GetToken("*****", Firebase.Messaging.FirebaseMessaging.InstanceIdScope);
            });

【问题讨论】:

  • 在您的代码中没有发现任何明显错误,您的PushHandler 是什么?你试过官方演示Android FCM Remote Notifications吗?
  • 是的,我尝试了官方演示,但是演示在后台无法正常工作。推送处理程序具有根据数据修改推送的功能。

标签: xamarin xamarin.android firebase-cloud-messaging


【解决方案1】:

在浪费了几天的时间之后,我想出了一种在后台接收推送并处理或修改它的替代方法

public override void HandleIntent(Intent p0)

这个函数每次前台和后台都会被调用,但是杀掉这个后就不行了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-17
    • 1970-01-01
    相关资源
    最近更新 更多