ios - 如果 iPhone 应用程序正在运行(心跳),则处理服务器知道

标签 ios iphone sockets apple-push-notifications

我不确定如何最好地让我们的服务器知道我们的 iPhone 应用程序当前正在运行(即使在后台)。有几种不同的选择,但对于 Apple 批准程序允许的以及最可靠的选项存在一些担忧。如果考虑到 Apple 批准的内容,该应用程序确实能够在后台播放音乐。

第一个选项是通过简单的 GET/POST 以设定的时间间隔不断向服务器发送某种心跳;然而,问题是这是否被允许作为后台任务。可以以一种非常迂回的方式争论回放是必要的,但我不确定这是否可以接受。如果服务器在设定的时间内没有收到他们的消息,它将假定该应用程序不再运行。

第二个选项涉及使用状态 channel 套接字连接,并让服务器只处理用户进入和离开该 channel 的时间。使用此选项时,主要关注的是当应用程序处于后台时,这样的套接字连接的可靠性如何。同样,Apple是否允许这样做。在这种情况下,当应用死机时,连接关闭并且服务器知道应用没有运行。

第三个选项可以与其他任何一个选项结合使用,但要使用某种 APNS 推送来查询手机是否已死亡,并让它以一些数据响应让我们知道;然而,这似乎有点违反直觉,因为推送本身会唤醒应用程序。

也欢迎任何其他建议或意见。

最佳答案

不确定这应该是评论还是回答,但让我把我的 2 美分放在这里。

首先,您能否进一步详细说明您的需求,因为如果您使用 AVPlayer/AVPlayerItem 在后台播放音频,您会将您的内容 URL 移交给 iOS,并且它将进行如下调用并且在需要保持播放运行时,您不需要知道应用程序的状态。

让我假设,无论出于何种原因,您想实现问题所要求的:

  1. 您的应用在“未运行”时可以处于 3 种状态

    我。 暂停状态:您的应用没有被终止,但它没有获得任何 CPU 时间来执行您的代码。

    二。 被操作系统杀死:您的应用可能会被 iOS 终止以释放内存或任何其他资源。

    三。 Force Killed by User:如果用户从应用程序切换器向上滑动您的应用程序,它就会被强制终止。

    现在,当您的应用未运行时,您无法查询它,但您可以将其移至正在运行状态。您可以使用以下方法来实现此转换(并非详尽列表,但提到了常见方法)

    我。 后台获取:您可以将应用程序配置为定期调用,以便它可以与服务器同步并更新其状态。

    二。 推送通知 (APNS):您可以从服务器对应用执行 ping 操作,以便 iOS 在短时间内(几秒钟)调用它来更新其状态。

    三。 VOIP 推送:如果您的应用程序是 VOIP 应用程序,您可以使用 PushKit 发送静默推送,这甚至会启动强制终止的应用程序,如果强制终止,上述两种方法不会将应用程序转换为运行状态被用户杀死

  2. 上述观点有助于制定总体策略,但没有回答问题,“如何保持同步 RUNNING 状态”

    我。当您的应用程序正在运行(前台/后台)时,您几乎可以执行公开记录的任何操作,您可以每分钟或每 5 秒调用一次 URL,您需要担心设备上的 UX 而不是审批流程,(人们如果他们在设置部分看到您的应用位于最耗电的位置,则会删除应用)

    ii.要在应用程序处于后台时进行 HTTP 调用,您可以查看 Background URL Session ,它将 HTTP 调用卸载到另一个进程,以便即使应用程序被终止,调用也能完成。

    三.对于基于套接字的方法,请参阅this technical note .主要问题是您不知道/无法知道您的应用何时从正在运行状态转变为未运行状态。

    四。正如您提到的,您的应用程序使用背景音频,如果用户播放音频并将应用程序置于后台,它将始终处于运行状态,在这种情况下您可以使用 Periodic Observer在播放内容时定期进行一些 Heartbeat 调用。

关于ios - 如果 iPhone 应用程序正在运行(心跳),则处理服务器知道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39299498/

相关文章:

iphone - UISearchBar - 范围栏动画

仅使用 Sockets 到 Jabber 的 Java 连接

iOS:在调用 view.hidden = NO 之后,有没有办法确定 UIView 何时出现

iphone - 在iOS中,如何将当前时间,当前时间,分钟和秒保存到单独的整数中?

ios - 转换 ARC 时出现 Lipo 错误

iphone - 如何创建 pinterest 样式隐藏/取消隐藏导航/标签栏?

ios - iOS 中的自动续订应用内购买

ios - 如何删除 backBarButtonItem 空白区域

java - 如果套接字必须已经绑定(bind)到它,为什么 DatagramSocketImpl joinGroup 方法需要一个 NetworkInterface?

java套接字 - 测量发送和响应所需的时间