我试图对OS < 7.X使用推送通知。
我下载了示例服务器/客户端代码。我在我的设备上部署了客户机代码,在所提供的tomcat上部署了低级示例代码。
对于记录,当我在这里注册推送通知时,我使用BIS选项进行了注册。现在我收到了一部黑莓手机,我被告知它正在使用BES (我不认为这是我将要描述的问题的根源。)
在设备上,在示例应用程序中,我将从收到的电子邮件中提供的所有正确设置。
我的pc机运行着tomcat服务器,我的手机连接到同一个wifi上。
我正尝试从设备浏览器连接到服务器(如https://196.84.32.112:8443/low-level-sample )
浏览器通常会打开页面,这意味着我可以通过移动连接到服务器。
现在,当我从设备示例应用程序中点击寄存器(我在设置中尝试了BIS/BES选项)时,我总是会得到以下错误:
注册请求失败。由java.io.IOException引起:网络operationSubscribe失败。确保内容提供者URL是可访问的。。
在日志里我得到:
打开URL:我的服务器url附加了用户名/密码/模型/连接类型等信息,内容提供者网络命令订阅失败,原因是无法连接到196.84.32.112:8443 命令“注册失败”,错误: java.io.IOException:网络operationSubscribe失败。确保内容提供者URL是可访问的。。
一种想法是,我应该再次注册新的推送键,使用BIS/BES选项,而不是只使用BIS,但这里的问题似乎是与本地服务器的连接,而不是RIM服务器。不过,我已经试着注册了,我正在等待新设置的邮件。
另外,我对BIS / BES的选择有点困惑。我不知道我的用户是否会启用BIS或BES,所以我应该在代码中添加什么?!在样例应用程序中,它要求我在BIS或BES之间进行选择,但是当应用程序开始生产时,我需要以编程的方式做出选择,我将选择什么?!或者这个选择仅仅是为了评估/开发应用程序,而在生产中还有另一个服务器吗?
发布于 2013-04-17 08:00:02
我认为这里说的都是对的,但我希望我们能把一些答案合并起来,把这个问题总结一下。
您还没有共享代码,这使事情变得更加困难,但是许多人使用RIM/BlackBerry提供的PushDemo源代码,其中连接后缀是用/pushdemo/com/rim/samples/device/push/PushUtils.java硬编码的
private static String getConnectionSuffix() {
return ";deviceside=false;ConnectionType=mds-public";
}我也猜这是因为我读过你的另一个问题。
通过这样做,您已经对BlackBerry传输类型的BIBS进行了硬编码。BlackBerry支持许多不同的传输,像BES,BIS,BIBS,或WAP。BIBS传输将从您的设备发送请求,到黑莓的服务器,这是在互联网上。(注意:这部分可能让iOS/Android开发人员感到困惑,因为这些平台不提供苹果/谷歌网络中介来中继正常的HTTP/S通信)
然后,将请求转发到服务器,服务器位于:
196.84.32.112:8443我很确定TCP/IP端点在Internet上是不可用的(我无法到达它)。所以,这就是你失败的原因。
您可以接受这个URL
https://196.84.32.112:8443/low-level-sample并粘贴到您的BlackBerry设备的浏览器,它将工作。您的设备配置为BES,BES使用公司的内部服务器。这些内部服务器可以到达196.84.32.112:8443端点,因此它似乎适合您。但是,这是因为您没有像在使用getConnectionSuffix()的push代码中那样硬编码传输。设备浏览器足够聪明,可以找到一个工作的传输,而BES工作到内联网服务器。
希望这解释了令人困惑的部分。
解决方案
正如其他人所说,一个解决方案是让您公司的IT人员通过防火墙访问IP地址196.84.32.112和端口8443。这将使BlackBerry服务器能够成功地到达它。
另一种解决方案是更改PushUtils.java代码以避免BIBS传输:
private static String getConnectionSuffix() {
return ";deviceside=false";
}如果您想要非常灵活的代码,那么我建议重写该PushUtils.java代码,因为它似乎使用了pre-5.0HTTP连接逻辑。当支持多个传输时,操作系统中的ConnectionFactory 5.0+使它更容易、更健壮.
要回答有关支持多个传输的用户的问题,请查看这个blackberry.com示例,特别是MyConnectionFactory类。它允许您选择您的应用程序允许的传输,以及它首先尝试的传输。
最终,让您的服务器公开与否的决定取决于它将如何使用,以及您是否会有非公司互联网客户端试图在您的公司服务器注册。
发布于 2013-04-17 07:48:21
让我首先解释BB Push Demo的注册流程:
当您单击“注册”时,设备将
ContentProviderProtocol.performCommand()方法中。BpasProtocol.register()方法中。只有当您想知道推送通知的注册对象(可能是希望向每个设备发送单独的推送通知,而不是向所有注册用户广播消息时),第1步才是必要的。在这种情况下,您可能需要其他信息,如该用户的首选项等来定制推送。
现在,您正在获得的错误是从步骤1。要成功的步骤1,您的设备应该能够连接到您的web应用程序,它无法。
要解决这个问题,要么让您的web应用程序可以公开访问(并准备好处理加载),要么通过让ContentProviderProtocol.performCommand()返回而不做任何事情来注释掉应用程序的第一步。
PS:在步骤1中使用的webapp不需要与您的推送发起者相同。webapp只是用于跟踪所有注册接收推送的用户,如果您期望有很多用户,那么理想的位置应该是在分布式架构上的云中。
https://stackoverflow.com/questions/15947917
复制相似问题