WebSockets 还是 phonegap 的替代品?

Posted

技术标签:

【中文标题】WebSockets 还是 phonegap 的替代品?【英文标题】:WebSockets or an alternative with phonegap? 【发布时间】:2013-01-23 15:15:23 【问题描述】:

如何通过 phonegap 将低延迟数据发送到服务器并返回?

考虑到我无法在本地访问 php 文件,也没有使用 node.js 或 WebSockets 的经验,我不知道应该使用哪些。

【问题讨论】:

【参考方案1】:

android 或 older versions of Cordova under ios 中的浏览器不原生支持 WebSocket,这意味着如果您想在客户端上使用它们,则需要使用 PhoneGap 插件。

更多信息请访问:http://remysharp.com/2010/10/04/websockets-in-phonegap-projects/

但是,我不确定(即使使用插件)当设备在网络连接(WiFi -> 3G -> WiFi)之间移动时,WebSocket 的弹性可能有多大,因此使用简单的轮询 Web 服务可能是一种如果您的应用需要在用户四处移动时继续接收数据,则选择更可靠。

如果您需要接收服务器发起的数据,请考虑改用推送通知:iOS (APN) 和 Android (C2DM) 都提供了执行此操作的 API,与让您的应用轮询服务器相比,它们可以更有效地使用电池不断。

【讨论】:

当设备更改连接并且我使用的是 websocket 时会发生什么?发生这种情况时,我可以处理某种事件吗? ...如果我要使用推送通知,将 API 集成到 phonegap 软件需要什么?我几乎没有为本地系统编写代码的经验,只有 Web 开发语言。 @maxhud:这取决于 WebSocket 库(请记住,您必须使用插件,因为它们本身不受支持)。我的猜测是,在大多数情况下,他们会终止连接。是否可以检测到取决于库的 API。对于推送通知,您需要使用 PhoneGap 插件。 github.com/marknutter/GCM-Cordova 支持谷歌云消息; github.com/purplecabbage/phonegap-plugins/tree/master/iOS/… 支持 Apple 推送通知。 @maxhud ...继续:请注意,如果您使用的是托管构建服务,例如 PhoneGap Build 或 Nomad for Visual Studio(披露:我在 Nomad 团队中),您可能将无法使用我上面提到的那些原生插件。在这种情况下,您可能只需要以适当的速率轮询您的 Web 服务。 WebSockets 在 Safari 中的 iOS 上原生支持。因此,WebSockets 在 iOS 上的 PhoneGap 中“开箱即用”。 这个答案和相关的 cmets 已经很老了,现在几乎所有的移动浏览器都支持 Websockets(截至 2017 年 1 月的 Opera Mini 除外):caniuse.com/#search=websocket【参考方案2】:

您可以在 iOS 和 Android 的 PhoneGap 中使用 WebSockets。 Safari 中的 iOS 原生支持 WebSockets。对于 Android,您需要使用 polyfill。

见:https://***.com/a/13527585/39904

上面的答案提供了有关如何在 PhoneGap 使用的 Android WebView 中使 WebSocket 对象可用的信息,还提供了一个示例项目的链接,您可以使用该链接开始。

WebSockets 是作为“彗星”黑客攻击的解决方案而开发的。因此,它们为客户端和服务器之间的实时双向通信提供了非常低延迟的解决方案。这意味着低带宽和低资源使用 - 移动设备上的电池 - 因为您保持打开单个连接而不是打开和关闭多个 HTTP 连接。定期发出请求的轮询解决方案可能比 WebSocket 解决方案更快地耗尽电池电量。如果您以较低的间隔进行轮询,则可能没问题 - 这取决于您的用例。

就当您在网络和网络类型(WiFi -> 3G -> WiFi)之间更改时 WebSockets 工作而言,如果您在本机使用 WebSockets,则需要检测 onclose 并重新连接。您还需要确定最佳的连接类型;不安全 (WS) 或安全 (WSS)。我强烈建议您将 WSS 用于移动设备,因为一些移动网络提供商使用会干扰 WS 连接的透明代理。这听起来可能很复杂,但是有许多库可以为您处理这个问题。例如Pusher javascript library(注意:我为 Pusher 工作)。当环境不允许任何 WebSocket 连接发生时,诸如此类的库还可以回退到效率较低的基于 HTTP 的解决方案。

另见:realtime web technology guide。

我同意 @rmc47 的观点,如果它用于不频繁的单个通知,您应该考虑原生推送通知

【讨论】:

【参考方案3】:

请参阅此链接以查看浏览器和设备对 WebSocket 的支持:html5test.com site - iOS 4.2+ 已经支持 WebSocket

参见this doc,它解释了如何使用 WebSocket 开发一个简单的应用程序。

很遗憾,内容是葡萄牙语(巴西)语言,但您可以留下我会回答的 cmets。

【讨论】:

我将首先开发 android 应用程序,谢谢,但这不是我想要的【参考方案4】:

我不确定您所说的“本地访问 PHP 文件”是什么意思。 node.js 和 web 套接字的使用也不是相互排斥的。

如果您还没有决定服务器实现,您可以选择 node.js 或 ASP.NET。

node.js 对带有Socket.io 的套接字有很好的支持,它为您抽象了客户端实现。因此,如果有支持,它将使用 WebSockets,否则它将退回到长轮询。

ASP.NET 有一个名为 SignalR 的库,它对 .NET 平台执行类似的操作。

【讨论】:

以上是关于WebSockets 还是 phonegap 的替代品?的主要内容,如果未能解决你的问题,请参考以下文章

WebSockets 还是定期 Ajax 请求? [复制]

Websockets:所有用户一个通道还是每个用户一个通道?

本地网络上的 Mobile Phonegap 应用程序

WebSockets 是数据报还是流式传输?

如何将phonegap应用程序连接到广播地址上的服务器

集群事件驱动的 Java 应用程序 - 我应该使用 Websockets 还是轮询?