【问题标题】:Server for GCM push notification to android in C#在 C# 中用于 GCM 向 android 推送通知的服务器
【发布时间】:2013-10-08 06:58:51
【问题描述】:

我正在开发一个使用 GCM 推送通知服务的 android 应用程序。目前我一直在创建服务器。 GCM 文档提供的指南是用 java 编写的,我不知道如何实现。经过一段时间的研究,我在github上找到了使用C#的GCMSharp

PushSharp - https://github.com/Redth/PushSharp

但到目前为止,我是创建服务器的新手,不知道如何开始。服务器实际上是一个 Web 服务,它一直在监听请求,并在收到请求后将其定向到 GCM,后者将通知推送到客户端电话?

如果是,我是否在 WCF 等 Web 服务中实现它?

【问题讨论】:

    标签: c# android wcf google-cloud-messaging


    【解决方案1】:

    您可以关注this 教程。

    服务器实际上是一个不断监听请求的Web服务吗 并在收到请求后将其定向到推送的 GCM 通知客户端电话?

    您不需要听取请求。 GCM Push 直接将任何消息推送到设备,无需任何请求。更多详情,请阅读documentation

    【讨论】:

    • 如果是这样,实现服务器有什么用?它在文档中写道:您必须实现的第 3 方应用程序服务器。此应用程序服务器通过所选的 GCM 连接服务器将数据发送到支持 GCM 的 Android 应用程序。我们实现的服务器不就是发送消息的那个吗?
    • 您在后端需要做的就是在用户注册到 GCM 服务器时从 android 设备收集设备令牌并将它们保存在您的数据库中。当您想要推送消息时,您可以要求 Google Server 使用设备令牌和您的 Api 密钥发送您的消息。
    • 哦!仅用于注册 deviceID 和检索 deviceID 的服务器也是如此。而对于从设备 A 发送到设备 B,设备 A 将从服务器获取设备 B 的 ID,然后使用 GCM 将通知推送到设备 B?
    • GCM 不用于从设备 A 向设备 B 发送消息。它用于将消息从服​​务器推送到设备。但是,您可以使用 GCM 构建消息传递系统。但它并不有效和高效。您可以使用 XMPP Server 将消息从设备 A 发送到设备 B。
    【解决方案2】:

    我已经在另一个帖子上回答了这个问题,我在这里重复一遍。代码看起来有点长,但它可以工作。通过在 C# 项目中实现以下代码,我在挣扎 2 天后刚刚向我的手机发送了推送通知。我提到了一个关于这个实现的链接,但找不到它在这里发布。所以将与您分享我的代码。如果您想在线测试通知,您可以访问此link

    注意:我有硬编码的 apiKey、deviceId 和 postData,请通过 您请求中的 apiKey、deviceId 和 postData 并将它们从 方法体。如果你也想传递消息字符串

    public string SendGCMNotification(string apiKey, string deviceId, string postData)
    {
        string postDataContentType = "application/json";
        apiKey = "AIzaSyC13...PhtPvBj1Blihv_J4"; // hardcorded
        deviceId = "da5azdfZ0hc:APA91bGM...t8uH"; // hardcorded
    
        string message = "Your text";
        string tickerText = "example test GCM";
        string contentTitle = "content title GCM";
        postData =
        "{ \"registration_ids\": [ \"" + deviceId + "\" ], " +
          "\"data\": {\"tickerText\":\"" + tickerText + "\", " +
                     "\"contentTitle\":\"" + contentTitle + "\", " +
                     "\"message\": \"" + message + "\"}}";
    
    
        ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateServerCertificate);
    
        //
        //  MESSAGE CONTENT
        byte[] byteArray = Encoding.UTF8.GetBytes(postData);
    
        //
        //  CREATE REQUEST
        HttpWebRequest Request = (HttpWebRequest)WebRequest.Create("https://android.googleapis.com/gcm/send");
        Request.Method = "POST";
        Request.KeepAlive = false;
        Request.ContentType = postDataContentType;
        Request.Headers.Add(string.Format("Authorization: key={0}", apiKey));
        Request.ContentLength = byteArray.Length;
    
        Stream dataStream = Request.GetRequestStream();
        dataStream.Write(byteArray, 0, byteArray.Length);
        dataStream.Close();
    
        //
        //  SEND MESSAGE
        try
        {
            WebResponse Response = Request.GetResponse();
            HttpStatusCode ResponseCode = ((HttpWebResponse)Response).StatusCode;
            if (ResponseCode.Equals(HttpStatusCode.Unauthorized) || ResponseCode.Equals(HttpStatusCode.Forbidden))
            {
                var text = "Unauthorized - need new token";
            }
            else if (!ResponseCode.Equals(HttpStatusCode.OK))
            {
                var text = "Response from web service isn't OK";
            }
    
            StreamReader Reader = new StreamReader(Response.GetResponseStream());
            string responseLine = Reader.ReadToEnd();
            Reader.Close();
    
            return responseLine;
        }
        catch (Exception e)
        {
        }
        return "error";
    }
    
    public static bool ValidateServerCertificate(
    object sender,
    X509Certificate certificate,
    X509Chain chain,
    SslPolicyErrors sslPolicyErrors)
    {
        return true;
    }
    

    您可能不熟悉 apiKey、deviceId 之类的词。别担心,我会解释它们是什么以及如何创建它们。

    apiKey
    什么&为什么:这是向GCM服务器发送请求时使用的密钥。
    如何创建:Refer this post

    deviceId
    什么&为什么:这个ID也称为RegistrationId。这是用于识别设备的唯一 ID。当你想发送一个 通知您需要此 ID 的特定设备。
    如何 create:这取决于您如何实现应用程序。对于科尔多瓦 我用了一个简单的pushNotification Plugin 你可以简单地创建一个 deviceId/RegistrationId 使用这个插件。为此,您需要拥有 一个 senderId。 Google 如何创建 senderId 真的很简单 =)

    如果有人需要帮助,请发表评论。

    快乐编码。
    -Charitha-

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多