当前位置: 首页 > 面试题库 >

通过Java使用Apple Push Notification Service

葛成双
2023-03-14
问题内容

我正在尝试实现将Apple Push
Notification发送到iPhone客户端应用程序的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指南》,并注意到以下几点:

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

在第17页,它指出:


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

iPhone OS客户端实施

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

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

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

问题:

(1)除了不知道从何处获取设备令牌和移动客户端代码注册外,还有其他我没有看过或错过的事情吗?

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

感谢您抽出时间来阅读…


问题答案:

一点提示,为了将收到的令牌转换为适合用html" target="_blank">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;

}



 类似资料:
  • 问题内容: 我正在尝试使用Java的Google Sheet API将值写入单元格。为了阅读,我使用了Java Quickstart的指南 ,该指南对我来说效果很好。 要写入Google表格,我使用: 该函数在运行时输出以下错误: 我正在使用的身份验证范围 问题答案: 显然有几个问题在一起: 删除存储在/Users/XXX/.credentials中的凭据。 将范围更改为SheetsScopes.

  • 我在使用JNA的java中使用dll,但我得到以下错误 线程“main”java中出现异常。lang.UnsatifiedLinkError:查找函数“GetStatus”时出错:找不到指定的过程。 不知道如何解决此问题? 请帮忙。 这是java代码

  • 问题内容: 我需要使用JavaScript中jar文件中的类。我正在通过Java ScriptEngine使用JavaScript,并且想做一些与Jython相似的事情, 当我使用Jython执行此操作时,它工作正常,并且python文件可以使用jar文件中的api类。 问题答案: 我可以以此方式在JavaScript中使用jar的类,但是在运行时必须将jar设置为类路径。我正在寻求类似于Jyth

  • 我想用Java从我的公司Outlook帐户发送邮件。但它说邮箱无法访问。我试过各种解决方案,比如更改主机名,但还是不行。错误保持不变。请对此提出任何解决方案。下面是我面临的错误片段。注意:我使用javax mail来实现这个目的。

  • 问题内容: 我有一个旧类,其中包含用于实例化LoginContext()的new()调用: 我想使用Mockito测试类来模拟LoginContext,因为它要求在实例化之前设置JAAS安全性,但是我不确定如何在不更改login()方法以外部化LoginContext的情况下进行此操作。是否可以使用Mockito模拟LoginContext类? 问题答案: 对于将来,我会推荐伊兰·哈雷尔(Eran

  • 问题内容: 寻找一种将图像压缩为pdf格式并输出pdf进行存档的方法。我无法在创建图像之前对其进行压缩,因为这会影响打印质量。 每个pdf的大小约为8MB,其中大部分由2张图片组成。图片为png格式,并在生成过程中转换为pdf(使用了第三方生成器) 有没有一种方法可以在不使用第3方工具的情况下用Java压缩它们。我尝试使用pdfbox,itext和第3方exe(neevia),第3方工具是迄今为止