通过BES / BIS,黑莓推送通知
我正在尝试为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 / 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开发者感到困惑,因为这些平台不提供Apple / Google网络中介来中继正常的HTTP / S流量)
然后,将请求转发到您的服务器,该服务器位于:
196.84.32.112:8443
我很确定TCP / IP端点不能从Internet上获得(我无法达到它)。 所以,这就是为什么它会失败。
你可以拿这个URL
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。 这将允许BlackBerry服务器成功访问它。
另一种解决方案是更改PushUtils.java代码以避免BIBS传输:
private static String getConnectionSuffix() {
return ";deviceside=false";
}
如果你想要真正灵活的代码,那么我会建议重写那个PushUtils.java代码,因为它似乎使用了5.0之前的HTTP连接逻辑。 在支持多个传输时,OS 5.0+中的ConnectionFactory使这更简单,更强大。
要回答关于支持多传输的用户的问题,请看一下这个blackberry.com示例,特别是MyConnectionFactory
类。 它允许你选择你的应用允许的传输方式,以及它首先尝试的传输方式。
最终,让服务器公开或不公开的决定取决于它将如何使用,以及是否有非企业互联网客户端试图向公司服务器注册。
我首先解释BB推送演示的注册流程:
当你点击注册时,设备将会
通知您的Web应用程序该设备要注册。 为此,它会将有关设备的信息发送给您的Web应用程序(即所谓的ContentProvider)。 您需要将该信息存储在数据库中。 这一步发生在推送演示的ContentProviderProtocol.performCommand()
方法中。
通知BB推送服务器设备想要注册接收来自应用程序的推送通知。 这发生在push sdk的BpasProtocol.register()
方法中。
如果您想知道所有人都已注册推送通知(可能您希望将单个推送通知发送到每个设备,而不是将消息广播给所有注册用户),则仅需要步骤1。 在这种情况下,您可能需要其他信息,例如该用户的首选项等来自定义推送。
现在,您得到的错误来自第1步。要使第1步成功,您的设备应该能够连接到您无法访问的Web应用程序。
要解决这个问题,要么让你的web应用程序公开访问(并且准备好处理负载),要么通过使ContentProviderProtocol.performCommand()
返回而不做任何事情来从应用程序注释掉第1步。
PS:步骤1中使用的webapp不需要与您的推送启动器相同。 webapp只是用来跟踪所有注册接收推送的人,如果您期望很多用户,理想情况下应该位于分布式架构的云中。
链接地址: http://www.djcxy.com/p/60549.html