iOS 用javapns插件实现push通知 小解
java端用到的push插件:http://code.google.com/p/javapns/downloads/list
应用过程中遇到的几个小问题,记录一下。
1.因为debug用的push证书,与distribution用的证书是不一样的,所以
keystore参数指向的证书的地址要正确
2.debug发送push,和distribution发送push时,APNS的地址是不一样的,所以
isProduct参数的取值为[false:debug版;true:distribution版]
==============================================
网上一篇挺好的文章(http://blog.csdn.net/zhenzhenzhao12/article/details/8204483)==============================================
内容如下:
开发状态服务器地址:gateway.sandbox.push.apple.com2195
产品状态服务器地址:gateway.push.apple.com2195
Development和Production两个版本对应的apnsdevicetoken是不同的,前者是develop的mobileprovision下获取的。后者是production的mobileprovision获取的。
Development和Production两个版本可以共用一个AppID,但是不能共用一个mobileprovision,所以要单独生成Distribution的证书供production版本使用。
注:Distribution的版本是无法在设备上debug调试的!
Development和Production两个版本的codesign是不同的,前者是iPhoneDeveloper,后者是iPhoneDistribution。注意不能搞错。
无论是DevelopmentPushSSLCertificate还是ProductionPushSSLCertificate都有过期时间的。DevelopmentPushSSLCertificate有效期三个月,而ProductionPushSSLCertificate的有效期是一年。需要注意在过期之前生成新的证书,以免影响使用。
服务器端发出的json包是有大小限制的,最大256字节,包括自定义字典集。
aps中的alert字符串里是可以添加"\n"做换行的。
json包中除了alert,badge,sound之外,还是是可以自定值的。
额外的自定义值:
$payload['aps']=array('alert':'Thisisthealerttext','badge':1,'sound':'default');
$payload['server']=array('serverId':$serverId,'name':$name);
$output=json_encode($payload);
当用户按下“View”后,自定义server值将被传递到设备中的程序。JSON值如下:
{
"aps":
{"alert":
{
"action-loc-key":"显示",
"body":"Thisisthealerttext"
},
"badge":1,
"sound":"default"},
"server":{"serverId":1,"name":"Servername")
}
256字节的限制适用于整个payload,包括自定义字典集。
原生接口
在ServerDensity中,一旦产生了一条提示,将建立一个payload并插入队列中。因此有必要时我们可以同时发送多个payload。
Apple推荐使用这种方法,因为如果你在发送各payload时频繁连接和断开,APNS有可能会封锁你的IP。
如Apple描述:
原生接口使用原生socket,具有二进制内容,采用数据流技术,不产生回馈。