2016-09-27 80 views
0

我有一个android/winphone应用程序。应用程序(背景广播接收器/任务)不时(小时约10-15分钟)的一小部分使用时间戳检查本地文件,如果时间戳和当前时间之间的差异变得超过 - 比如说 - 30分钟,它会显示通知一个用户。iOS上的后台任务计时器

在Android中,我使用AlarmManager.setRepeating(...)来设置定期检查,并运行此设置代码,我在Manifest中的操作“android.intent.action.BOOT_COMPLETED”上注册BroadcastReceiver。或者在每次启动时调用AlarmManager.cancel(...)和AlarmManager.setRepeating(...)。这样我可以确定我的计时器工作。

在Windows通用中,我使用触发器和后台任务。这与一些限制相同。

现在我正在将应用程序移植到iOS,并且快速查找并没有给我一种注册函数或类的方法,以便每10分钟执行一次快速检查(通常少于一秒),而应用程序本身不是推出,并且我想在设备启动事件上注册一个功能。可能吗? 或者我应该让我的应用程序在后台运行?我宁愿不这样做,因为我的支票是轻量级和罕见的。

回答

1

您可以使用后台获取快速执行。 但有几个缺点:

  1. 不能在睡眠模式下工作。

  2. 您无法捕获设备启动事件。

  3. 它将在30秒内丢弃。

我认为在一般情况下,这不是AlarmManager的模拟。忘掉它。

https://www.raywenderlich.com/92428/background-modes-ios-swift-tutorial

https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

推送通知可以被用作触发。但是,尽管如此,这是一个服务器端实现。

在上面的指南:

  1. 检查框背景在应用程式的能力的背景模式获取。

  2. 使用setMinimumBackgroundFetchInterval(_:)设置适合您的应用的时间间隔。

  3. 在您的应用程序委托中实施application(_:performFetchWithCompletionHandler:)以处理后台提取。

你的回调事件是performFetchWithCompletionHandler

+0

感谢的答案! RW文章中的背景获取限制了10分钟 - 或者不是?我看到了Candy Crush,我相信它也是一样的(因为它警告恢复生命,基本上我认为同样的计时器检查)。所以它看起来像可生成的背景检查是可能的。但接下来 - 这样的应用程序会永远保存在背景中吗?而如果一天中需要下载32字节的文件和当前的版本号 - 如何做到这一点(由于缓慢/错误的网络,它应该需要超过30秒,而通常需要几个)? – Tertium

+0

如果执行很多,则该进程将被iOS杀死。我必须测试长期线程。我得到了同样的问题:'AlarmManager'是iOS。为了达到我的目的,我决定不使用后台提取在发布应用程序中定期启动。但是可能你会为你找到一个很好的实现。 – Vyacheslav

+0

但是,如果我只是忘记了网络查询,只读本地文件并检查我的定时器 - 它会在应用程序进程关闭后工作吗?每10分钟<1秒并不多。仍然不太明白它是如何工作的,在谈论背景获取时你是指什么类/方法? beginBackgroundTaskWithExpirationHandler? – Tertium