iphone消息推送需要向APNS申请证书(如何申请,请参考:http://2015.iteye.com/blog/1337599 ),会生成三个文件:
1、Push.certSigningRequest
2、Push.p12
3、aps_developer_identity.cer
然后,java后台消息推送代码需要用到证书密码和路径,需要另外使用openssl生成,windows下的步骤如下:
打开openssl命令行:
1、将aps_developer_identity.cer转换成aps_developer_identity.pem格式
输入命令: x509 -in aps_developer_identity.cer -inform DER -out aps_developer_identity.pem -outform PEM
2、将p12格式的私钥转换成pem
pkcs12 -nocerts -out Push_Noenc.pem -in Push.p12
3、创建p12文件
pkcs12 -export -in aps_developer_identity.pem -inkey Push_Noenc.pem -certfile Push.certSigningRequest -name "aps_developer_identity" -out aps_developer_identity.p12
注意:-name 后面的名字 aps_developer_identity 与最后你生成的保持一致;
这样我们就得到了java等后台应用程序中使用的证书文件:aps_developer_identity.p12
如果linux下生成第三步报错,即可去掉 -certfile Push.certSigningRequest 生成(我是这样做的,也可以推送消息,去掉之前它老提示一个找不到cert的错误)
java 后台推送测试代码:(注意修改你的证书路径和密码,以及测试手机的token
/**
* IPHONE推送
*
* @param tokens
* 设备ID列表
* @param message
* 推送的消息
* @param badge
* iphone应用图标上小红圈上的数值
* @param sound
* 消息提醒铃音
* @param certificatePath
* 证书路径
* @param certificatePassword
* 证书密码
* @param single
* true:单条 false:多条
*/
public void sendpush(List<String> tokens, String message, int badge,
String sound, String certificatePath, String certificatePassword,
boolean single) {
try {
logger.info("----------------message:" + message);
PushNotificationPayload payLoad = new PushNotificationPayload();
if(StringUtils.isNotEmpty(message)){
payLoad.addAlert(message); // 消息内容
}
payLoad.addBadge(badge); // iphone应用图标上小红圈上的数值
if (!StringUtils.isBlank(sound)) {
payLoad.addSound(sound);// 铃音
}
PushNotificationManager pushManager = new PushNotificationManager();
// true:表示的是产品发布推送服务 false:表示的是产品测试推送服务
pushManager
.initializeConnection(new AppleNotificationServerBasicImpl(
certificatePath, certificatePassword, false));
List<PushedNotification> notifications = new ArrayList<PushedNotification>();
// 发送push消息
if (single) {
Device device = new BasicDevice();
device.setToken(tokens.get(0));
PushedNotification notification = pushManager.sendNotification(
device, payLoad, true);
notifications.add(notification);
} else {
List<Device> device = new ArrayList<Device>();
for (String token : tokens) {
device.add(new BasicDevice(token));
}
notifications = pushManager.sendNotifications(payLoad, device);
}
List<PushedNotification> failedNotifications = PushedNotification
.findFailedNotifications(notifications);
// List<PushedNotification> successfulNotifications =
// PushedNotification
// .findSuccessfulNotifications(notifications);
if (failedNotifications != null) {
int failed = failedNotifications.size();
String errorLog = "失败条数=" + failed + "; ";
for (PushedNotification failedNotification : failedNotifications) {
Device d = failedNotification.getDevice();
errorLog += "deviceId=" + d.getDeviceId() + "; token="
+ d.getToken();
}
logger.info("消息推送失败记录:" + errorLog);
}
// int successful = successfulNotifications.size();
} catch (Exception e) {
logger.error("消息推送异常...", e);
}
}
public static void main(String[] args) {
String classpath = IphonePushService.class.getResource("/").getPath();
PropertyConfigurator.configure(classpath
+ "/config/properties/pushLog4j.properties");
IphonePushService pushService = new IphonePushService();
List<String> token = new ArrayList<String>();
String device_token ="gt5a414g67a01183ef683r41e110ddrlof7d258h2c1678a99hj69586e589574";
token.add(device_token);
String certificatePath = "F://duanrong_zeng//temp//cert//java_dev_identity.p12";
String certificatePassword = "123456";
pushService.sendpush(token, null, 5, "", certificatePath,
certificatePassword, true);
}
使用的jar包,openssl见附件
本文参考了 http://2015.iteye.com/blog/1337599
原文参考:http://it.5yun.com.cn/html/y2015/m01/22.html