利用个推SDK轻松实现IM通信功能
前言
早在个推全面开放之前,公司团队在2010年之时就打造了比微信还早一年的国内首款即时聊天类的应用-“个信”。如今的个推在发挥其核心技术-“消息推送”的同时,IM功能的优化更是不在话下。个推的推送性能高,高并发高吞吐,平均延时小于250ms。在如此高性能环境下,开发者在已集成个推SDK的基础上实现IM即时通信功能的想法必然可以高效达成。下面我们就来给大家讲讲如何通过个推实现IM的能力。
原理
要实现IM的通信,我们必须要有一下几个前提条件:
1 消息的路由
2 消息的回执
3 别名的绑定
首先,我们来看看消息路由是否可以实现,设备在安装APP后会自动到个推平台注册,个推平台会给这个设备分配一个CID,即设备号。因此,只要我们有这个CID就可以将消息下发到指定的用户上。所以消息路由不是问题。那么,我们如何知道消息是否到达指定客户端呢?在个推的开发者平台上你可以登记一个回执回送的URL,一旦你的用户收到一条推送后,客户端会自动上行回执,该回执会直接通过你注册的URL回写道你的服务器上,换句话说,只要你提供这个URL服务的服务器正常所有的客户端回执都会回送过来,那么我们就可以利用这个接口知道目标客户是否收到这条消息。
当我们拥有以上这两个前提条件,实际上已经可以完成基本的IM通信功能了。但是加入第三点“别名的绑定”会使运作会更加方便,因为你不需要维护你的用户和CID的绑定关系,个推提供了这一绑定功能,你可以让个推平台帮你维护这一关系,而你在推送的时候只要将你的用户别名送过去就可以了。
下图描述了一个实际案例:
黑色线描述了A用户发送消息给B用户的流程:
• A用户发送一条消息给B用户,消息首先被送到消息服务器
• 消息服务器通过个推的服务器别名推送接口,将消息单推给用户B
• 个推服务器完成了推送,B用户接收到消息,SDK自动将消息回执回送给个推服务器(蓝色线的部分)
• 个推服务器将消息回执通过应用预先注册的URL回送给第三方
• 然后第三方服务可以作为响应通知给用户A,B已经收到消息了,或者再次通过个推平台将这个响应异步的回送给用户A。
• B用户决定要回复一条消息给A,这时的流程和A发送消息给B是一样的,只不过发起者换一下,对应图里的绿色线部分。
调用接口说明
从上述原理中,我们可以看出用到的主要有两个接口:别名绑定和别名推送。下面分别对这两个接口进行说明。
别名绑定
可以在手机端调用个推手机端SDK进行别名绑定。如果是Android系统,请参照:
(个推官网文档中心-Android SDK文档-Android SDK API -绑定用户别名) http://docs.getui.com/pages/viewpage.action?pageId=1212748
如果是iOS系统,请参照:
(个推官网文档中心- iOS SDK 1.2.1文档-iOS SDK 1.2.1 API接口文档 ) http://docs.getui.com/pages/viewpage.action?pageId=1934178
当然也可以在服务端调用个推服务端SDK进行别名绑定,现在以Java SDK为例说明,代码如下:
String host=""http://sdk.open.api.igexin.com/apiex.htm";
IGtPush push = new IGtPush(host, appkey, mastersecret);
IAliasResult bindSCid = push.bindAlias(appId, alias, cid);
别名推送
在服务端调用个推服务端SDK进行别名推送,仍然使用Java SDK为例说明,代码如下:
String host=""http://sdk.open.api.igexin.com/apiex.htm";
IGtPush push = new IGtPush(host, appKey, master);
// 透传消息模板
TransmissionTemplate template = new TransmissionTemplate();
template.setAppId(appId);
template.setAppkey(appKey);
template.setTransmissionContent("你好啊");
// 对单个用户推送消息
SingleMessage message = new SingleMessage();
message.setData(template);
// 设置别名
Target target = new Target();
target.setAppId(appId);
target.setAlias(alias);
push.pushMessageToSingle(message, target);
除此之外,另外一种实现IM功能的方式就是利用个推的 SendMessage 功能,简单来说就是通过个推将消息提交给对方服务器,对方服务器处理后,再将消息下发给个推从而实现IM功能,具体demo文档及详情请期待《利用个推SDK轻松实现IM功能【下】》。
以个推超大规模架构系统、高并发高吞吐超稳定的推送技术服务为基础,我们为开发者们提供了简单易接的方式实现应用用户之间的即时聊天功能,这不仅为应用增加了用户活跃度,也帮助个推在产品优化方面做了进一步的提升。