2015-08-30 109 views
0

我試圖在我的應用和服務器中使用Xamarin API實施Google消息。下游消息(服務器到應用程序)工作得很好,但我無法獲得上游工作。上傳消息 - iOS GCM

在服務器端,我使用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"), @"[email protected]", "Message"); 
    } 

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

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

的GCM API有兩個方法應該叫當消息正在發送到服務器的過程中,DidSendDataMessageWillSendDataMessage,但這些方法不會被調用。

有人可以給我一些提示嗎?

謝謝!

回答

0

我發現了這些問題。 首先,你需要從GoogleInstanceID.Config設置德代表GoogleMessanging.Config到您的類(從繼承ReceiverDelegate),注意不要。

之後,你需要從兩個庫,GoogleMessaging.ServiceGoogle.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); 
       } 
      }); 
    }