GCM(谷歌云推送)客户端服务器端开发全指南(服务器篇)

今天我们按照之前所说的步骤介绍GCM云推送服务端的开发,因为服务端的开发比客户端的开发较简单,遵从由易到难,一步一步攻破的原则,所以我先于客户端讲服务端的开发,话不多说,让我们开始吧!

首先我们依旧来到首页

这次我们点击指南,进入到GCM开发Overview,这里概括了GCM客户端服务器端开发流程。

根据以下的流程图我们不难看出服务端和GCM的通信方式有两种

1.Http协议

2.Xmpp协议

Xmpp协议常用于双向通信,我们这里暂时不需要,因此果断选择Http协议来开发。

英语比较好的朋友可以看一下key的概念,这里大概介绍了google是怎么样通过key鉴别发送者和接收者的。

不想了解的朋友只需知道我们要用到

1.Sender ID

2.API Key

3.Registration Token

就行了,然后点击“HTTP Connection Server”开始我们的编程

既然选择了http协议通信,那你必须了解http协议相关知识,这里不再阐述,有兴趣的朋友可以来这里了解下推荐入手《HTTP权威指南》。

我们接着来看一下google发布的http service开发指南

根据上诉文章我们需要:

-设置http的链接为:https://gcm-http.googleapis.com/gcm/send

-设置http头部参数:Authorization: key=YOUR_API_KEY,

-设置Content-Type:如果发送的消息是json格式,就使用Content-Type: application/json for JSON; 如果是纯文本(比如说一条String字符串)就使用Content-Type:application/x-www-form-urlencoded;charset=UTF-8

其实他这里可能漏了两个参数,一个是http方法 Method 和 Sender ID,Method 是使用http一般都要设置的参数,我们这里使用“post”方法,Sender ID就真的是一个坑了,一开始楼主并不知道有这个参数,怎么发消息都发布出去,问了下有经验的大神才知道Sender ID也要给上才行的。

然后这里说一下,服务端的开发我选择使用.net,不得不说,.net对于一些大型项目的支持真的很好,就是VS比较重量级,不是处处可以布置,也许你会喜欢使用java来写,但是个人感觉面向对象编程语言的逻辑是相同的,楼主一开始学习的是java,然后因为需求兼顾了.net的开发,再后来使用的objective-c,使用起来逻辑并不会出现冲突的情况,顶多就是API和语法个别地方有些不一样,使用起来不是很熟手而已。所以看了我用.net写的服务端程序,你一定很快就能用java copy出来的。

接着就是激动人心的时刻——————上代码!

//建立一个http链接并设置http头部参数
 WebRequest gcmRequest;
 gcmRequest = WebRequest.Create("https://gcm-http.googleapis.com/gcm/send");
 gcmRequest.Method = "post";
 gcmRequest.ContentType = "application/json";
 gcmRequest.Headers.Add(string.Format("Authorization: key={0}", API_KEY));
 gcmRequest.Headers.Add(string.Format("Sender: id={0}", SENDER_ID));

好了,我们接着往下看

这里介绍的是发送消息的格式,分别是json和纯文本的格式,我们来看看json的

{ "collapse_key": "score_update",
  "time_to_live": 108,
  "delay_while_idle": true,
  "data": {
    "score": "4x8",
    "time": "15:16.2342"
  },
  "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
}

参数按照他所说的那样设,要发送的消息写在data内,然后又是一个坑爹的地方“to”,他这个to不知是不是新版本才用到的,我使用的时候他总返回400错误给我,google了一下,把这里的“to”改成“registration_ids”就可以了,修改后的json

{ "collapse_key": "score_update",
  "time_to_live": 108,
  "delay_while_idle": true,
  "data": {
    "message": "Hi lady",
    "time": "15:16.2342"
  },
  "registration_ids" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
}

好,有格式后我们就可以开始写Http的body部分了

 //把封装好的json打包成byte并以流的形式发送出去
 var postData = b.ToString();
 System.Diagnostics.Debug.WriteLine(postData);
 Byte[] byteArray = Encoding.UTF8.GetBytes(postData);
 gcmRequest.ContentLength = byteArray.Length;
 Stream dataStream = gcmRequest.GetRequestStream();
 dataStream.Write(byteArray, 0, byteArray.Length);
 dataStream.Close();

写好body后就可以发送出去了

 //建立一个接收链接接收返回的数据
 WebResponse tResponse = gcmRequest.GetResponse();
 dataStream = tResponse.GetResponseStream();
 StreamReader tReader = new StreamReader(dataStream);
 String sResponseFromServer = tReader.ReadToEnd();

发送出去我怎么知道他是否成功能?让我们继续看下去

根据说明,返回的是一组json数据,具体数据代表什么呢?我们直接去看他们返回的代码说明,就是Downstream message error response codes

来到新的页面后直接去看返回代码表

这里我简单说下几个常见的错误:

1.Missing Registration Token 丢失注册ID

-这个错误一般是你的注册ID格式错误,或者在json上没加双引号,逗号之类。

2.Invalid Registration Token 无效的注册ID

-这个错误一般是你ID有误,少字母,多一横之类的。

3.Unregistered Device 没有注册的设备

-这个错误是说你要发送的android手机没有在google service注册过

4.Authentication Error 认证错误

-这里一般会出现在你的json头参数Authentication 设置错误的时候出现。

5.Mismatched Sender 不匹配的Sender ID

-Sender ID有误

6.Invalid JSON JSON格式有误

好了,以上几个问题是我常遇到的,给大家做个参考。

服务器端功能的代码就这样写完了,是不是很简单?

你可以把代码写到webservice上去,这样就能随时调用了。为了方便,我直接做个简单的页面来实现这个功能,在源码上有,截个实现的图片先

这里返回了Invalid Registration,就是说“基友A,舍友B,多个ID英文逗号隔开”是无效的ID,这也是理所当然的,让我们来个成功的

成功的话他会返回成功ID,就不会有上面的错误代码出现。

以下是功能所有代码:

    public partial class WebForm1 : System.Web.UI.Page
    {
        private string API_KEY = "你服务器的api——key";
        private string SENDER_ID = "你的senderID";

        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            var message = TextBox1.Text;
            var regID = TextBox2.Text;
            String[] regIDAll = new String[] { };
            regIDAll = regID.Split(‘,‘);

            //对ID进行双引号的添加
            if (regIDAll.Length > 1)
            {
                regID = "";
                for (int i = 0; i < regIDAll.Length; i++)
                {
                    if (i == 0)
                    {
                        regIDAll[i] = "\"" + regIDAll[i] + "\"";
                    }
                    else
                    {
                        regIDAll[i] = ",\"" + regIDAll[i] + "\"";
                    }
                    regID = regID + regIDAll[i];
                }
            }
            else
            {
                regID = "\"" + regID + "\"";
            }

            //建立一个http链接并设置http头部参数
            WebRequest gcmRequest;
            gcmRequest = WebRequest.Create("https://gcm-http.googleapis.com/gcm/send");
            gcmRequest.Method = "post";
            gcmRequest.ContentType = "application/json";
            gcmRequest.Headers.Add(string.Format("Authorization: key={0}", API_KEY));
            gcmRequest.Headers.Add(string.Format("Sender: id={0}", SENDER_ID));

            //封装发送消息参数成json
            StringBuilder b = new StringBuilder();
            b.Append("{");
            b.Append("\"collapse_key\":\"score_update\",");
            b.Append("\"time_to_live\": 108,");
            b.Append("\"delay_while_idle\": true,");
            b.Append("\"data\": {");
            b.Append("\"message\": \"" + message + "\",");
            b.Append("\"time\": \"" + System.DateTime.Now.ToString() + "\",");
            b.Append(" }");
            b.Append("\"registration_ids\": [");
            b.Append(regID);
            b.Append("]");
            b.Append("}");

            //把封装好的json打包成byte并以流的形式发送出去
            var postData = b.ToString();
            System.Diagnostics.Debug.WriteLine(postData);
            Byte[] byteArray = Encoding.UTF8.GetBytes(postData);
            gcmRequest.ContentLength = byteArray.Length;
            Stream dataStream = gcmRequest.GetRequestStream();
            dataStream.Write(byteArray, 0, byteArray.Length);
            dataStream.Close();

            //建立一个接收链接接收返回的数据
            WebResponse tResponse = gcmRequest.GetResponse();
            dataStream = tResponse.GetResponseStream();
            StreamReader tReader = new StreamReader(dataStream);
            String sResponseFromServer = tReader.ReadToEnd();

            //直接在label显示返回的结果
            Label1.Text = "result: " + sResponseFromServer;

            tReader.Close();
            dataStream.Close();
            tResponse.Close();
        }
    }
}

以下是我页面的代码:

<!--注意!!这是APS.NET的代码,要在html文件上运行要稍加修改!!-->

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <link href="css/AndroidPush.css" rel="Stylesheet" type="text/css" />
</head>
<body>
<form id="Form1" runat=server>
    <div class="t-box">
        <div class="box_1">
            <div class="t-con">
                <img src="logo.png" alt="" />
                <div class="abs-box">
                    <div class="con-box">
                        <div class="con">
                            <asp:TextBox ID="TextBox1" runat="server" TextMode="MultiLine" Wrap=true Text="这里输入发送的消息"></asp:TextBox>
                            <asp:TextBox ID="TextBox2" runat="server" TextMode="MultiLine" Wrap=true Text="这里输入设备在GCM注册的ID,多个注册ID逗号分开"></asp:TextBox>
                            <div class="result">
                                <asp:Label ID="Label1" runat="server" Text="result:"></asp:Label>
                            </div>
                            <div class="operation"><asp:Button ID="Button1" runat="server" Text="Send"
                                    onclick="Button1_Click" /></div>

                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    </form>
</body>
</html>

最后是万众期待的源码!!!!!

源码在此,请叫我雷锋

时间: 2024-10-17 04:40:04

GCM(谷歌云推送)客户端服务器端开发全指南(服务器篇)的相关文章

自有账户体系对接百度云推送必须要弄懂的问题

 同一个设备上的同一个APP多次绑定返回的user_id相同,channel_id也相同. 同一个APP在不同的设备上绑定user_id是不相同的,channel_id也不相同. 同一台设备对应唯一一个channel_id.(多个APP共用一条通道),所以在同一台设备上的多个APP绑定时,它们的channel_id是相同的. 同一台设备上的不同APP对应不同的user_id. 不同设备上的相同APP对应不同的一对[channel_id, user_id] 怎么让自定义账户体系的id跟推送账户

跨平台移动开发phonegap/cordova 3.3全系列教程-百度云推送push

消息推送-百度push 选择百度云推送理由:专业.稳定.免费(Google GCM在国内有时无法正常使用) 打开网址,注册开发者帐号,登入. http://developer.baidu.com/bae/ 此处API key与Secret Key后面要用到,可以先复制到记事本中备用. 下载,在手机上安装apk客户端,打开PushDemo. 然后在开发者中心测试推送消息 如图: 此时手机端会收到推送的消息 如何集成到phonegap/cordova 添加插件cordova plugin add c

Amazon SNS移动推送更新——新增百度云推送和Windows平台支持

Amazon SNS(Simple Notification Service)是一种基于云平台的消息通知和推送服务.SNS提供简单的 Web 服务接口和基于浏览器的管理控制台让用户能够简易设置.运行并从云中发送消息通知和推送服务.它为开发人员提供高度可扩展.灵活并且经济高效的从应用发布消息的功能,并立即将这些消息推送给订阅者或其他应用程序. SNS主要提供两大类服务:一种是消息通知服务(Notification),其主要是通过主题/订阅的模式,用短信(SMS).邮件.HTTP/S请求.SQS队列

百度云推送初尝试

今晚(不对,具体应该说是昨晚,哈哈),给师弟师妹开了个分享会,然后打算把他们分到各个师兄那边,让师兄带着他们去学.然后,师妹跑过来问我说,我这边有什么优势,想了想,这个得怎么说啊.然后,就糊弄她说:没优势..(注孤身的节奏啊),然后师妹说她要跑去另一个师兄那边,我问她为什么,然后她跟我说:那边可以学到百度云推送(怪我当时没学,唉浪费了大好机会,哈哈) 想到就因为这么一个原因,就痛失师妹,我不服!! 然后,有了下文. 1.进入官网:http://push.baidu.com/ 2.找到文档中心:h

云推送 和 微信多客服平台

百度云推送流程: 百度云推送服务支持三种推送类型:通知.消息及富媒体:支持向所有用户.根据标签分类向特定用户群体.向单个用户和基于地理位置推送消息:支持更多自定义功能(如自定义内容.后续行为.样式模板等):提供用户信息及通知消息统计信息,方便开发者进行后续开发及运营. 消息:目前仅支持Android平台.应用内推消息,不会有界面的提示. 通知:会有标题.内容,界面提示. 名称解释: API Key : 应用标识,终端上的绑定和服务端推送消息时都要用到. Secret Key : 应用私钥,服务端

App之百度云推送

下载最新的Android SDK压缩包并解压,在新建工程或已有工程中增加百度云推送功能. 我下载的是 ,里面有一个同名的文件夹,文件夹中有 导入云推送jar包和so文件: 将解压后的libs文件夹中所有文件拷贝到您的工程的libs文件夹中.如果您的工程中没有其他的.so文件,建议只拷贝armeabi文件夹.如果您的工程中还使用了其他的.so文件,只需要拷贝对应目录下的.so文件即可.如果你使用的Android开发环境是Android Stutio,在工程中“src/main”目录中新建名为jni

极光推送客户端和服务端相关文档

一.客户端: 二.服务端: 1.极光消息推送服务器端开发实现推送(上): http://blog.csdn.net/dawanganban/article/details/18770727?utm_source=tuicool 2.极光消息推送服务器端开发实现推送(下): http://blog.csdn.net/dawanganban/article/details/19029667?utm_source=tuicool 3.极光推送 使用实例 (一)服务端: http://blog.csdn

Android项目集成百度云推送,无法回调到PushMessageReceiver中onBind方法的问题与解决

今天准备集成百度云推送,因为据朋友说,百度云推送作为android的推送还是相对稳定的. 开发工具:android studio 1.2.1.1  系统:Mac os x 10.10.3 立即下载了最新的V4.4.1版本的百度云推送demo,仔仔细细按照文档一步一步做完.但是测试的时候,就是回调不了. 最后在百度云应用管理详情中,看见了“生成快速示例的按钮”,生成之后安装,发现可以正常使用.于是开始研究这个快速示例,最后发现只有一处不同:armeabi/libbdpush_V2_2.so和mip

使用【百度云推送】第三方SDK实现推送功能详解

之前介绍过如何使用shareSDK实现新浪微博分享功能,今天介绍如何使用百度云推送SDK实现Android手机后台推送功能. 运行效果如下 第一步,如果使用百度的SDK,当然要先成为百度的开发者啦,这个就不详述了.成为开发者之后,我们要建立一个应用,如下图所示 第二步,创建好应用之后,我们点击开方者服务管理,进入工程管理页面,然后点击左侧云推送,进入云推送功能页面,具体如下图 进入云推送详细页面之后,我们点击推送设置,设置好我们的应用的包名,然后点击快速实例,将系统给我们产生的示例代码下载下来