我试图使用推送通知OS <7.X。
我下载的样本服务器/客户端的代码。 我部署了我的设备和所提供的tomcat的低级别的示例代码在客户端代码。
为了记录在案,当我注册了这里推送通知我注册使用BIS选项。 现在,我其实是给黑莓我是它使用BES通知(我不认为虽然这是我要说明问题的根源..)。
在设备上,在示例应用程序我把所有从我收到的电子邮件中给出的正确的设置。
无论我的电脑,其运行Tomcat服务器和我的手机连接到相同的WiFi。
我从设备浏览器试图连接到服务器,如https://196.84.32.112:8443/low-level-sample
并且打开浏览器的页面通常,这意味着我能够从移动连接到我的服务器。
现在,当我打从设备示例应用程序注册(我曾尝试上的设置都BIS / BES选项),我总是得到以下错误:
注册请求失败。 通过java.io.IOException的原因:网络运行[订阅]失败。 确保内容提供商URL访问。
在日志中我得到:
打开网址:我的服务器的URL附有喜欢的用户名/密码/模式/连接类型等内容提供商的网络命令信息[订阅]失败,造成无法连接到196.84.32.112:8443
命令“注册”失败,出现错误:java.io .IOException:网络运行[订阅]失败。 确保内容提供商URL访问。
一个念头是,我应该为新推键再次注册和使用BIS / BES选项,而不是只BIS的,但这里的问题似乎是与本地服务器,而不是RIM服务器没有连接。 我已经尝试过,虽然注册和我在等待新的设置邮件。
另外我对BIS / BES选项有点糊涂了。 我不知道如果我的用户将有BIS或者BES启用所以不要我把什么在我的代码?! 在示例应用程序,它要求我,当应用程序将要生产的BIS或者BES但之间进行选择,我需要以编程方式做出这样的选择我会选择什么? 或者这种选择只对应用程序的评估/开发和生产上有另一台服务器做?
我认为,所有正确的事情已经在这里说,但我希望我们能巩固一些问题的答案,并包裹了这个问题。
您还没有共享你的代码,这使得事情变得更加困难,但很多人使用RIM /黑莓提供PushDemo源,其中连接后缀是硬编码/pushdemo/com/rim/samples/device/push/PushUtils.java
:
private static String getConnectionSuffix() {
return ";deviceside=false;ConnectionType=mds-public";
}
我也看了猜这您的其他问题 。
通过这样做,你硬编码青苗的黑莓传输类型。 黑莓手机支持多种不同的传输 ,如BES,BIS,围兜,或WAP。 该青苗运输将从您的设备发送请求,出黑莓的服务器,在互联网上。 ( 注:这部分可能是混乱到iOS / Android开发人员,因为这些平台不提供苹果/谷歌的网络中介继电器正常的HTTP / S流量 )
然后,该请求被转发到你的服务器,这是在:
196.84.32.112:8443
我敢肯定,TCP / IP端点不是可从因特网(我不能达到它)。 所以,这就是为什么它不能给你。
你可以把这个网址
https://196.84.32.112:8443/low-level-sample
并将其粘贴到您的BlackBerry设备的浏览器,它会工作。 您的设备配置为BES,它使用贵公司的内部服务器。 这些内部服务器可以达到196.84.32.112:8443
端点,因此它似乎为你工作。 但是,那是因为你还没有硬编码传输 ,为您在使用推送代码有getConnectionSuffix()
该设备的浏览器是足够聪明,想出一个可行的运输和BES的作品,达到内网服务器。
我们希望,这解释了混淆的部分。
解决方案
正如其他人所说,一个解决办法是让你的公司的IT人员通过他们的防火墙,使IP地址196.84.32.112和端口8443进行访问。 这将允许黑莓服务器顺利到达了。
另一种解决办法是改变PushUtils.java代码,以避免青苗运输:
private static String getConnectionSuffix() {
return ";deviceside=false";
}
如果你想真正灵活的代码,那么我建议重写该PushUtils.java代码,因为它似乎在使用前5.0 HTTP连接逻辑。 连接工厂在OS 5.0+使得这个更容易,更强大的,支持多种传输时...
要回答你关于支持用户使用多个传输问题,看看这个blackberry.com例子 ,特别是MyConnectionFactory
类。 它可以让你选择哪个传输您的应用程序允许,并且它首次尝试。
最终,为了让您的服务器公开与否的决定取决于它如何去使用,以及是否会有非企业网络的客户端尝试与您的企业服务器注册。
让我先解释BB推演示了注册流程:
当你点击注册设备会
通知设备要注册您的Web应用程序。 对于这一点,将有关设备的信息发送到您的Web应用程序(所谓的ContentProvider)。 我们希望你在数据库中存储的信息。 这一步骤发生在ContentProviderProtocol.performCommand()
推演示的方法。
通知装置需要从您的应用程序接收推送通知注册BB推送服务器。 这种情况发生在BpasProtocol.register()
推SDK的方法。
如果你想知道谁所有注册了推送通知(也许如果你想单独推送通知给每个设备,而不是广播消息给所有注册用户)步骤1才是必需的。 在这种情况下,你可能会需要这样的用户的喜好等等反正定制推送等信息。
现在,你所得到的错误是从第1步1步成功,您的设备应该能够连接到您的网络应用程序,它是不能够。
为了解决这个问题,或者你必须让你的Web应用程序公开访问(并准备处理负载)或注释掉通过该应用使得步骤1 ContentProviderProtocol.performCommand()
返回而不做任何事情。
PS:在步骤1中所使用的web应用程序不必是一样的推送发起。 web应用程序只是简单地用于跟踪所有谁注册了接收推,如果你想到了很多用户的最好应设在一个分布式架构云。