1

我试图弄清楚如何获得 Google GCM 响应(即 NotRegistered 错误),以便我可以从用户帐户中删除 GCM 信息。

GCM 架构概述(关于从 GCM 注销设备)中,他们声明“只有当 GCM 服务器尝试向设备发送消息并且设备回答应用程序已卸载或没有广播时,它才会被注销接收器配置为接收 com.google.android.c2dm.intent.RECEIVE 意图。此时,您的服务器应将设备标记为未注册(服务器将收到 NotRegistered 错误)。

在 PushSharp for Mono for Android 中;当您尝试向用户发送消息时如何获得 Google 响应,而您却收到来自 Google 的“未注册错误”?要发送消息,我有以下代码:

    var push = new PushService();

    // setup channel settings: sender id, access key, registration package name
    var settings = new GcmPushChannelSettings(<>, <>, <PACKAGE>);
    push.StartGoogleCloudMessagingPushService(settings);
    var android = NotificationFactory.AndroidGcm();
    android = android.ForDeviceRegistrationId(GCM_Id); 
        push.QueueNotification(android.WithJson("{\"alert\":\"" + message + "\",\"URL\":\"" + URL + "\"}")); 

如何从 Google 获得响应以了解 1. 消息通过 2. 应用程序已卸载或 3. 收到 NotRegistered 错误,以便我可以从用户帐户中删除 GCM Id?

期待我能得到任何帮助。上面的代码使用 PushSharp for Mono for Android (MonoDroid),它可以完美地向用户发送消息。PushSharp非常棒,我强烈推荐它通过 GCM 向您的用户发送消息。

4

1 回答 1

1

您需要订阅附加EventsPushService.

然后,您将能够在事件处理程序中接收响应。

        //Create our service    
        PushService push = new PushService();

        //Wire up the events
        push.Events.OnDeviceSubscriptionExpired += new Common.ChannelEvents.DeviceSubscriptionExpired(Events_OnDeviceSubscriptionExpired);
        push.Events.OnDeviceSubscriptionIdChanged += new Common.ChannelEvents.DeviceSubscriptionIdChanged(Events_OnDeviceSubscriptionIdChanged);
        push.Events.OnChannelException += new Common.ChannelEvents.ChannelExceptionDelegate(Events_OnChannelException);
        push.Events.OnNotificationSendFailure += new Common.ChannelEvents.NotificationSendFailureDelegate(Events_OnNotificationSendFailure);
        push.Events.OnNotificationSent += new Common.ChannelEvents.NotificationSentDelegate(Events_OnNotificationSent);
        push.Events.OnChannelCreated += new Common.ChannelEvents.ChannelCreatedDelegate(Events_OnChannelCreated);
        push.Events.OnChannelDestroyed += new Common.ChannelEvents.ChannelDestroyedDelegate(Events_OnChannelDestroyed);

然后,在您的事件处理程序中,您可以检查异常并确定是否应该从用户帐户中删除设备 ID。

        static void Events_OnNotificationSendFailure(Common.Notification notification, Exception notificationFailureException)
        {
            // Remove device id 
            Console.WriteLine("Failure: " + notification.Platform.ToString() + " -> " + notificationFailureException.Message + " -> " + notification.ToString());
        }
于 2012-11-08T21:03:45.867 回答