如果您按照后端的部署文档,或者使用我们的一键部署包完成了部署,那么只看这篇文档就可以完善push能力了,并不需要单独下载和部署任何内容。
IM 后端的 push 服务,支持 IOS apns 协议推送,android 小米,华为,魅族,oppo厂商推送 push 服务支持 startalk 消息 push,同时也支持接入自己的 push 服务
- 如果您自己有build app的能力,那么请自己生成、部署app,并[自己部署push](#私有化部署 push);
- 您有已经在应用的push服务器,需要[复用自己的push服务器](#自有 push 系统);
- 如果您并不打算部署app,只想用开源版本的startalk,那么可以接入我们的[公共push服务器](#共用 push 系统)
(因为app push证书在团队内), 此时您需要支付一定的服务器公摊费用,但是肯定比短信便宜的多!详情可以联系我们的客服人员。
对于已经私有化部署的用户来说比较简单,不需要下载,更新服务,只需要按照如下步骤执行即可. 全程只需要修改一个配置文件,重启下服务即可。 一共有四步:
- 第一步
$ vim /startalk/tomcat/push_service/webapps/push_service/WEB-INF/classes/app.properties
- 第二步
在配置文件中,找到:
qtalk_push_url=
将您收到的邮件或者信息中的公有url填入,填写完成之后应该看起来是这样的:(没有空格)
qtalk_push_url=https://xxx.xx.com/xxx/push/sendPush.xxx
- 第三步: 在配置文件中,找到:
qtalk_push_key=
将您收到的邮件或者信息中的push key填入,填写完成之后应该看起来是这样的: (没有空格)
qtalk_push_key=xxxxxxxx
- 第四步: 杀掉服务,并重启服务
$./startalk/tomcat/push_service/startup.sh
全程只需要修改一个配置文件,重启下服务即可。
文件位置在:
/startalk/tomcat/push_service/webapps/push_service/WEB-INF/classes/app.properties
如果需要使用服务支持的 push,Android 需要自己去小米和华为开发平台注册自己应用的 app_key, IOS 需要生产签名证书,配置如下:
ios_push_cer_qtalk=线上证书所在路径
ios_push_cer_qtalk_beta=beta证书所在路径
adr.qtalk.pkgname=应用包名
adr.mipush.qtalk.key=mipush key(是个文本)
adr.hwpush.qtalk.key=hwpush key(是个文本)
全程只需要修改一个配置文件,重启下服务即可。
文件位置在:
/startalk/tomcat/push_service/webapps/push_service/WEB-INF/classes/app.properties
private.push.url=这里指向您的push服务的接收方法
此时,push 服务将作为客户端,将需要发送的 push 内容推向你现有的 push 服务器。
你服务器中需要实现上面提到的方法。其中:
http request 的 Header中,
Content-Type:application/json
post body是个json,内容为类似这样的形式:
{
"From":"ming.xiao",
"To":"hong.xiao",
"Body":"明天去哪儿玩儿?",
"Mtype":1,
"Message":"xml"
}
使用QTalk/Startalk客户端的情况如要使用push,需要联系客服配置下面信息
qtalk_push_url=
#使用星语push key
qtalk_push_key=
push服务有多个获取消息的方式,包含
- 从MQ获取(Kafka),
- Http获取(Post请求)
目前采用的是第二种 /sendMessageToPush.qunar
之后 SpoolMessageService.java +122 -- getMesaageToSend
将XML进行消息解析
从push_info
表中获取每一个要推送用户的
- 手机型号
- mac_key
- 推送配置
- 是否订阅群等
每个用户在第一次登陆客户端时会向后台post请求setpersonmackey.qunar自己的这些信息并由服务入库
包括
- 用户手机型号
- mac地址、是否处于符合push的条件
(手机是否打开推送开关、是否处于手机app处于后台状态、是否没有在线状态的客户端等)、
- 是否明文推送
- ......
之后则判断是否有自有的push服务器 SpoolMessageService.java +192
,如果有则以http发送post请求, 请求为
map.put("From", F); //发送人/群
map.put("To", QtalkStringUtils.parseId(info.toUserName));//接收人
map.put("Body", B);//消息内容(单人【消息内容】;群【说话人:消息内容】)
map.put("Mtype", info.msg_type);//消息类型
map.put("Message", info.msgxml);//原始消息
之后在函数formatBaseNotification
将消息转为推送用格式,
最终格式包含
/**发送人,可用来做notifyid*/
public String fromjid;
/**通知标题,消息的from*/
public String title;
/**通知内容,单人消息的message,群消息 realfrom:message*/
public String description;
/**消息内容,根据msgtype转化后的message*/
public String body;
/**消息类型 eg. chat group consult*/
public String originType;
/**消息的msg_type*/
public int msg_type;
/**signaltype 根据消息type转化*/
public int type;
/** consult专用 chatid=4:用户->客服 5:客服->用户 */
public String chatid;
/**指定通知对象,客户端上传到token*/
public List<String> platkeys;
/**Android客户端平台*/
public String platname;
/**Android的客户端包名,ios的bundleid*/
public String pkgname;
public String json = "Just unused now";
/**map里面发消息人的id*/
public String fromName;
/**map里面发消息人的domain*/
public String fromHost;
/** consult消息 realjid */
public String realjid;
/**群消息map里面发消息人的nick*/
public String fromNick;
/**消息to,带domain*/
public String toUserName;
/**消息的xml*/
public String msgxml;
public String cctext;
public String messageId;
/**发送系统 android ios*/
public String os;
/**星语开放平台注册push key*/
public String push_key;
举例:
{
"body": "小明 : 您好?(长度最多50个字符)",
"cctext": "",
"chatid": "",
"description": "小明 : 您好?",
"fromHost": "conference.startalk.im",
"fromName": "7d01311b7ef14edd9d4f2c636e02d206(群id)",
"fromNick": "小明",
"fromjid": "[email protected] (群jid)",
"json": "Just unused now",
"messageId": "d7347ff46318473297e1dc53d40c260c",
"msg_type": 1,
"msgxml": "...(原xml)",
"originType": "groupchat(群聊标志)",
"os": "ios(平台)",
"pkgname": "...(bundle id)",
"platkeys": ["...(客户端mac_key)"],
"platname": "iPhone12,1_zh_CN",
"realjid": "",
"title": "Startalk团队",
"toUserName": "小红@startalk.im(群内某个群员)",
"type": 7
}
之后判断是否有qtalk_push_url
(公有push系统), 有则类似私有push系统向其进行post请求,
如果没有则将消息向厂商分发
ios使用pushy
库IosNewPushService.java
,支持
- 证书
- token
两种验证方式,
如果采用证书,在app.properties里填写ios_push_bid(bundle id),ios_push_cer_qtalk(证书文件名,将其放在项目的resources文件夹下后打包,或放在部署好的tomcat /startalk/tomcat/push_service/webapps/push_service/WEB-INF/classes/下),ios_push_cer_pwd=证书密码,
如果采用token的方式在app.properties里填写ios_push_bid(bundle id),team_id(团队名),token_key_id(在apple-developer请求的token)
Android为自制推送ThirdPushServerManager
,通过在src/java/com.qunar.qchat/adrpushserver
下每个厂商的sendNotifyToAlias
方法,推送消息
app(AT)startalk.im(邮件)