我需要向IOS设备发送通知,我们使用Java作为后端。 我正在使用notnoop/java-apns库将通知推送到IOS设备。
当我尝试使用生产证书和生产目标推送到APNS时,我收到 SocketException:连接由远程主机关闭。
service = APNS.newService()
.withCert(classLoader.getResourceAsStream("files/Production_Certificate.p12"), "password")
.withDelegate(delegate)
.withProductionDestination()
.build();
当我使用开发证书和沙盒目的地时,一切都运行良好,设备会收到推送通知。
我尝试使用其他工具和我们的生产证书推送通知并收到推送,因此证书有效。 我不明白出了什么问题。我做错了什么,或者是网络相关的问题或库中的错误?
以下是堆栈跟踪: -
3次重试后无法发送消息。消息(Id = 1; 标记= 0557A5BE7EEA5718A1064FC138EEE855BBDDE15FC8C5841CEADBAD2716A42AEC; Payload = {“aps”:{“alert”:{“body”:“任务已分配给 你。“,”标题“:”新任务!“},”声音“:”默认“,”徽章“:1}}) java.net.SocketException:由远程主机关闭的连接 sun.security.ssl.SSLSocketImpl.checkWrite(SSLSocketImpl.java:1490)at at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:123)at at java.io.OutputStream.write(OutputStream.java:75)at 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) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at 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.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:319) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.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) 在com.sun.proxy。$ Proxy136.pushNotificationsInBulk(未知来源)at com.mobileinsight.api.quartz.PushNotificationBatchRunner.doWork(PushNotificationBatchRunner.java:24) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at 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) 在 org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:53) 在 java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:471) 在java.util.concurrent.FutureTask.runAndReset(FutureTask.java:304)at java.util.concurrent.ScheduledThreadPoolExecutor中的$ ScheduledFutureTask.access $ 301(ScheduledThreadPoolExecutor.java:178) 在 java.util.concurrent.ScheduledThreadPoolExecutor中的$ ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 在 java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:615) 在java.lang.Thread.run(Thread.java:745)
答案 0 :(得分:2)
最后,弄明白了这个问题。此库接受的p12文件应仅包含一个证书,在本例中为生产证书。
我们一直使用的密钥库文件包含多个证书。 java库对于选择哪个而感到困惑。 Java的SSL系统自动使用文件中的第一个证书,因此显然一个服务器或另一个服务器永远不会工作,具体取决于文件中证书的顺序。
为了解决这个问题,我们为每个文件生成了一个不同的密钥库文件。所以我们只从钥匙串中导出(到.p12格式)生产证书。
如果p12文件只包含一个证书,即使是pushy库也可以。
答案 1 :(得分:0)
检查您是否在网络代理服务器后面。尝试ping目标IP地址。