我正在尝试使用OS的推送通知< 7.X。
我下载了示例服务器/客户端代码。我在我的设备上部署了客户端代码,并在tomcat上提供了低级示例代码。
对于记录,当我在这里注册推送通知时,我使用BIS选项注册。现在我真的被给了黑莓,我被告知它正在使用BES(我不认为这是我要描述的问题的根源。)。
在设备上,在示例应用程序中,我输入了收到的电子邮件中提供的所有正确设置。
我运行tomcat服务器的电脑和我的手机都连接到同一个wifi。
我正在尝试从设备浏览器连接到服务器,例如https://196.84.32.112:8443/low-level-sample
并且浏览器正常打开页面,这意味着我可以从移动设备连接到我的服务器。
现在,当我从设备示例应用程序中点击注册时(我在设置上尝试了两个BIS / BES选项),我总是会收到以下错误:
请求注册失败。原因java.io.IOException:网络操作[订阅]失败。确保可以访问内容提供商网址。
在日志中我得到:
打开网址:我的服务器网址附有用户名/密码/型号/连接类型等信息
内容提供商网络命令[订阅]失败,由无法连接到196.84.32.112:8443
引起
命令“register”失败,错误:java.io.IOException:网络操作[订阅]失败。确保可以访问内容提供商网址。
一个想法是我应该再次注册新的按键并使用BIS / BES选项而不是仅使用BIS,但这里的问题似乎是没有与本地服务器连接,而不是RIM服务器。我已经尝试注册了,我正在等待使用新设置的邮件。
我也对BIS / BES选项感到困惑。我不知道我的用户是否会启用BIS或BES,所以我在代码中添加了什么?在示例应用程序中,它要求我在BIS或BES之间进行选择,但是当应用程序进入生产阶段时,我需要以编程方式做出选择我会选择什么?!或者这个选择仅用于评估/开发应用程序,在生产中还有另一个服务器?
答案 0 :(得分:3)
我认为这里已经说了所有正确的事情,但我希望我们能够巩固一些答案,并将这个问题包起来。
您尚未共享代码,这使得事情变得更加困难,但很多人使用RIM / BlackBerry提供的PushDemo源,其中连接后缀在/pushdemo/com/rim/samples/device/push/PushUtils.java
中进行了硬编码:
private static String getConnectionSuffix() {
return ";deviceside=false;ConnectionType=mds-public";
}
我也是通过阅读your other question来猜测的。
通过执行此操作,您已对BlackBerry传输类型的BIBS进行了硬编码。 BlackBerry supports many different transports,如BES,BIS,BIBS或WAP。 BIBS传输将把您的设备请求发送到互联网上的BlackBerry服务器。 (注意:这部分可能会让iOS / Android开发人员感到困惑,因为这些平台不提供Apple / Google网络中介来传输正常的HTTP / S流量)
然后,请求被中继到您的服务器,该服务器位于:
196.84.32.112:8443
我很确定无法从Internet上获得TCP / IP端点(我无法访问它)。所以,这就是为什么它失败了。
您可以使用此网址
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。这将允许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
类。它允许您选择应用允许的传输,以及首先尝试的。
最终,决定是否公开您的服务器取决于它将如何使用,以及您是否会让非公司互联网客户端尝试向您的公司服务器注册。
答案 1 :(得分:2)
首先让我解释一下BB Push Demo的注册流程:
当您点击注册设备
时通知您的Web应用程序设备要注册。为此,它会将有关设备的信息发送到您的Web应用程序(所谓的ContentProvider)。您应该将该信息存储在数据库中。此步骤发生在推送演示的ContentProviderProtocol.performCommand()
方法中。
通知BB推送服务器设备要注册以接收来自您的应用程序的推送通知。这种情况发生在push sdk的BpasProtocol.register()
方法中。
步骤1仅在您想要知道所有人都已注册推送通知时(例如,您可能希望向每个设备发送单独的推送通知而不是向所有注册用户广播该消息)。在这种情况下,您可能还需要其他信息,例如用户的偏好等,以便自定义推送。
现在您收到的错误来自第1步。要使第1步成功,您的设备应该能够连接到您无法使用的网络应用。
要解决此问题,您必须使您的网络应用程序可公开访问(并准备好处理负载),或通过使ContentProviderProtocol.performCommand()
返回而不做任何操作,从应用程序注释掉第1步。
PS:步骤1中使用的webapp不一定与推送发起者相同。 webapp仅用于跟踪所有注册接收推送的人员,如果您期望很多用户,则理想情况下应该位于云中的分布式架构上。