4

我正在尝试对 OS < 7.X 使用推送通知。

我下载了示例服务器/客户端代码。我在我的设备上部署了客户端代码,在提供的 tomcat 上部署了低级示例代码。

作为记录,当我在这里注册推送通知时,我使用 BIS 选项进行了注册。现在我实际上得到了一个黑莓,我被告知它正在使用 BES(我不认为这是我要描述的问题的根源......)。

在设备上,在示例应用程序中,我输入了我收到的电子邮件中给出的所有正确设置。

运行tomcat服务器的电脑和手机都连接到同一个wifi。

我正在尝试从设备浏览器连接到服务器,例如https://196.84.32.112:8443/low-level-sample

并且浏览器正常打开页面,这意味着我可以从手机连接到我的服务器。

现在,当我从设备示例应用程序中点击注册时(我在设置上尝试了 BIS/BES 选项),我总是收到以下错误:

注册请求失败。由 java.io.IOException 引起:网络操作 [订阅] 失败。确保 Content Provider URL 是可访问的。

在日志中我得到:

打开 URL:我的服务器 url 附加了用户名/密码/模型/连接类型等信息内容提供商网络命令 [订阅] 失败,由于无法连接到196.84.32.112:8443 命令“注册”失败,错误:java.io.IOException:网络操作[订阅] 失败。确保 Content Provider URL 是可访问的。

一个想法是我应该再次注册新的按键并使用 BIS/BES 选项而不是仅使用 BIS,但这里的问题似乎是与本地服务器没有连接,而不是 RIM 服务器。虽然我已经尝试注册,但我正在等待带有新设置的邮件。

我也对 BIS / BES 选项有点困惑。我不知道我的用户是否会启用 BIS 或 BES,那么我应该在我的代码中添加什么?!在示例应用程序中,它要求我在 BIS 或 BES 之间进行选择,但是当应用程序要投入生产时,我需要以编程方式做出选择,我会选择什么?!或者此选择仅用于应用程序的评估/开发,并且在生产中还有另一台服务器?

4

2 回答 2

3

我认为这里已经说了所有正确的事情,但我希望我们可以整合一些答案,并总结这个问题。

您还没有共享您的代码,这让事情变得更加困难,但是许多人使用 RIM/BlackBerry 提供的 PushDemo 源,其中连接后缀被硬编码在/pushdemo/com/rim/samples/device/push/PushUtils.java

private static String getConnectionSuffix() {
    return ";deviceside=false;ConnectionType=mds-public";
}

我也从阅读您的其他问题中猜到了这一点。

通过这样做,您对 BIBS 的 BlackBerry 传输类型进行了硬编码。 BlackBerry 支持多种不同的传输方式,例如 BES、BIS、BIBS 或 WAP。BIBS 传输会将请求从您的设备发送到互联网上的 BlackBerry 服务器。(注意:这部分可能会让 iOS/Android 开发人员感到困惑,因为这些平台不提供 Apple/Google 网络中介来中继正常的 HTTP/S 流量

然后,请求被转发到您的服务器,该服务器位于:

196.84.32.112:8443

我很确定 TCP/IP 端点在 Internet 上不可用(我无法访问它)。所以,这就是它对你失败的原因。

你可以拿这个网址

https://196.84.32.112:8443/low-level-sample

并将其粘贴到您的 BlackBerry 设备的浏览器中,它就可以工作了。您的设备配置为使用您公司的内部服务器的 BES。那些内部服务器可以到达196.84.32.112:8443端点,所以它似乎对你有用。但是,那是因为您没有硬编码transport,就像您在使用getConnectionSuffix(). 设备浏览器足够智能,可以找出有效的传输方式,而 BES 可以到达该Intranet服务器。

希望这可以解释令人困惑的部分。

解决方案

正如其他人所说,一个解决方案是让您公司的 IT 人员通过防火墙访问 IP 地址 196.84.32.112 和端口 8443。这将允许黑莓服务器成功访问它。

另一种解决方案是更改 PushUtils.java 代码以避免 BIBS 传输:

private static String getConnectionSuffix() {
    return ";deviceside=false";
}

如果你想要真正灵活的代码,那么我建议重写 PushUtils.java 代码,因为它似乎使用了 5.0 之前的 HTTP 连接逻辑。 当支持多种传输时,OS 5.0+ 中的 ConnectionFactory使这更容易,更健壮......

要回答有关支持用户使用多种传输方式的问题,请查看这个 blackberry.com 示例,特别是MyConnectionFactory该类。它允许您选择您的应用程序允许哪些传输,以及它首先尝试哪些传输

最终,是否公开您的服务器的决定取决于它的使用方式,以及您是否有非公司互联网客户端尝试在您的公司服务器上注册。

于 2013-04-17T08:00:02.707 回答
2

先解释一下BB Push Demo的注册流程:

当您点击注册设备将

  1. 通知您的 Web 应用程序该设备要注册。为此,它会将有关设备的信息发送到您的 Web 应用程序(所谓的 ContentProvider)。您应该将该信息存储在数据库中。这一步发生在ContentProviderProtocol.performCommand()推送演示的方法中。

  2. 通知 BB 推送服务器设备想要注册以接收来自您的应用程序的推送通知。这发生在BpasProtocol.register()push sdk 的方法中。

仅当您想知道谁都注册了推送通知时才需要第 1 步(也许如果您想向每个设备发送单独的推送通知而不是将消息广播给所有注册用户)。在这种情况下,您可能需要其他信息,例如该用户的偏好等来自定义推送。

现在您收到的错误来自第 1 步。要使第 1 步成功,您的设备应该能够连接到您无法连接的 Web 应用程序。

ContentProviderProtocol.performCommand()要解决此问题,您必须让您的 Web 应用程序可公开访问(并准备好处理负载),或者通过在不执行任何操作的情况下返回来从应用程序中注释掉第 1 步。

PS:步骤 1 中使用的 webapp 不必与您的推送发起者相同。webapp 只是用于跟踪所有注册接收推送的人,如果您期望有很多用户,理想情况下应该位于分布式架构的云中。

于 2013-04-17T07:48:21.660 回答