2016-11-17 150 views
0

所以,我试图从Java与APNS进行通信。我找到了java-apns,javapns和pushy库。 Java-apns似乎拥有最充足的API。Java:推送通知但未收到

初始化:

public static void main(String[] args) { 
    String certificateFilePath = args[0]; // "/path/to/cert.p12" 
    apnsService = APNS.newService() 
     .withCert(certificateFilePath, Config.APNS_PROVIDER_CERTIFICATE_PASSWORD) 
     .withDelegate(new ApnsDelegate() { 
      @Override 
      public void messageSent(ApnsNotification apnsNotification, boolean b) { 
       System.out.println("message sent"); 
      } 

      @Override 
      public void messageSendFailed(ApnsNotification apnsNotification, Throwable throwable) { 
       System.out.println("message failed"); 
      } 

      @Override 
      public void connectionClosed(DeliveryError deliveryError, int i) { 
       System.out.println("connection closed"); 
      } 

      @Override 
      public void cacheLengthExceeded(int i) { 
       System.out.println("cache length exceeded"); 
      } 

      @Override 
      public void notificationsResent(int i) { 
       System.out.println("notification resent"); 
      } 
     }) 
     .withSandboxDestination() 
     .build(); 

    ... 

} 

此时iOS应用在设备上启动。本地和远程通知已注册,设备令牌已获取并发送到服务器。

然后一些事件发生,我发送通知:

static void sendMessage(List<String> tokens, String message) { 
    String payload = APNS.newPayload().alertBody(message).build(); 
    apnsService.push(tokens, payload); 
} 

每个令牌是一样的东西"5fb58761f9...4e92465e12"

ApnsDelegate说的唯一的东西是“消息发送”,但设备上没有任何反应。我认为这条消息是真正发送的,因为我试图发送带有损坏的令牌的通知,在这种情况下,我收到“消息失败”,并提示有关无效令牌的错误。

所以,其实我甚至不明白我的问题的起源。但是我觉得它是用Java编写的,因为iOS部分非常简单,与服务器端相比,它的所有HTTP/2-voodoo-stuff都是。

+0

哪款iPhone OS? – iMHitesh

+0

@Hiteshsurani,我使用iOS10在设备上进行测试,但我的部署目标是8.0 – seelts

+0

如果12K用户(如@RadLexus)的编辑不符合您的喜好,那么可能值得让他们询问编辑的目的。在这种情况下,这是非常正确的 - 我们不使用[解决]标题攻击,也没有解决方案的答案。总是把它们放在一个答案中,我已经在下面为你做了答案。 – halfer

回答

1

感谢您提出这个问题。

我都面临着同样的问题,当与iOS 10.

工作,如果你已经与iOS 10或以上的工作,那么它是强制性的,以在功能远程通知。

转到-> Project setting -> capabilities -> Enable Push Notifications.

进入 - >Project setting ->能力-> Background Mode -> Enable Remote Notification and VoIp

UPDATE:

如果你想以文件的精确解,然后如下本地检查。

here

下载simplepush.php保存.pem文件同一目录下。

替换您的.pem文件名和simplepush.php

打开终端

转到您的simplepush.php目录。

执行以下命令

php simplepush.php 

如果你有接收推送则需要从java末检查,否则检查到的iOS结束

+0

这些选项已启用。看起来这不是重点。 – seelts

1

(发布代表OP)的

我解决了它,这是我的愚蠢的错误!当我期待看到通知时,该应用程序处于前台。关闭后,通知开始出现。

1

如果您的应用程序位于前台,则说明iOS没有“显示”通知是正确的。然而,通知事件确实发生,如果你的AppDelegate中有正确的方法,iOS会为你的应用程序提供通知载荷。然后,您可以在后台执行某些操作,或者您可以显示自己的UI(例如,在应用内显示带有数字徽章的气球)。

查看Apple doc for didReceiveRemoteNotification

+0

在我的情况下''didReceiveRemoteNotification'不会在应用程序处于前景时调用 – seelts

+0

实际上有两种形式的disReceiveRemoteNotification。一个具有比另一个更多的参数(一个提取完成处理程序)。对于iOS10,这是您必须支持的版本,即使在前台,它也应该在所有通知上进行调用。但是,您可能仍需要实施其他表单,具体取决于您使用的SDK来构建。确保你实现了两者并检查是否有人射击。请参阅https://developer.apple.com/reference/uikit/uiapplicationdelegate/1623013-application – ericWasTaken

+0

我已使用这两种表单进行了测试 – seelts