0

我需要向 IOS 设备发送通知,我们使用 Java 作为后端。我正在使用notnoop/java-apns库将通知推送到 IOS 设备。

当我尝试使用生产证书和生产目标推送到 APNS时,出现SocketException:Connection closed by remote host 。

service = APNS.newService()
            .withCert(classLoader.getResourceAsStream("files/Production_Certificate.p12"), "password")
            .withDelegate(delegate)
            .withProductionDestination()
            .build();

当我使用开发证书和沙盒目的地时,一切正常,设备收到推送通知。

我尝试使用另一个工具和我们的生产证书推送通知,并且推送已收到,因此证书有效。我不明白出了什么问题。我是在做错什么,还是与网络相关的问题或图书馆出了什么问题?

以下是堆栈跟踪:-

重试 3 次后无法发送消息。Message(Id=1; Token=0557A5BE7EEA5718A1064FC138EEE855BBDDE15FC8C5841CEADBAD2716A42AEC; Payload={"aps":{"alert":{"body":"任务已分配给您。","title": “新任务!”},“声音”:“默认”,“徽章”:1}})java.net.SocketException:连接被远程主机在sun.security.ssl.SSLSocketImpl.checkWrite(SSLSocketImpl.java:1490 ) 在 sun.security.ssl.AppOutputStream.write(AppOutputStream.java:123) 在 java.io.OutputStream.write(OutputStream.java:75) 在 com.notnoop.apns.internal.ApnsConnectionImpl.sendMessage(ApnsConnectionImpl.java: 328) 在 com.notnoop.apns.internal.ApnsConnectionImpl.sendMessage(ApnsConnectionImpl.java:312) 在 com.notnoop.apns.internal.ApnsServiceImpl.push(ApnsServiceImpl.java:46) 在 com.notnoop.apns.internal.AbstractApnsService.push(AbstractApnsService.java:89) 在 com.notnoop.apns.internal.ApnsServiceImpl.push(ApnsServiceImpl.java:36) 在 com.mobileinsight.api.service.impl .IOSBroadcastServiceImpl.broadcastNewTaskNotifications(IOSBroadcastServiceImpl.java:125) 在 com.mobileinsight.api.service.impl.IOSBroadcastServiceImpl.broadcastIOSPushNotifications(IOSBroadcastServiceImpl.java:60) 在 com.mobileinsight.api.service.impl.PushNotificationServiceImpl.pushNotificationsInBulk(PushNotificationServiceImpl.java) :29) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang。反射.Method.invoke(Method.java:606) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) 在 org.springframework.aop.framework.ReflectiveMethodInvocation 的 org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:319) .proceed(ReflectiveMethodInvocation.java:150) 在 org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 在 org. springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) at com.sun.proxy.$Proxy136.pushNotificationsInBulk(Unknown Source) at com.mobileinsight.api.quartz.PushNotificationBatchRunner.doWork(PushNotificationBatchRunner.java:24)在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method. java:606) at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:64) at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:53) at java.util.concurrent.Executors $RunnableAdapter.call(Executors.java:471) at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:304) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178) at java .util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask。在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 在 java.lang.Thread 的 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 运行 (ScheduledThreadPoolExecutor.java:293) .run(Thread.java:745)

4

2 回答 2

2

终于,想通了问题所在。这个库接受的 p12 文件应该只包含一个证书,在这种情况下是生产证书。

我们一直使用的密钥库文件包含多个证书。java 库对选择哪个感到困惑。Java 的 SSL 系统自动使用文件中的第一个证书,因此很明显,一个服务器或另一个服务器永远不会工作,这取决于文件中证书的顺序。

为了解决这个问题,我们为每个生成了不同的密钥库文件。所以我们只从钥匙串中导出(到 .p12 格式)生产证书。

如果 p12 文件只包含一个证书,那么即使是 pushy 库也可以工作。

于 2015-12-10T16:16:26.607 回答
0

检查您是否在网络代理后面。尝试 ping 目标 IP 地址。

于 2015-12-05T16:10:41.987 回答