2017-05-08 484 views
2

做大量的研究,似乎这是一个灰色地带后,当落...防止WebSocket连接进入后台状态IOS迅速

我试图透过WebSocket发送偶尔的网络请求,一旦用户输入的背景状态(使用Swift库Starscream,但我认为问题与iOS和套接字有关)。用户离开应用程序后不久,套接字连接会自动断开连接。我认为这与苹果关于第三方网络活动的政策背景有关。

在我的AppDelegate中,我尝试重新连接,当用户离开等,但这不起作用。我也听说过有关播放音频的解决方法,但显然这会阻止我的应用程序发布到App Store(如果情况并非如此,那么为什么以及这是如何工作的?)。其他人说我需要Apple的某种赠款,我该如何要求?如果有人能够明确这一点,并提供合法的解决方案,那将是一件好事。我觉得这是应用程序应该有能力的,所以我在等待找到解决方案。

回答

2

我相信没有真正解决这个合法的方式之后。苹果不希望应用程序在后台执行任何操作,因为后台活动耗费大量电量,并可能导致iPhone用户感觉电池电量不足(除了其他问题,例如“无法解释”的网络使用等) ,所以为了用户体验,他们只提供有关iOS应用程序中后台活动的非常有限的选项。然而,我们可以保持应用程序活着一些方式:

App Programming Guide for iOS

当你觉得有必要让你的应用程序在后台运行,iOS设备可以帮助你有效地做到这一点,没有排水系统资源或用户的电池。 iOS提供的技术分为三类:

  • 在前台开始短任务的应用程序可以要求时间来完成该任务,当应用程序移动到后台时。
  • 在前台启动下载的应用程序可以将这些下载的管理权交给系统,从而允许应用程序在下载过程中被暂停或终止。
  • 需要在后台运行以支持特定类型的 任务的应用程序可以声明其支持一个或多个后台执行模式的 模式。

如此看来,比要求的iOS等,让应用程式完成短期任务或下载,请求系统,让应用程序在后台运行的唯一方法是指定一个背景执行模式在我们的Info.plist。这可以在您的项目的XCode的Capabilities对话框中完成,或直接编辑属性列表文件。让我们来看看它的背景执行模式,我们提供以下信息:

在iOS中,只有特定的应用程序类型被允许在后台运行:

  • 应用程式播放音频内容给用户,而在后台,如音乐播放器应用程序
  • 应用该记录的音频内容,而在后台
  • 应用程序,使用户在任何时候他们的位置的通知,如导航应用
  • 应用是s upport互联网语音协议(VoIP)
  • 应用程序需要下载和处理新的内容,从外部附件

接收定期更新保持一个插座活着可能落入“应用程序定期

  • 应用那些需要下载和处理规则新内容”的使用情况,所以让我们检查:

    抓取内容的少量投机

    需要定期检查新内容的应用程序可以要求系统将其唤醒,以便他们可以启动该内容的提取操作。要支持此模式,请在Xcode项目的Capabilities选项卡的Background模式部分中启用Background fetch选项。 (您也可以通过在应用程序的Info.plist文件中包含具有获取值的UIBackgroundModes项来启用此支持。)启用此模式并不能保证系统会随时为您的应用程序提供后台提取。系统必须平衡您的应用程序的需求,以获取其他应用程序和系统本身的需求。在评估这些信息后,系统会在有很好机会的情况下为应用程序提供时间。

    因此,这个选项似乎只能用于通过HTTP请求(或其他网络请求)获取少量内容,而不是用于websocket允许您使用的双向常量通信。实际上,在other related answers看来,应用程序进入后台模式时确实没有合法的方式来保持套接字打开。

    这意味着,要做你想做的事,你不能使用websockets作为你唯一的沟通渠道。我建议你使用fetch背景模式(如上所述)以大块的方式获取内容,而不是在应用处于后台时使用websocket,或者如果您希望用户能够看到新内容可用,您可以实施push notifications

    您不能使用推送通知直接发送大量内容,但它们可用于在用户打开您的应用时提示用户有新内容可用。无论您使用后台提取还是推送通知,您都应该在App Delegate上实施方法,以便每当您的应用从后台状态恢复时,都会将应用的状态与后端的状态同步。

    最后,利用音频作为一种解决方法有关:在audio背景国家重点将让您的应用程序在后台无限期地生存下去 - 但如果你的应用程序并不真正为了播放音频使用它,它得到被应用商店拒绝。

  • +0

    感谢您的深入解答。 –

    +0

    有关我是否想每小时发出一个套接字请求的想法吗?所以不是如此频繁/持续的沟通。 –

    1

    我不确定你的应用程序在做什么,所以我可以保证Apple会批准,但你需要一个Backgroundmodes权利来做到这一点。

    在Xcode中:

    enter image description here

    Here是苹果文档的链接添加到享您的应用程序。

    Here是在iOS中编程后台执行的文档。

    您启用在Xcode的权利,并添加所需类型的plist中,你应该能够开始编码你的背景WebSocket连接

    +0

    不幸的是,即使添加一个背景模式也不允许套接字连接保持活动状态。背景模式只允许iOS的唤醒应用程式中的时间很短,每当iOS的决定,和套接字连接需要的应用程序留在背景清醒下去。 –

    +0

    @PedroCastilho啊我明白了。是的,应用程式是不允许永远停留在后台模式的,所以您将无法使用该方法。请注意,如果我问你想通过套接字连接发送什么?你能通过推送通知完成同样的事情吗? –

    +0

    我不是OP :)你应该添加这个作为评论的问题。 –