8

我正在尝试实现一个向 iPhone 客户端应用程序发送 Apple 推送通知的 Java 程序...找到以下库:Java APNs

提供者代码:

创建了以下代码(来自 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 证书和密钥。

多次阅读 Apple Push Notification Service Guide 并注意到以下几点:

(1) 在第 15 页,它指出设备令牌与设备 UDID 不同(我目前错误地将其作为 PushNotificationManager.addDevice() 方法中的第二个参数传入(见上文))。

在第 17 页,它指出:

“APNs 使用唯一设备证书中包含的信息生成设备令牌。设备令牌包含设备的标识符。然后它使用令牌密钥加密设备令牌并将其返回给设备。设备将设备令牌返回给请求应用程序作为 NSData 对象。然后应用程序必须以二进制或十六进制格式将设备令牌传递给它的提供者。

iPhone OS 客户端实现

(2) 阅读第 33 - 34 页后,我发现我没有包含使应用程序注册到 APN 的 Objective-C 代码。

我不是 Objective-C 开发人员,所以这是我可以恢复设备代码的地方,还是我必须从证书中获取它?

我从哪里获得设备令牌(抱歉,其他人编写了 Objective-C 客户端应用程序,而我是 Java 开发人员)?

问题):

(1)除了不知道从哪里获取设备令牌和移动客户端代码注册之外,还有什么我没有看过或错过的吗?

(2) 我是否以正确的方式使用 Javapns 库?

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

4

6 回答 6

18

作为可耻的自我广告,我鼓励使用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);
于 2009-11-25T21:42:07.750 回答
8

只是一个小提示,为了将您收到的令牌转换为适合使用 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;

}

于 2009-10-09T14:19:54.170 回答
2

我试过这个,在发送通知时我一直被绞死,什么都没有发送。

问题源于以下功能:

         public void sendNotification(Device device, PayLoad payload) 

看来bufferedreader有NULL

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

因此,当这部分代码被击中时,它就会无限循环地挂在那里

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

此输出为 [null]

因此,紧接着循环被执行:

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

代码进入第一个 while 循环并等待 BufferedReader 准备就绪,然后继续等待.....广告就是你的挂

于 2011-07-25T00:00:19.310 回答
1
  1. 您的 Java 代码看起来很可靠!但是,不要忘记关闭连接,通过PushNotificationManager.closeConnection(). 自己打扫卫生很重要。

    作为旁注,我注意到您正在添加设备“iPhone”,但之后查询“Lambo”。这是一个错误的迹象。

  2. 代码中显示的设备令牌不正确。设备令牌,目前,作为 32 位长值,被十六进制转换为 64 个字符。我假设服务器在将通知推送到无效令牌时静默失败!

  3. 获取设备令牌的唯一方法是从应用程序本身。正如推送通知指南所建议的那样,iPhone 应用程序需要在启动时注册通知。在 中application:didRegisterForRemoteNotificationsWithDeviceToken:,iPhone 需要将设备令牌发送到您的 java 提供程序服务器。(出于调试目的,您可以只NSLog使用设备令牌并使用它;它永远不会随着运行而改变)。

    我建议您在 java 提供程序服务器中创建一个服务器来接收设备令牌。设置一个ServerSocket以接收来自 iPhone 的连接及其设备令牌(以及您需要的任何其他信息)并将令牌插入数据库中。

于 2009-08-31T14:14:40.743 回答
0

你似乎错过了令牌

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

进行 id 和 token 检查:

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

获取令牌的唯一方法是通过 iphone 应用程序。有效令牌如下所示: 1d2d6f34 c5028bca c50df5f9 1992c912 ce7deae8 3bbe7da5 447f6a68 cfecdc0e

于 2009-08-31T05:03:27.153 回答
0

JavaPNS 最近更新到 2.0,并修复了截至发布日期的所有报告问题。它确实解决了您所描述的问题,并且使用该库比以往任何时候都简单得多(您现在可以使用一行代码推送通知)。

于 2011-10-10T22:29:20.547 回答