here で説明されているように、GCM の CCS を使用して Android デバイスに通知を送信するためのサードパーティ サーバー .NET アプリケーションを作成しようとしています。そして、配達の領収書を受け取る機能を使いたいです。agsXMPPライブラリ
を使用して簡単なコンソール アプリを作成しました。私のアプリケーションは、フラグ"delivery_receipt_requested": trueを使用して GCM にメッセージを送信し、GCM サーバーから ACK メッセージを受信します。このメッセージがターゲット デバイスに配信されていることがわかりますが、配信受領メッセージが届きません。更新:デバイスからアップストリーム メッセージを受信できます。最後に、領収書を受け取ることができますが、時々機能します。それは本当にとても不安定な機能ですか?
これは私のテストアプリです:
using System.Threading; using agsXMPP; using agsXMPP.protocol.client;
class Program
{
private static XmppClientConnection xmpp;
static void Main(string[] args)
{
xmpp = new XmppClientConnection
{
UseSSL = true,
UseStartTLS = false,
Server = "gcm.googleapis.com",
ConnectServer = "gcm.googleapis.com",
Port = 5235,
Password = "my pwd",
Username = "my senderId"
};
xmpp.OnAuthError += OnAuthError;
xmpp.OnLogin += xmpp_OnLogin;
xmpp.OnError += OnError;
xmpp.OnMessage += new MessageHandler(xmpp_OnMessage); //I expected delivery receipt here
xmpp.Open();
Console.WriteLine("Press any key to stop ...");
Console.ReadLine();
}
static void xmpp_OnLogin(object sender)
{
Console.WriteLine("LoggedOn");
string msg = string.Format
("<message id=\"\">" +
"<gcm xmlns=\"google:mobile:data\">" +
"{{" +
"\"to\":\"{1}\"," +
"\"message_id\":\"m-{0}\"" +
"\"data\":{{\"somedata\":\"\"}}" +
"\"time_to_live\":600," +
"\"delay_while_idle\": true," +
"\"delivery_receipt_requested\": true}}" +
"</gcm>" +
"</message>", Guid.NewGuid().ToString(),
"device_registartion_id");
xmpp.Send(msg);
}
static void xmpp_OnMessage(object sender, Message msg)
{
//ACK or NACK messages handle here and I expect Delivery receipt here too
Console.WriteLine("xmpp_OnMessage: " + msg.InnerXml);
if (msg.InnerXml.Contains("myapp.name")) //delivery receipt or upstream message
{
//send an ACK back with message ID
string msgAck = string.Format
("<message id=\"\">" +
"<gcm xmlns=\"google:mobile:data\">" +
"{{" +
"\"to\":\"{1}\"," +
"\"message_id\":\"{0}\"" +
"\"message_type\": \"ack\"}}" +
"</gcm>" +
"</message>", msg.Id, "device_registartion_id");
xmpp.Send(msgAck);
}
return;
}
static void OnAuthError(object sender, agsXMPP.Xml.Dom.Element e)
{
Console.WriteLine("OnAuthError: " + e.InnerXml);
}
static void OnError(object sender, Exception ex)
{
Console.WriteLine("OnError: " + ex.Message);
}
}