文章源地址: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();
}
}
}