Я пытаюсь реализовать Google Messaging в своем приложении и на сервере, используя Xamarin API. Нисходящие сообщения (от сервера к приложению) работают отлично, но я не могу заставить работать вышестоящие.
На стороне сервера я использую 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;
...
});
На клиенте я использую вызов API GCM Отправить сообщение:
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 имеет два метода, которые должны вызываться, когда сообщение находится в процессе отправки на сервер, DidSendDataMessage а также WillSendDataMessage, но эти методы не вызываются.
Может кто-нибудь дать мне несколько советов здесь?
Спасибо !
Я нашел проблемы.
Сначала вам нужно установить де делегат GoogleMessanging.Config в ваш класс (который наследует от ReceiverDelegate), внимание не от GoogleInstanceID.Config.
После этого нужно вызвать метод Начните() из двух библиотек,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);
}
});
}
Других решений пока нет …