玩转客户端推送

来自ixintui推送文档
跳转至: 导航搜索

作为Android客户端开发者,大家都知道,推送服务是应用的一个基础需求,它在各种不同的应用都有不同的应用场景和需求,但是很少有总结性的文章来说明一下推送到底能实现什么样的用户需求,本文作者基于多年客户端应用的开发经验对此做以总结,仅供大家参考。本文中的推送服务均使用爱心推作为例子来进行说明(请参考附录如何使用爱心推服务)。

内容发布

想像一下最基础的客户端应用,无非是组织和呈现内容给终端用户,常见的例子可以是文本内容,图片内容,音频内容,视频内容,这些内容呈现和组织类型的应用最常用的场景就是发布新内容给终端用户,这时候推送就派上用场啦。

举个例子,现在有一个电子杂志客户端,新一期的内容发布了,要发布到终端用户,这时候就是一个典型的内容推送。那么如何把这一新内容推送到客户端呢,假定新的内容放在一个网址为“mymagazine.com”的网站,使用爱心推推送服务为例,做法非常简单: 电子杂志的内容生产端,也就是服务器端,需要使用爱心推的REST API发布一条广播推送,只需POST一些以json格式封装好的参数到这里http://androidmis.ixintui.com:8001/push (以下发送http POST到一个url使用了linux下的curl工具,具体到语言中如何发送HTTP post请求就不再这里细说了。)

使用curl的示例代码如下:

curl -H "Content-type:application/json" -d {"appkey":"1590588220","sound": true,"open_url":"http://mymagazine.com","extra":"附加信息","title":"电子杂志","vibrate":true,
"is_notif": "1","click_action":"open_url","message": "您有新的杂志发布", "sign": "794e5f5cbbc1492d86997d4aff1cf083",} http://androidmis.ixintui.com:8001/push

这里有几个参数需要重点说一下(更多信息还需参考这里: http://www.ixintui.com/docs/doclist.php?f=3):

  • "appkey"表示电子杂志客户端在爱心推官网注册的唯一标识,具体注册方法可以参考下文;
  • "is_notif"这个参数为"1"表示这个推送是一个通知推送,也就是要在客户端通知栏展示出一条通知,如果为"0"则表示这是一个透传推送,后文会讲到透传的用法。
  • "click_action"这个参数表示这个通知推送在用户点击后的行为,可以是打开应用主activity,也可以是打开指定的url,或者指定的intent。
  • "sign"表示对这一POST的几个参数排序后,进行MD5签名后取16进制字符串的结果。使用python获取此签名的示例代码如下,其他语言同理:
import json
import hashlib

data = dict()
data["appkey"] = "1590588220"
data["sound"] = True
data["open_url"] = "http://mymagazine.com"
data["extra"] = "附加信息"
data["title"] = "电子杂志"
data["vibrate"] = True
data["is_notif"] ="1"
data["click_action"] = "open_url"
data["message"] = "您有新的杂志发布"
sign = hashlib.md5(json.dumps(data,separators=(",",":"),ensure_ascii=False, encoding="utf8", sort_keys=True) + "your- secret_key ").hexdigest()

假如这条推送信息发送到客户端后期望用户点击打开应用而非一个网址该如何做呢?非常简单,只需把json内容中的参数稍作改变即可

例子如下:

curl -H "Content-type: application/json" -d {"appkey": "1590588220","sound":true,"open_app":true,"extra":"附加信息","title":"电子杂志","vibrate":true,
"is_notif": "1","click_action":"open_app","message":"您有新的杂志发布","sign": "794e5f5cbbc1492d86997d4aff1cf083",} http://androidmis.ixintui.com:8001/push

还可以通过参数"sound"来控制这条推送通知是否有声音,通过"vibrate"参数来控制通知是否带震动。 如果期望客户点击此通知时打开的不是应用的主页或者一个指定网页,而是希望打开指定的activity有没有办法呢?必须有啊,这个示例展示了如何指定用户点击通知打开一个期望的activity:

curl -H "Content-type: application/json" -d {"appkey": "1590588220", "sound": true, "intent": "intent:#Intent;action=android.intent.action.MAIN;
category=android.intent.category.LAUNCHER;launchFlags=0x10000000;component=com.mymagazine/.MainActivity;end", "extra": "附加信息", "title": "电子杂志",
 "vibrate": true, "is_notif": "1", "click_action": "intent", "message": "您有新的杂志发布", "sign": "794e5f5cbbc1492d86997d4aff1cf083",}
http://androidmis.ixintui.com:8001/push

这里的"intent"参数指定了一个符合URI格式的intent字符串,这个字符串可以在android的java代码中通过Intent.toUri()方法获取到。如果还不清楚可以看一下Android的文档。 刚才发送的都是一些广播推送,如果只想发送到个别用户的推送如何发出呢?这个其实也相当容易,在推送客户端注册服务时会接收到一个token作为设备唯一标识,客户端只要拿到这个标识然后将它和在此设备登录的用户进行关联就可以认为这个token代表了用户,那么发送给指定用户就像当于发送给指定的token。

下面的例子说明了如何发送推送给一个指定的token:

curl -H "Content-type: application/json" -d {"appkey": "1590588220", "token": "6974ac11 870e09fa 00e2238e 8cfafc7d 2052e342 182f5b57 fabca445 42b72e1b", 
"sound": true,"intent":"intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10000000;
component=com.mymagazine/.MainActivity;end","extra": "附加信息", "title": "电子杂志","vibrate": true, "is_notif": "1","click_action": "intent",
"message": "您有新的杂志发布", "sign": "794e5f5cbbc1492d86997d4aff1cf083",} http://androidmis.ixintui.com:8001/push


运营活动

如何现在有一个电商客户端推出了新的促销活动,或者推出新的商品,那么这个信息如何推送到终端用户呢?这也是很容易的事,其实现方式非常类似于内容的发布,只不过这次的内容换成促销活动的介绍。

示例如下:

curl -H "Content-type: application/json" -d {"appkey": "1425830916", "sound": true, "intent": "intent:#Intent;action=android.intent.action.MAIN;
category=android.intent.category.LAUNCHER;launchFlags=0x10000000;component=com.eshop/.MainActivity;end", "extra": "这是附加信息", "title": "我的电商", 
"vibrate": true, "is_notif": "1", "click_action": "intent", "message": "有新商品上架啦,去看看吧", "sign": "794e5f5cbbc1492d86997d4aff1cf083",}
 http://androidmis.ixintui.com:8001/push

类似的运营类推送还有很多种,比如:社交类应用会推出新的明星达人推送,媒体类会推送一些热点或是推荐阅读,其他的应用也会有激活一些不活跃用户的推荐类推送。这些实现起来都和上面的例子大同小异。

运营类推送的一个更高的要求通常是按照人群推送针对性的信息,这一点如何实现呢?爱心推提供了标签功能可以很容易满足这类需求。具体的做法是客户端应用会根据用户信息将用户归类到某标签,只需调用客户端sdk的addTags方法即可轻松将用户打好标签,使用deleteTags则可以删除标签。

有了标签之后,对于特定人群推送信息就水到渠成啦。注意标签只是简单的数字,其具体含义需要应用自己定义,比如1可以对应女性,2可以对应男性,3可以对应20-30岁的年轻人等等。这个例子展示了给所有女性用户(假定标签1对应的是女性)发送的推送,注意filter参数表明目的人群标签,可以是一个数组:

curl -H "Content-type: application/json" -d {"appkey": "1425830916","sound": true, "filter": [1], "intent": "intent:#Intent;action=android.intent.action.MAIN;
category=android.intent.category.LAUNCHER;launchFlags=0x10000000;component=com.eshop/.MainActivity;end", "extra": "这是附加信息", "title": "我的电商",
 "vibrate": true, "is_notif": "1", "click_action": "intent", "message": "有特别棒的化妆品促销啦,快去看看吧", "sign": "794e5f5cbbc1492d86997d4aff1cf083",} 
http://androidmis.ixintui.com:8001/push


下载升级

更新推送是非常常用的推送,几乎所有应用有新版本都希望用户进行升级,使用更新推送这种方式来促进用户的更新是最常用的手段之一。如果一个应用希望推送一个下载更新该如何去作呢?其实和内容推送类似,只要指定一个点击打开的下载链接就可以做到,下面的例子展示了这个做法:

curl -H "Content-type: application/json" -d {"appkey": "1590588220", "sound": true, "open_url": "http://mymagazine.com/download/mymagazine.apk", "extra": "这是附加信息", 
"title": "电子杂志", "vibrate": true, "is_notif": "1", "click_action": "open_url", "message": "电子杂志有新版本发布啦,很潮的功能加入哦,猛击下载吧", 
"sign": "794e5f5cbbc1492d86997d4aff1cf083",} http://androidmis.ixintui.com:8001/push

用户点击这一通知时,会直接打开下载链接进行下载。

状态通知

状态通知是各种应用常用的需求,比如电商应用会有用户的订单状态和物流状态更新,需要推送到客户端;比如社交应用也会有用户的好友变化;图片社交类会有图片评论和赞等的信息更新;天气类应用会有广泛的需求推送天气状态的变化等等。

这些通知都可以使用推送来实现,应用只需要知道对应用户的设备token就可以针对性的推送此用户相关的各种状态更新。

下面的示例表示一个用户新增好友的通知:

curl -H "Content-type: application/json" -d {"appkey": "1425830916", "token": "6974ac11 870e09fa 00e2238e 8cfafc7d 2052e342 182f5b57 fabca445 42b72e1b",
 "sound": true, "intent": "intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10000000;
component=com.mymagazine/.MainActivity;end", "extra": "附加信息", "title": "新朋友", "vibrate": true, "is_notif": "1", "click_action": "intent", 
"message": "您有新的好友啦,快去看看TA的主页", "sign": "794e5f5cbbc1492d86997d4aff1cf083",} http://androidmis.ixintui.com:8001/push


针对性推送

有时应用需要对特定人群做出不同的推送, 在运营推送中我们已经提到过这种需求,很多非运营的内容也一样会有这样的需求,比如对某地域的推送需要对当地人群进行定制化推送,常见的如天气类应用,天气预报必须针对不同地域而不同的。再比如按照地域关系建立起的若社交类应用可能需要给某地区的用户推送当地的活动信息。

给某些用户群体发送推送需要用到标签来进行分组广播。比如推送北京的天气预报可以这样做(假定标签1标识北京用户,注意此标签是应用根据用户的地理位置设置的):

curl -H "Content-type: application/json" -d {"appkey": "1425830916","sound": true, "filter": [1], "intent": "intent:#Intent;action=android.intent.action.MAIN;
category=android.intent.category.LAUNCHER;launchFlags=0x10000000;component=com.myweather/.MainActivity;end","extra": "这是附加信息", "title": "我的天气",
 "vibrate": true, "is_notif": "1","click_action": "intent", "message": "2014/6/17日天气预报有暴雨预警,出行请注意","sign": "794e5f5cbbc1492d86997d4aff1cf083",} 
http://androidmis.ixintui.com:8001/push

标签的定义和分类完全由应用来决定,应用需要有自己的标签分类标准,应用客户端需要将其用户标记到不同的标签。

多媒体推送

多媒体内容推送也是一种定制化推送,其针对的内容比普通的内容推送更丰富,可以包括视频,声音,图片,动画和网页等媒体。富媒体推送通常并不需要把媒体内容完全的推送到客户端,而是将媒体的内容以链接的方式封装到推送信息中,在客户端只要直接打开这些链接即可访问这些媒体内容。

以下示例推送一个包含多媒体的链接(利用”extra”参数)到客户端,在用户点击通知时打开客户端指定的activity,并且将链接传给客户端,客户端需要实现这个链接所包含的内容的展示,可以是图片,视频,音频,动画或者全部。

curl -H "Content-type: application/json" -d {"appkey": "1425830916", "sound":true,"intent":"intent:#Intent;action=android.intent.action.MAIN; category=android.intent.category.LAUNCHER;
launchFlags=0x10000000; component=com.mymagazine/.MainActivity;end", "extra": "http://www.mymagazine.com/media", "title": "新月刊上线", "vibrate": true, "is_notif": "1", 
"click_action": "intent", "message": "您订阅的月刊新一期发行啦,各种多媒体内容绝对过瘾,快去看看", "sign": "794e5f5cbbc1492d86997d4aff1cf083",} http://androidmis.ixintui.com:8001/push


透传和自定义推送

透传的推送是指在客户端不需要直接展示在通知栏,而是直接发送到客户端内部处理,由客户端自行消化而非展示给终端用户。终端用户甚至并不知晓此类消息到达。这种类型的信息有时会有一些非常规的用途,比如有些应用使用这种透传作为一种服务器更新的通知机制,一旦收到这种信息则触发一次从服务器获取更新数据的请求。

当然透传信息的具体作用完全是可以按照不同的应用的不同场景做更多创新的,比如一个社交类应用,可以通过透传信息去更新其用户的好友列表。再比如应用可以通过透传消息来触发一次下载更新和静默安装,当然,这只是举个例子而已,静默安装可是需要root权限滴~

以下示例发送一个透传消息,客户端会直接接收到这条消息,通知栏不会有任何展示。

curl -H "Content-type: application/json" -d '{"appkey": "1425830916", "token": "1487168775739423346", "message": "hello,world", "sign": "c49362c03fc608c73bddaca9b9d46345"}' 
http://androidmis.ixintui.com:8001/push

当然透传信息的具体作用完全是可以按照不同的应用的不同场景做更多创新的,比如一个社交类应用,可以通过透传信息去更新其用户的好友列表。再比如应用可以通过透传消息来触发一次下载更新和静默安装,前提是应用有相应的权限(静默安装可是需要root权限滴~)。这只是举个例子而已,透传消息的作用是多样化,完全自由定制的,静默安装或者静默升级等等都只是其中之一。

通过透传信息还可以做到自定义的通知展示,举个例子,如果希望展示应用自定义的通知,可以通过透传消息封装好自定义的数据,然后在客户端收到这种透传信息时创建自定义的通知样式,把数据填充到自定义样式去展示,这样可以做到完全自由的扩展通知的样式。

总之透传信息是一种非常自由,非常容易扩展的数据传递方式,在应用方面可以有无限的空间,唯一对它有限制的就是应用开发者的想象空间啦~

感谢麒麟心通网络技术有限公司允许本文作者使用其高质量的推送服务来做为例子说明推送的各种用途,爱心推服务的高质量,高到达率和快速到达令笔者印象深刻,应该说是目前为止所有第三方推送服务中位居前列的选择。还有一个最大的优势,爱心推可是免费的哟,亲们快去下载试用吧!

最后说一句题外话,关于推送质量的关键数据,可以参考另外一篇专门分析推送关键数据的文章“详解移动推送的关键数据”。

附录

如何使用爱心推服务移动推送服务?

爱心推是由麒麟心通网络技术有限公司推出的移动端推送服务,它具有4大特点:价格实惠, 高到达率,迅捷到达,高吞吐量。具体信息请看爱心推主页,http://www.ixintui.com

在使用爱心推的服务之前需要先简单了解一下爱心推服务集成的几个简单步骤:

1. 到爱心推网站注册一个用户,此用户即为您的开发者账号。
2. 使用第1步注册的用户创建一个应用,请注意正确填写应用的包名。这里创建好用户会得到一个appkey,请注意记录以便在第5步使用。
3. 到www.ixintui.com网站下载客户端SDK和服务器端REST API文档。
4. 解压缩客户端SDK,按照里面的示例和文档将库文件集成到应用工程中。
5. 按照SDK说明使用第2步得到的appkey调用相应API注册服务。

具体的信息请参考SDK: http://www.ixintui.com/docs/AndroidPushSDK_v1.0.zip