上游消息 - iOS GCM

时间:2015-08-30 22:23:11

标签: php ios xamarin.ios google-cloud-messaging

我正在尝试使用Xamarin API在我的应用和服务器中实施Google Messaging。下游消息(服务器到应用程序)运行良好,但我无法让上游工作。

在服务器端,我使用PHP和XMPP库(JAXL),我可以在GCM服务器上验证并向设备发送消息。我已注册接收使用此代码的消息:

$XMPPClient->add_cb("on__message", function($stanza){ 

        echo "new message";
        $data = json_decode(html_entity_decode($stanza->childrens[0] -> text), true);
        $messageType = $data['message_type'];
        $messageId = $data['message_id']; //message id which was sent by us
        $gcmKey = $data['from']; //gcm key;
        ...
        });

在客户端,我正在使用GCM api调用 SendMessage

    public class SendClass : ReceiverDelegate
{
    public void SendMessage(string Message)
    {
        InstanceId.SharedInstance.Start(Google.InstanceID.Config.DefaultConfig);

        Service.SharedInstance.SendMessage(new NSDictionary("key", "value"), @"SenderID@gcm.googleapis.com", "Message");
    }

    public override void DidSendDataMessage(string messageID)
    {
        base.DidSendDataMessage(messageID);
    }

    public override void WillSendDataMessage(string messageID, NSError error)
    {
        base.WillSendDataMessage(messageID, error);
    }
}

当消息处于发送到服务器的过程中时,GCM API有两种方法应该被调用, DidSendDataMessage WillSendDataMessage ,但这些方法不会被调用。

有人可以在这里给我一些提示吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

我发现了问题。 首先,您需要将 GoogleMessanging.Config 的委托设置为您的类(继承自 ReceiverDelegate ),而不是来自 GoogleInstanceID.Config 。< / p>

之后,您需要从两个库中调用方法 Start() GoogleMessaging.Service Google.InstanceID 。然后魔术就完成了:

        private void StartService()
    {
        NSError ConfigError;
        Google.Core.Context.SharedInstance.Configure(out ConfigError);
        GCMSenderID = Google.Core.Context.SharedInstance.Configuration.GcmSenderID;

        SendC = new SendClass();
        Google.GoogleCloudMessaging.Config Conf = Google.GoogleCloudMessaging.Config.DefaultConfig;
        Conf.ReceiverDelegate = SendC;

        Service.SharedInstance.Start(Conf);
        Service.SharedInstance.Connect(delegate (NSError error)
        {
            if (error == null)
            {
                GetToken();
            }
        });
    }

    private void GetToken()
    {
        InstanceId.SharedInstance.Start(Google.InstanceID.Config.DefaultConfig);
        InstanceId.SharedInstance.Token(GCMSenderID, Constants.ScopeGCM, new NSDictionary(Constants.RegisterAPNSOption, DevToken,
            Constants.APNSServerTypeSandboxOption, 1), delegate (string Token, NSError error)
            {
                if (Token != null)
                {
                    OnTokenReceived(Token);
                }
            });
    }