通过Java使用苹果推送通知服务(Use Apple Push Notification Servi

2019-08-03 05:00发布

想实现它发送一个苹果推送通知到iPhone客户端应用程序的Java程序......发现了以下库: Java的的APN

供应商代码:

创建(从Javapns)下面的代码在我的应用程序的使用方法:

try {
    PayLoad payLoad = new PayLoad();

    payLoad.addAlert("My alert message");
    payLoad.addBadge(45);
    payLoad.addSound("default");

    PushNotificationManager pushManager = PushNotificationManager.getInstance();
    pushManager.addDevice("iPhone", "f4201f5d8278fe39545349d0868a24a3b60ed732");
    log.warn("Initializing connectiong with APNS...");

    // Connect to APNs
    pushManager.initializeConnection(HOST, PORT, 
                                 "/etc/Certificates.p12", "password", 
    SSLConnectionHelper.KEYSTORE_TYPE_PKCS12);

    Device client = pushManager.getDevice("Lambo");

    // Send Push
    log.warn("Sending push notification...");
    PushNotificationManager.getInstance().sendNotification(client, payLoad);
 }
 catch (Exception e) {
    throw new ApnsPushNotificationException("Unable to send push " + e);
 }

当我运行这个程序(你可以通过Log4j的报表看)有发生也不例外:

  WARN  [MyCode] Initializing connectiong with APNS...
  WARN  [MyCode] Sending push notification...

但我的客户端应用程序没有收到任何通知!

IDPP注册流程:

此外,没有对iPhone开发者计划门户网站(IDPP)以下内容:

  • 创建基于APNS SSL证书和密钥

  • 创建和安装的供应配置文件

  • 安装SSL证书和服务器上的关键。

已经阅读过苹果推送通知服务指南几次,发现几件事情:

(1)在第15页,它指出该设备令牌不一样的设备UDID(我目前不正确地传递为PushNotificationManager.addDevice()方法中的第二个参数(见上文))。

第17页,它指出:

“的APN利用包含所述唯一的设备证书中的信息的设备令牌。该设备令牌包含设备的识别符。然后,它与令牌密钥加密设备令牌,并将其返回给设备,该设备的设备令牌返回到请求的应用程序作为一个NSData对象。然后,应用程序必须在二进制或十六进制格式递送设备令牌其提供者“。

iPhone OS客户端实现

(2)读取页33后 - 34,我发现我不包括Objective-C代码具有该应用与APN的注册。

我不是一个Objective-C开发人员,所以这是我在哪里可以恢复设备代码或我必须从证书怎么做呢?

我在哪里获得设备令牌(对不起,别人写的Objective-C的客户端应用程序,我是一个Java开发)?

问题(S):

(1)由于不知道从哪里得到的设备令牌和移动客户端的代码注册外,还有什么,我还没有看过去还是错过了什么?

(2)我使用的Javapns库的正确方法?

感谢您抽出时间来阅读...

Answer 1:

只是有一些小技巧,以便您接收到的令牌转换为适合与javapns登记的格式,这个代码就可以了:

- (NSString *)convertTokenToDeviceID:(NSData *)token {
NSMutableString *deviceID = [NSMutableString string];

// iterate through the bytes and convert to hex
unsigned char *ptr = (unsigned char *)[token bytes];

for (NSInteger i=0; i < 32; ++i) {
    [deviceID appendString:[NSString stringWithFormat:@"%02x", ptr[i]]];
}

return deviceID;

}



Answer 2:

作为一个可耻的自我广告,我建议使用java-apns库。 您的代码将是这样的:

ApnsService service =
     APNS.newService()
     .withCert("/etc/Certificates.p12", "password")
     .withSandboxDestination() // or .withProductionDestination()
     .build();

String payload =
    APNS.newPayload()
    .alertBody("My alert message")
    .badge(45)
    .sound("default")
    .build();

String deviceToken = "f4201f5d8278fe39545349d0868a24a3b60ed732";

log.warn("Sending push notification...");
service.push(deviceToken, payload);


Answer 3:

  1. 你的Java代码看起来坚实! 但是,不要忘记关闭连接,通过PushNotificationManager.closeConnection() 这之后,自己对清理重要。

    作为一个方面的评论,我注意到,您要添加的装置“iPhone”,但查询“兰博”之后。 这是一个错误的指示。

  2. 在代码中示出的设备令牌不正确。 装置凭证,目前,为32位长的值,它被诅咒成64个字符。 我认为推通知无效的令牌当服务器出现故障默默!

  3. 获取设备令牌的唯一方法是从应用程序本身。 正如所提供的推送通知指南建议,在iPhone应用程序需要为经推出注册通知。 在application:didRegisterForRemoteNotificationsWithDeviceToken:中,iPhone需要在设备令牌发送给你的java提供商服务器。 (为了调试的目的,你可以NSLog设备令牌和使用它,它永远不会通过运行变化)。

    我建议你在你的java提供商服务器创建一个服务器来接收设备令牌。 建立一个ServerSocket接收来自iPhone和他们的设备令牌(你需要任何额外的信息)连接,并在数据库中插入的标记。



Answer 4:

我想这和发送通知时,我不断收到吊死,没有东西送。

这个问题从以下功能梗:

         public void sendNotification(Device device, PayLoad payload) 

看来,BufferedReader中有NULL

           BufferedReader in = 
           new BufferedReader(new InputStreamReader(this.socket.getInputStream() ) );

因此,当这部分代码被击中它只是挂起那里死循环

  logger.debug( "In: [" + in.readLine() + "]" );

该输出是[空]

因此,然后再经过右边的循环得到执行:

      while ( ! this.socket.isInputShutdown() ) {
          while( in.ready() ) {
              logger.debug("ready now");
              logger.debug(in.readLine());
              System.out.println( this.socket.getInputStream().read() );
          }
      }

该代码进入第一while循环,等待的BufferedReader中做好准备,只是一直等待.....广告那是你的挂



Answer 5:

JavaPNS最近更新到2.0,并修复了所有报告的问题最多的发布日期。 它确实解决你所描述的问题,使用该库比以前(你可以把一个通知,一个单一的代码行现在)要简单得多。



Answer 6:

你似乎缺少令牌

pushManager.addDevice("iPhone", "f4201f5d8278fe39545349d0868a24a3b60ed732");

需要ID和令牌检查:

https://github.com/o-sam-o/javapns/blob/master/src/javapns/notification/PushNotificationManager.java#L501

获得令牌的唯一方法是从iPhone应用程序。 有效的标记看起来是这样的:1d2d6f34 c5028bca c50df5f9 1992c912 ce7deae8 3bbe7da5 447f6a68 cfecdc0e



文章来源: Use Apple Push Notification Service through Java