小米push

来源:互联网 发布:七微南风知我意2微盘 编辑:程序博客网 时间:2024/06/10 05:59

最近在看小米push的SDK,今天总结总结。

小米为什么要开发push

这个要从苹果iPhone的push谈起。

1.IOS的push原理

我们知道iPhone的APP从前台退到后台,进程就处于挂起状态了,不再运行了,流量也不再消耗了。那么,如果诸如微信、QQ、微博等有消息传来,那岂不是APP要损失很多用户,而且用户无法收到实时的消息,那谁还用iPhone!so,Apple想到了一种方式:iPhone的IOS保持一个跟Apple服务器的长连接,当有新的消息时,由Apple服务器push到手机。这里说的Apple服务器其实就是APNS(Apple Push Notification Service)。这个推送流程如下图所示:
这里写图片描述

上面描述的Applepush过程只是感性的描述了下,下面根据上图详细说明。
有一点需要明确的是:不是IOS上的APP发起的推送,是上图中的Provider。这个Provider是指APP的后端服务(就是常说的前端开发、后端开发的那个后端开发工程师写的代码)。
当你在你的手机APP上@了某个好友,或者评论了他的某个状态,那么Provider就会知道,push一条消息给APNS,如果你的好友是在线状态的,那么APNS就会通过它与iPhone之间建立的那个长连接将消息推给IOS,IOS再分发给相应的APP(在 IOS上,所有应用共用一条 PUSH 通道),这样你的好友就会收到你的消息了。

2.Android的push原理及缺点
IOS都有push了,Android也不能没有吧。于是,强大的Google也搞了一套类似APNS的东西,取名叫:GCM(Google Cloud Messaging)。但是很可惜国内的用户大多数时间都无法链接到这个神奇的服务器。而且,Google是在Android 2.2才开始实现的,也就是说Android 2.2之前的是无法收到push的。
这可如何是好?
Android可不像IOS那样,APP退出前台之后就不可以运行了。APP在Android上退到后台之后依然还可以运行。但是,这会产生一个问题,如果内存满了怎么办?OK,Android会关掉一些后台进程,一般都是什么邮件服务之类的吧,我的小辣椒就是那样,内存不足了就给我关掉邮件服务。但是,谁知道哪天就把你的APP给干掉了呢?!
先说APP在Android的后台运行,那么Android开发工程师,就可以大展神通了。一般通过一种叫做XMPP[1](广泛应用于即时消息,不要想QQ、微信使用的就是这玩意,它们貌似不是,它们好像制定了自己的协议)的东西来实现。如果后端服务器给APP推送了消息,那么Android开发工程师完全可以控制这条消息怎么显示,弹窗也行。Android是多么开放啊。但是从另一个角度来看,Android为了他的开发,都付出了哪些代价呢?
(1)后台运行,占用内存,怪不得Android手机这么慢。
(2)后台运行,消耗流量,怪不得流量用的这么快。
(3)后台运行,使用CPU,耗电,浪费能源。北京,挺好吸的。
也许你不关心这些东西。我内存大,我流量多,我不在乎电费,我土豪。如果,你不小心通过某流氓软件,“一键”清理了。。。你将永远收不到push了。
所以,小米push,这种类似于APNS的系统级push就应运而生了。而且是免费的。在 MIUI 平台上,所有应用共用一条 PUSH 通道。即使你的APP在后台被杀死了,你依然可以收到push。但是,现在小米push有一些小问题,但是瑕不掩瑜哈。只是记录一下:
小米push无法定制消息的展示方式。
这里写图片描述

小米push原理

小米的push原理跟Apple、Google的差不多,这里有一张Google较为详细的图,就根据这张图解释了。如下图:

这里写图片描述

1.在小米开放平台注册开发账号
这里写图片描述

通过小米开放平台(http://dev.xiaomi.com/),我们注册我们自己的应用之后就可以使用小米push服务了。这个过程包括:
(1)创建开发者账号,注册自己的应用。
(2)小米push服务器返回AppId, AppKey,AppSecret
(3)将AppId和AppKey给Android开发工程师,在客户端SDK初始化时使用,用来标识应用。也就是说,只有拿着这个AppId和AppKey的客户端才能跟小米服务器通信。
代码如下:

public static final String APP_ID = "your appid";public static final String APP_KEY = "your appkey";

(4)将AppSecret给push server开发工程师(或者Android应用的后端开发工程师)。AppSecret是服务器端的身份标识,在使用Server SDK通过小米push服务器向客户端发送消息时使用。也就是说,只有拿着这个AppSecret的后端开发工程师才能跟小米服务器通信。
代码如下:

private static final String APP_SECRET_KEY = "your app sercret key";

2.注册APP
这里写图片描述
(1)向小米push服务器发送请求,注册APP
代码如下:

MiPushClient.registerPush(this, APP_ID, APP_KEY);

这个registerPush返回的结果是一个RegID(其实还有其他信息)。RegID 是一个设备在小米推送服务中的唯一标识。这个RegID在IOS就是token。
(2)小米push服务器返回RegID(即 token)
在(1)中返回的RegID可以从DemoMessageReceiver的onCommandResult方法中的MiPushCommandMessage对象参数中获取。
代码如下:

    public void onCommandResult(Context context, MiPushCommandMessage message) {        String command = message.getCommand();        List<String> arguments = message.getCommandArguments();        String cmdArg1 = ((arguments != null && arguments.size() > 0) ? arguments.get(0) : null);        String cmdArg2 = ((arguments != null && arguments.size() > 1) ? arguments.get(1) : null);        if (MiPushClient.COMMAND_REGISTER.equals(command)) {            if (message.getResultCode() == ErrorCode.SUCCESS) {                mRegId = cmdArg1;            } else {                log = context.getString(R.string.register_fail);            }        }        ....   }

(3)将RegID存放在APP后端服务器中,用于APP后端服务器向小米push服务器推送消息时标识目标设备。
在项目中,我们可以将这个token存放在redis中。如

redis-cli> set uid token

3.APP后端服务器推送消息给Android APP
这里写图片描述
(1)APP后端服务器拿着要发送的消息msg和token向小米push服务器发起请求。
代码如下:

Sender sender = new Sender(APP_SECRET_KEY);sender.send(message, token, retries); //message表示你要传递的消息,token就是刚才返回的唯一标识一个设备的RegID,retries为发送失败之后重试的次数。

(2)小米push服务器向Android APP发送消息

至此,小米push的流程就说完了。

小米push的特性

1.通知分类设置
(1)小米push在通知栏显示时,相同类型的消息会产生覆盖,即新的消息会替换旧的相同类型的消息,而不同类型的消息可以共存。小米现在支持最多可以有 5 类通知并存。
(2)topic用来做广播消息。不同手机上的同一个app可以订阅同一个主题topic。通过发送主题消息的API,即可同时向所有订阅该主题的客户端发送消息。
比如,您有一个新闻类的app,可以自定义“财经”、“体育”、“科技“等主题;对于经常阅读财经新闻的用户,您可以帮用户订阅“财经”类主题,当有新的财经要闻发生时,直接通过主题推送该新闻给所有订阅该主题的用户。
再比如,您有一个O2O的APP,如美团,可以定义用户的地理位置主题,如“北京”、“上海”、“广州”等主题,当北京的商户有优惠活动时,可以通过主题推送该优惠活动给“北京”的用户,而“上海”、“广州”的用户不受到任何影响。
(3)开发者可以在不同设备上设置同一个userAccount。然后使用Server
SDK给该userAccount发送消息;此时,所有设置了该userAccount的设备都可以收到消息。
2.消息有效期设置
小米推送的默认有效期是14 天。也就是说,如果用户在14天内都没有上线,则14天之后用户将永远收不到消息。如果没有设置有效期,默认也是14天。
当然,一些新闻类的push,为了保证“新鲜”性,则需要设置一个有效期,如1天。如果用户在1天之内没有上线,则不会再收到消息。——这很合理,新闻就是要“保鲜”!
3.设置免打扰
有可能用户会设置免打扰,即,“我在某某一段时间内是不想被打扰的,不想收到push消息”。此时发出的消息会被保留在服务端,当用户具备接收条件且消息尚处于有效期内时, 用户将会收到被保留的消息。
4.设置别名
现在的应用一般都会有一个类似于userID的东西,小米push服务器通过userID就可以知道给谁发送push(难道小米push服务器保存了一个token、userID的K-V?)。通过这个功能,APP后端服务区不用再浪费存储空间来存放token。

小米push的限制

1.现在小米没有限制发送频率,但是以后为了防止恶意攻击等问题,可能对推送频率、同一用户能够接收的消息条数加以限制。
2.单条消息, 可携带的数据量最大不能超过 4KB

参考资料:
[1]http://www.ibm.com/developerworks/cn/xml/x-xmppintro/#resources

0 0
原创粉丝点击