文章源地址:http://www.xiaomeiti.com/note/3625
这里要说的是这个推送证书的有效期是1年,如果到期没有及时更新,会导致消息推送失败。那么下面就说下如何更新IOS消息推送证书:
1. 首先需要一个MAC电脑,然后打开钥匙链(Keychain),选择 证书助理/从证书颁发机构请求证书,电子邮件就填写Apple Developer的apple id,最后会生成一个CertificateSigningRequest.certSigningRequest文件,这个文件后面会用到。
2. 打开:https://developer.apple.com/account/ios/identifier/bundle 然后选择你的App ID,点击会展开一个功能列表,点击下方的Edit按钮,在Push Notifications下面会看到:Development SSL Certificate和Production SSL Certificate,如果你之前已经有推送证书,在这里也会看到有效期什么的。
3. 在Development或者Production下面点击 Create Certificate 按钮,会出现一个确认页面,点击Continue/继续,会需要上传第一步生成的文件(Select .certSigningRequest file saved on your Mac.)选择文件之后,点击下面的Continue/继续按钮,会提示创建证书成功,这个时候我们可以点击download下载一个扩展名为cer的文件(aps.cer)。
4. 在Mac机器上双击下载的aps.cer文件,会在钥匙链(Keychain)中打开,然后选中该证书,导出为一个p12证书文件,这个p12文件就是服务器端推送消息需要使用的。在导出过程中需要设置证书密码,这个密码一定要牢记,后面服务器推送也需要这个密码。
5. 拿着生成好的p12文件,然后在服务器端做好测试,确实可以用新证书推送消息到设备,我们就可以把证书更新到服务器了,把老的证书覆盖即可。
6. Apple Developer里面老的证书,这个时候可以移除了,或者就放在那里也可以,等它自动过期即可。
7.不管第一次配置极光,或极光证书过期需要更换都需要重新生成一个Provisioning Profile(描述文件)文件。
查询到的更换证书收不到推送消息的原因:
1.当前上传的p12证书密码输入有误;
2. 证书导出的时候展开了证书,把个人私钥导了出来,导证书的时候请不要展开证书;
3.当前上传的证书环境不对,如:在上传开发证书的地方上传了生产证书;
4.该证书已在本账号的其它应用使用;
5.现上传的证书与当前应用已上传成功的证书的bundle id不一致。
6.没有重新创建和添加Provisioning Profile(描述文件)
总结&注意:
前面的几步虽然也重要,但就算有一步做错了也无所谓,大不了重新再来,但是第5步测试确认新证书非常关键,一定要要确认好,不然更新一个无效的证书,服务器无法推送就会造成故障了。如果自己做消息推送,后端不用自己去写推送代码,在这里推荐一个:APNS4j,比较好用:https://github.com/RamosLi/dbay-apns-for-java
package test;
import com.dbay.apns4j.impl.ApnsServiceImpl;
import com.dbay.apns4j.IApnsService;
import com.dbay.apns4j.model.*;
import java.io.InputStream;
public class ApnsPush {
private static IApnsService apnsService;
private static IApnsService getApnsService() {
if (apnsService == null) {
ApnsConfig config = new ApnsConfig();
InputStream is = ApnsPush.class.getClassLoader().getResourceAsStream("Certificates_Pro.p12");
config.setKeyStore(is);
config.setDevEnv(false);
config.setPassword("xxxxx");
config.setPoolSize(5);
apnsService = ApnsServiceImpl.createInstance(config);
}
return apnsService;
}
public static void main(String args[]){
try
{
String token = "01e983ed 662d7184 1454dbc4 35bd2a49 f5966ada 967f7b3f c0f68f03 09d454b8";
Payload payload = new Payload();
payload.setAlert("Hello, how are you?");
payload.setBadge(3);
payload.setSound("default-sound");
getApnsService().sendNotification(token, payload);
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
}