SocketException:当推送到生产目标

时间:2015-12-05 16:04:38

标签: java ios push-notification apple-push-notifications javaapns

我需要向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)

2 个答案:

答案 0 :(得分:2)

最后,弄明白了这个问题。此库接受的p12文件应仅包含一个证书,在本例中为生产证书。

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

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

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

答案 1 :(得分:0)

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