【问题标题】:Push Notifications through BES/BIS , BlackBerry通过 BES/BIS、BlackBerry 推送通知
【发布时间】:2013-04-11 11:44:05
【问题描述】:

我正在尝试使用 OS

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

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

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

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

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

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

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

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

在日志中我得到:

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

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

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

【问题讨论】:

  • 这看起来像是网络问题。您的服务器可能需要一个公共 IP,以便 RIM(现在是 BlackBerry)服务器可以从 Internet 访问它。如果您已经有,请检查防火墙等。首先尝试使用 BIS 设备。
  • 史密斯先生是对的。从客户端到您的服务器进行注册的联系路径是 BB -> ROC -> Server。所以你的服务器需要有一个公共IP。如果 BB 在 BES 上,您可以使用 BES 服务器进行推送,在这种情况下,BES 服务器会替换 ROC,实际上这样做要简单得多。然而,使用 BIS 推送更加灵活。
  • 我在 BES 服务器上没有任何权限。我刚刚得到了一个带有 BES 的设备。好的,我将尝试使服务器可公开访问,但如果可以的话,仍然需要澄清一下。在示例应用程序中,它询问我是 BES 还是 BIS。我是 BES,但最终用户显然是 BIS,我必须在生产版本中以编程方式选择什么?现在我是 BES,我应该要求 BIS/BES 的新密钥还是我拥有的 BIS 就足够了?为什么我在某处读到当我是 BES 时我不需要这些凭据?
  • 在客户端应用程序中。它要求使用企业(BES)网络或使用公共(BIS)网络,您必须选择。如果您选择 BIS,则需要指定 BPS 服务器,如果您使用 BES,则不需要指定。所以我们在这里说同样的话
  • 我很确定推送发起服务器应该可以从 Internet 访问,即使它没有多大意义。至于 BB,如果是 BES 设备,则应正确配置为通过 BIS 浏览(服务手册、运营商计划等)。顺便说一句,这个问题可能已经澄清了here

标签: blackberry push-notification


【解决方案1】:

我认为这里所说的一切都是正确的,但我希望我们可以整合一些答案,并总结这个问题。

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

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

我也从阅读your other question 中猜到了这一点。

通过这样做,您已经硬编码了 BIBS 的 BlackBerry 传输类型。 BlackBerry supports many different transports,如 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 端点,所以它似乎对你有用。但是,这是因为您没有像在使用 getConnectionSuffix() 的推送代码中那样对 transport 进行硬编码。设备浏览器足够智能,可以找出有效的传输方式,并且 BES 可以到达该内联网服务器。

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

解决方案

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

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

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

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

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

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

【讨论】:

  • 谢谢内特。赏金是你的:)
  • 不客气。您是否最终修改了代码以使用不同的连接后缀,或者使用ConnectionFactory
【解决方案2】:

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

当你点击注册设备时

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

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

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

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

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

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

【讨论】:

  • 非常感谢 adwiv。你的回答帮助理解了很多,但在回答之后不可能不给 Nate 赏金。为您的有用帖子投票:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多