Android应用一般通过后台向服务器轮询请求获取信息,而iOS应用则会在被切换到后台一段时间后停止运行,这时候如果想要达到信息的获取则只能依靠APNS(Apple Push

Android应用一般通过后台向服务器轮询请求获取信息,而iOS应用则会在被切换到后台一段时间后停止运行,这时候如果想要达到信息的获取则只能依靠APNS(Apple Push Notification Service),由服务器主动进行推送。APNS的原理以及令牌获取方式网上一搜一大堆,这里主要介绍一下Java的APNS类库notnoop。

notnoop中的核心类是ApnsService和PayloadBuilder,ApnsService可以向服务器发送请求,并且在ApnsServiceBuilder中提供了常用的服务器host。一个ApnsService的创建可以通过下面几句简单的代码完成://p12文件路径

String keyPath = "E:/Pushtest.p12";
//p12文件密匙
String password = "111111";
//创建一个APNS service
ApnsService service = APNS.newService()
.withCert(keyPath, password)//使用指定的p12文件以及密匙
.withSandboxDestination()//使用apple的测试服务器
.build();
而PayloadBuilder则可以帮助开发者轻松地创建一个符合APNS规范的JSON,例如:
//创建一个消息
String payload = APNS.newPayload()
.alertBody("hello world!")//推送通知显示的文字
.sound("default")//推送时附带的声音提示
.badge(1)//应用程序图标右上角显示的数字
.build();
最后只要调用service的push方法即可将消息推送到iOS设备了:
//token由客户端获取
String token = "45124a4cf9f5e272d395f6392456e5ab7185d2ae6e98ba2f8426fe09f60e785b";
//发送消息到iOS设备
service.push(token, payload);

由于APNS最高只支持256个字节的消息体,并且推送消息中大量重复的内容也会造成流量成本,这时可以使用本地化字符串。本地化字符串是在客户端中的Localizable.strings文件中定义一对键值对,服务器只需要提供指定字符串的键和动态生成的参数即可生成一条完整的推送消息,,例如:

//Localizable.strings中定义 "focus"="%@关注了你"
List args = new ArrayList();
args.add("张三");
String payload = APNS.newPayload()
.localizedKey("focus")//本地化字符串的key
.localizedArguments(args)//动态生成的参数
.build();
service.push(token, payload);
//推送结果: 张三关注了你

最后,并不是每条消息都绝对会推送成功。例如当用户卸载掉该应用时,所对应的token就已经失效了,这时可以通过service的getInactiveDevices方法获得失效的token并作出处理。