友盟推送文档:
服务端代码调用:
直接下载java代码的SDK (我用的v1.5)
把SDK中的src下的push包下的代码全copy到项目中,删除App.java,而Demo.java文件中注意的是context推送的内容,安卓端的话需要注意title标题。Demo.java中有个main方法,可直接调试使用,需要更改其中的key与Secret【设为自己的】。
写一个常量类或.xml或.yml放AndroidKey、AndroidSecret和AndroidMessageSecret;IOSKey和IOSSecret。
Demo.java直接调用这些静态常量,方便以后更变。
遇到的问题:跟信鸽推送有一些相似,这里就不多说,请往下继续阅读。
================================
信鸽推送:【信鸽推送的技术支持者微信号 xg_Push,不懂的可以直接联系他】
【服务端】
信鸽封装了自己的jar,或者是好心人放Maven上的,直接引用jar包。
new XingeApp() 通过这个对象可以直接调用给Android的指定Token推送 | 指定的账户推送 | 指定的Tag推送。
而我使用时,直接调用他封装好的方法,推送json内容,安卓端与IOS端不好处理数据,甚至有时候推送内容直接显示json数据
【android与ios端】
最初选用的是token(设备号-唯一),使用token服务端不好控制。[遇到的问题:一个token设备上绑定多个用户,导致多个账户都能在这个设备上搜到推送;传递的参数:设备类型(安卓 | IOS),token;处理方式登录时存到数据库或redis,退出时清空,但是有些用户不会理智的选择退出登录,而是直接卸载软件,甚至他又安装上,登录其他号,这时候给以前的号推送的东西还是到这个设备上了...]
最终选择处理方式为:[安卓|IOS使用账号推,登录时绑定账号,退出时解绑账号,而也感谢信鸽提供了账号唯一绑定接口,文档上说明了当B用户登录会把以前的A用户顶掉,3.2.2 + 版本有效。服务端的处理方式为登录时,通过切面对请求判断属于安卓还是IOS,以用户ID做为KEY,设备类型为VALUE,存redis的Hash类型中,有效期等于session有效期,推送的时候从这个标记中取出来判断这个用户用的是安卓手机还是IOS手机,然后推送。而有些业务场景要求不严,可以两边都进行推送。]
下面是我写的工具类:【注意点accessAndSecretKeyConfig还有就是PushVO】
import com.tencent.xinge.ClickAction; import com.tencent.xinge.Message; import com.tencent.xinge.MessageIOS; import com.tencent.xinge.XingeApp; import lombok.extern.slf4j.Slf4j; import org.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import java.util.HashMap; import java.util.Map; /** * 自建信鸽的调用公共方法类 【注意静态方法中加载可控常改数据时】 * Created by Love丶TG on 2018/9/3 12:09. */ @Slf4j @Component public class PushUtils { // 来与.yml数据源ConfigurationProperties @Autowired private AccessAndSecretKeyConfig accessAndSecretKeyConfig; public static PushUtils pushUtils; @PostConstruct public void init() { pushUtils = this; } //获取android的Xinge private static XingeApp getAndroidXinge() { XingeApp xinge = new XingeApp(pushUtils.accessAndSecretKeyConfig.getAccessId(), pushUtils.accessAndSecretKeyConfig.getSecretKey()); return xinge; } //获取Ios的Xinge private static XingeApp getIOSXinge() { XingeApp xinge = new XingeApp(Long.valueOf(pushUtils.accessAndSecretKeyConfig.getIosAccess()), pushUtils.accessAndSecretKeyConfig.getIosSecretKey()); return xinge; } /** * IOS指定用户ID推送 * * @param bean * @return */ public static JSONObject pushAccountIos(PushVO bean) { MessageIOS messageIOS = new MessageIOS(); messageIOS.setType(MessageIOS.TYPE_APNS_NOTIFICATION); messageIOS.setExpireTime(86400);//默认离线七天 messageIOS.setAlert(bean.getTitle()); messageIOS.setBadge(1); messageIOS.setCategory(bean.getContent()); messageIOS.setSound("beep.wav"); Map<String, Object> custom = new HashMap<>(); custom.put("data", bean.getJsonContent()); messageIOS.setCustom(custom); XingeApp xinge = getIOSXinge(); if (pushUtils.accessAndSecretKeyConfig.getIosXG()) { return xinge.pushSingleAccount(0, bean.getUserId(), messageIOS, XingeApp.IOSENV_PROD); } return xinge.pushSingleAccount(0, bean.getUserId(), messageIOS, XingeApp.IOSENV_DEV); } /** * Android指定用户ID推送 * * @param bean * @return */ public static JSONObject pushAccountAndroid(PushVO bean) { Message message = new Message(); message.setType(Message.TYPE_NOTIFICATION); ClickAction action = new ClickAction(); action.setActionType(ClickAction.TYPE_ACTIVITY); action.setActivity("activity"); Map<String, Object> custom = new HashMap<>(); custom.put("data", bean.getJsonContent()); message.setTitle(bean.getTitle()); message.setContent(bean.getContent()); message.setAction(action); message.setCustom(custom); XingeApp xinge = getAndroidXinge(); return xinge.pushSingleAccount(0, bean.getUserId(), message); } }
调用:
(IOS)PushUtils.pushAccountIos(bean)
(安卓)PushUtils.pushAccountAndroid(bean);
============================结束,感谢您的关注!=======================