【问题标题】:iOS Enterprise app - How can I make sure my app runs in the background?iOS 企业应用程序 - 如何确保我的应用程序在后台运行?
【发布时间】:2016-03-14 12:18:32
【问题描述】:

首先要注意的是,我正在开发企业应用程序,因此无需考虑 App Store 指南\审批事项。

我的目标如下:

1) 一款用户只能打开一次的 iPhone 应用程序。在此期间,他将完成一些注册过程。

2) 一旦步骤 (1) 完成(通过应用程序暂停或应用程序关闭),应用程序应该每小时(或多或少)“唤醒”一次,并从后台向服务器发送一些关于用户的数据(所有当然是在用户协议的情况下完成的)。

我尝试过的可选解决方案:

我在https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html 中阅读了非常透彻的 Apple 后台运行指南

我决定使用 2 个 UIBackgroundModes:

  • 位置
  • 获取

1) 对于我使用的位置:

如果您让重大变化的定位服务继续运行并且您的 iOS 应用程序随后被暂停或终止,服务 当新的位置数据到达时自动唤醒您的应用。

2) 对于后台获取,我使用

performFetchWithCompletionHandler()

UIApplication.sharedApplication().setMinimumBackgroundFetchInterval(UIApplicationBackgroundFetchIntervalMinimum);

由于某种原因,该应用在 24 小时后无法在后台运行。这意味着应用程序永远不会再次“唤醒”,即使根据 Apple 指南,只要发生重大位置更新 - 它应该会唤醒。

我可以做些什么来尽可能保证我的应用会在后台定期运行?

【问题讨论】:

  • 您是否尝试过静默推送通知?让服务器向应用发送推送通知,应用可以响应。
  • 谢谢,能否给我发一份关于这种方法的参考资料?
  • google一下应该可以找到很多代码示例

标签: ios iphone


【解决方案1】:

在您的项目属性中,您必须允许应用程序以后台模式更新位置和后台获取。

在后台获取并不像看起来那么容易。 iOS 将自行定义它在后台模式下获取数据的频率,即使您设置了每 15 分钟的选项 :( 正如我的实践表明,如果用户不时打开应用程序,则获取新数据的时间间隔会更短,因此 iOS 会对正常的应用程序使用进行一些计算。因此,应用会根据应用使用情况调用后台获取数据。

但是你可以做一个技巧: 您可以从您的位置程序调用 fetch 程序。对于数据交换,它在我的项目中很有用:)

【讨论】:

  • 设置中的后台模式按预期工作。此外,由于某种原因,即使当我尝试从 Debug --> Simulate Fetch 启动它时,它也不会调用后台提取。我不为获取之间的时间间隔而烦恼,让我烦恼的是应用程序在几分钟后停止了所有后台操作,并且再也没有“唤醒”
  • 您必须集成您的程序才能从 Fetch 或 Location 任务中调用。
【解决方案2】:

该解决方案适用于 Silent PN。

我在赏金中提到的目标是:“.. 让 iOS 应用在完全没有打开的情况下定期在后台运行 30 多天。也应该在应用关闭后运行。”

我发现用"content-available" : 1 发送 PN 对我有用。

我设置了一个服务器,它每 15 分钟向所有注册的设备发送一个“静默 PN”。我能够从同一台服务器确认这些客户端收到 PN 并对其采取行动。

感谢@andlin 的建议。

【讨论】:

  • 您是如何确保设备能够成功接收到推送通知的?
  • 我从 App Delegate didReceiveRemoteNotification:fetchCompletionHandler: 方法发送了一个 POST 请求。服务器在此调用中接收数据,包括时间戳,并保存到 DB。稍后我检查数据库并查看带有时间戳的调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多