From 6cc3c15bb713b82dcb697fcf857932e71d6c94c1 Mon Sep 17 00:00:00 2001 From: heavyrian2012 Date: Mon, 16 Dec 2024 21:53:50 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81APNS=20p8=E8=AF=81=E4=B9=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apns/AuthKey_PXA4CCXXXX.p8 | 6 ++ config/apns.properties | 9 +++ .../cn/wildfirechat/push/ios/ApnsConfig.java | 28 ++++++++ .../cn/wildfirechat/push/ios/ApnsServer.java | 69 ++++++++++++++----- 4 files changed, 94 insertions(+), 18 deletions(-) create mode 100644 apns/AuthKey_PXA4CCXXXX.p8 diff --git a/apns/AuthKey_PXA4CCXXXX.p8 b/apns/AuthKey_PXA4CCXXXX.p8 new file mode 100644 index 0000000..91523e6 --- /dev/null +++ b/apns/AuthKey_PXA4CCXXXX.p8 @@ -0,0 +1,6 @@ +-----BEGIN PRIVATE KEY----- +MIGXAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQgGyCRn7aWnLChrRxF +2Xf0PN7BOMIF4EQth/OynvzXY0ygCgYIKoZIzj0DAQehRANCAAQ9vdBVqZfAvFi+ +WSWiF1I9V54lt377jAPddY53Gd3f49imoE39C001TOhbso7t4U5+1m5gar6Y80fZ +w1n01kI1 +-----END PRIVATE KEY----- \ No newline at end of file diff --git a/config/apns.properties b/config/apns.properties index 19299dc..3f56924 100644 --- a/config/apns.properties +++ b/config/apns.properties @@ -1,8 +1,17 @@ +# p12证书和p8证书选一个就行。如果选p12证书,请把 apns.auth_key_path的这几行删掉。 + +# p12证书配置。 apns.cer_path=apns/wfc.p12 apns.cer_pwd=123456 apns.voip_cer_path=apns/wfc_voip.p12 apns.voip_cer_pwd=123456 +# p8证书配置 +apns.auth_key_path=apns/AuthKey_PXA4CCXXXX.p8 +apns.key_id=PXA4CCXXXX +apns.team_id=Y8356MXXXX + +# 铃声配置 apns.alert=default apns.voip_alert=ring.caf diff --git a/src/main/java/cn/wildfirechat/push/ios/ApnsConfig.java b/src/main/java/cn/wildfirechat/push/ios/ApnsConfig.java index 46d4fa8..8d4439b 100644 --- a/src/main/java/cn/wildfirechat/push/ios/ApnsConfig.java +++ b/src/main/java/cn/wildfirechat/push/ios/ApnsConfig.java @@ -11,6 +11,10 @@ public class ApnsConfig { String cerPath; String cerPwd; + String authKeyPath; + String keyId; + String teamId; + String voipCerPath; String voipCerPwd; @@ -74,4 +78,28 @@ public class ApnsConfig { public void setVoipFeature(boolean voipFeature) { this.voipFeature = voipFeature; } + + public String getAuthKeyPath() { + return authKeyPath; + } + + public void setAuthKeyPath(String authKeyPath) { + this.authKeyPath = authKeyPath; + } + + public String getKeyId() { + return keyId; + } + + public void setKeyId(String keyId) { + this.keyId = keyId; + } + + public String getTeamId() { + return teamId; + } + + public void setTeamId(String teamId) { + this.teamId = teamId; + } } diff --git a/src/main/java/cn/wildfirechat/push/ios/ApnsServer.java b/src/main/java/cn/wildfirechat/push/ios/ApnsServer.java index e99fcd4..5f359b9 100644 --- a/src/main/java/cn/wildfirechat/push/ios/ApnsServer.java +++ b/src/main/java/cn/wildfirechat/push/ios/ApnsServer.java @@ -4,6 +4,7 @@ import cn.wildfirechat.push.PushMessage; import cn.wildfirechat.push.PushMessageType; import cn.wildfirechat.push.Utility; import com.turo.pushy.apns.*; +import com.turo.pushy.apns.auth.ApnsSigningKey; import com.turo.pushy.apns.metrics.micrometer.MicrometerApnsClientMetricsListener; import com.turo.pushy.apns.util.ApnsPayloadBuilder; import com.turo.pushy.apns.util.SimpleApnsPushNotification; @@ -21,6 +22,8 @@ import org.springframework.util.StringUtils; import javax.annotation.PostConstruct; import java.io.File; import java.io.IOException; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; import java.util.Calendar; import static java.lang.System.exit; @@ -56,34 +59,64 @@ public class ApnsServer { } try { - productSvc = new ApnsClientBuilder() - .setApnsServer(ApnsClientBuilder.PRODUCTION_APNS_HOST) - .setClientCredentials(new File(mConfig.cerPath), mConfig.cerPwd) - .setMetricsListener(productMetricsListener) - .build(); - - developSvc = new ApnsClientBuilder() - .setApnsServer(ApnsClientBuilder.DEVELOPMENT_APNS_HOST) - .setClientCredentials(new File(mConfig.cerPath), mConfig.cerPwd) - .setMetricsListener(developMetricsListener) - .build(); - - if (mConfig.voipFeature) { - productVoipSvc = new ApnsClientBuilder() + if (!StringUtils.isEmpty(mConfig.authKeyPath) && !StringUtils.isEmpty(mConfig.keyId) && !StringUtils.isEmpty(mConfig.teamId)) { + productSvc = new ApnsClientBuilder() .setApnsServer(ApnsClientBuilder.PRODUCTION_APNS_HOST) - .setClientCredentials(new File(mConfig.voipCerPath), mConfig.voipCerPwd) + .setSigningKey(ApnsSigningKey.loadFromPkcs8File(new File(mConfig.authKeyPath), mConfig.teamId, mConfig.keyId)) .setMetricsListener(productMetricsListener) .build(); - developVoipSvc = new ApnsClientBuilder() + + developSvc = new ApnsClientBuilder() .setApnsServer(ApnsClientBuilder.DEVELOPMENT_APNS_HOST) - .setClientCredentials(new File(mConfig.voipCerPath), mConfig.voipCerPwd) + .setSigningKey(ApnsSigningKey.loadFromPkcs8File(new File(mConfig.authKeyPath), mConfig.teamId, mConfig.keyId)) .setMetricsListener(developMetricsListener) .build(); - } + if (mConfig.voipFeature) { + productVoipSvc = new ApnsClientBuilder() + .setApnsServer(ApnsClientBuilder.PRODUCTION_APNS_HOST) + .setSigningKey(ApnsSigningKey.loadFromPkcs8File(new File(mConfig.authKeyPath), mConfig.teamId, mConfig.keyId)) + .setMetricsListener(productMetricsListener) + .build(); + developVoipSvc = new ApnsClientBuilder() + .setApnsServer(ApnsClientBuilder.DEVELOPMENT_APNS_HOST) + .setSigningKey(ApnsSigningKey.loadFromPkcs8File(new File(mConfig.authKeyPath), mConfig.teamId, mConfig.keyId)) + .setMetricsListener(developMetricsListener) + .build(); + } + } else { + productSvc = new ApnsClientBuilder() + .setApnsServer(ApnsClientBuilder.PRODUCTION_APNS_HOST) + .setClientCredentials(new File(mConfig.cerPath), mConfig.cerPwd) + .setMetricsListener(productMetricsListener) + .build(); + + developSvc = new ApnsClientBuilder() + .setApnsServer(ApnsClientBuilder.DEVELOPMENT_APNS_HOST) + .setClientCredentials(new File(mConfig.cerPath), mConfig.cerPwd) + .setMetricsListener(developMetricsListener) + .build(); + + if (mConfig.voipFeature) { + productVoipSvc = new ApnsClientBuilder() + .setApnsServer(ApnsClientBuilder.PRODUCTION_APNS_HOST) + .setClientCredentials(new File(mConfig.voipCerPath), mConfig.voipCerPwd) + .setMetricsListener(productMetricsListener) + .build(); + developVoipSvc = new ApnsClientBuilder() + .setApnsServer(ApnsClientBuilder.DEVELOPMENT_APNS_HOST) + .setClientCredentials(new File(mConfig.voipCerPath), mConfig.voipCerPwd) + .setMetricsListener(developMetricsListener) + .build(); + } + } } catch (IOException e) { e.printStackTrace(); exit(-1); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException(e); + } catch (InvalidKeyException e) { + throw new RuntimeException(e); } }