Quellcode durchsuchen

支持APNS p8证书

heavyrian2012 vor 9 Monaten
Ursprung
Commit
6cc3c15bb7

+ 6 - 0
apns/AuthKey_PXA4CCXXXX.p8

@@ -0,0 +1,6 @@
+-----BEGIN PRIVATE KEY-----
+MIGXAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQgGyCRn7aWnLChrRxF
+2Xf0PN7BOMIF4EQth/OynvzXY0ygCgYIKoZIzj0DAQehRANCAAQ9vdBVqZfAvFi+
+WSWiF1I9V54lt377jAPddY53Gd3f49imoE39C001TOhbso7t4U5+1m5gar6Y80fZ
+w1n01kI1
+-----END PRIVATE KEY-----

+ 9 - 0
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
 

+ 28 - 0
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;
+    }
 }

+ 51 - 18
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);
         }
     }