xamarin android推送通知只能工作一次

时间:2017-02-04 12:05:15

标签: android xamarin xamarin.android

我正在开发一个Android应用程序,我按照这个link使用谷歌推送通知
我的问题是该应用程序第一次启动时,推送通知工作没问题,但是当我重启我的应用程序时,推送通知停止工作,我无法收到通知。

这是我的代码:

[Service(Exported = false)]
class RegistrationIntentService : IntentService
{
    static object locker = new object();

    public RegistrationIntentService() : base("RegistrationIntentService") { }


    protected override void OnHandleIntent(Intent intent)
    {
        try
        {
            Log.Info("RegistrationIntentService", "Calling InstanceID.GetToken");
            lock (locker)
            {
                var instanceID = InstanceID.GetInstance(this);
                var token = instanceID.GetToken(
                    "my_id", GoogleCloudMessaging.InstanceIdScope, null);

                Log.Info("RegistrationIntentService", "GCM Registration Token: " + token);
                SendRegistrationToAppServer(token);
                Subscribe(token);
            }
        }
        catch (Exception e)
        {
            Log.Debug("RegistrationIntentService", "Failed to get a registration token");
            return;
        }
    }


    void SendRegistrationToAppServer(string token)
    {
     // some code
    }

    void Subscribe(string token)
    {
        var pubSub = GcmPubSub.GetInstance(this);
        pubSub.Subscribe(token, "/topics/global", null);
    }
}


[Service(Exported = false), IntentFilter(new[] { "com.google.android.c2dm.intent.RECEIVE" })]
public class MyGcmListenerService : GcmListenerService
{
    public override void OnMessageReceived(string from, Bundle data)
    {
        Log.Debug("MyGcmListenerService", "From:    " + from);
        Log.Debug("MyGcmListenerService", "Message: " + message);
    }
}


[Service(Exported = false), IntentFilter(new[] { "com.google.android.gms.iid.InstanceID" })]
class MyInstanceIDListenerService : InstanceIDListenerService
{
    public override void OnTokenRefresh()
    {
        var intent = new Intent(this, typeof(RegistrationIntentService));
        StartService(intent);
    }
}

我用这种方法发送通知

public static void SendNotification(string MESSAGE, string token)
    {
        var jGcmData = new JObject();
        var jData = new JObject();
        jData.Add("message", MESSAGE);

        jGcmData.Add("to", token);
        jGcmData.Add("data", jData);

        var url = new Uri("https://gcm-http.googleapis.com/gcm/send");
        try
        {
            using (var client = new HttpClient())
            {
                client.DefaultRequestHeaders.Accept.Add(
                    new MediaTypeWithQualityHeaderValue("application/json"));

                client.DefaultRequestHeaders.TryAddWithoutValidation(
                    "Authorization", "key=" + API_KEY);

                System.Threading.Tasks.Task.WaitAll(client.PostAsync(url,
                    new StringContent(jGcmData.ToString(), Encoding.Default, "application/json"))
                        .ContinueWith(response =>
                        {
                            Console.WriteLine(response);
                            Console.WriteLine("Message sent: check the client device notification tray.");
                        }));
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("Unable to send GCM message:");
            Console.Error.WriteLine(e.StackTrace);
        }

    }


你有什么想法吗?

2 个答案:

答案 0 :(得分:1)

这是在模拟器中吗?我在模拟器中遇到了这个问题,并通过关闭选项来修复它,以便在部署之间保留应用程序数据/缓存。在Visualstudio中,它是Tools-> Options-Xamarin-> Android Options。现在我在每个部署上都获得了一个新令牌,它始终有效。

为什么会发生这种情况我还没弄明白。也许这是一个安全功能,不同版本的应用程序不能使用相同的?

答案 1 :(得分:0)

Xamarin的官方文档中

“如果您强制关闭应用程序,则FCM将停止传递通知。Android会防止后台服务广播无意或不必要地启动已停止的应用程序的组件。(有关此行为的更多信息,请参阅在已停止的应用程序上启动控件。)< strong>因此,有必要在每次运行该应用程序时手动将其卸载,并从调试会话中停止该应用程序–这将迫使FCM生成新令牌,以便继续接收消息。“ / p>

https://docs.microsoft.com/en-us/xamarin/android/data-cloud/google-messaging/remote-notifications-with-fcm?tabs=windows