我正在创建一个可以接收不断更新的应用程序(可能每天数百次),为了获得更好的用户体验,最好在后台下载这些内容。
查看Apple的 [1] 文档,我需要将后台模式设置为“Background fetch”。深入探索,您可以阅读application:performFetchWithCompletionHandler
[2] 函数,该函数声明:
调用此方法时,您的应用程序最多有30秒的挂钟时间来执行下载操作并调用指定的完成处理程序块...如果您的应用程序需要很长时间才能调用完成处理程序,那么可能会给将来获取数据的机会减少。
问题是我们的下载 将 下载时间超过30秒,因此不会再面临Apple发送更新越来越少的愤怒,因此加剧了这个问题!
那么,我能以某种方式做到这一点吗?
另外,我创建了一个粗略的实验,我创建了一个NSTimer:scheduledTimerWithTimeInterval
来运行每分钟记录到控制台。这在iPhone模拟中已成功运行(已运行30分钟以上)以及当我将其放在手机上时(一周加)...为什么会这样!?
答案 0 :(得分:2)
由于Apple 30s的义务,可能很难做到。他们决定最终阻止大量下载,以免耗尽电池和数据计划。
你必须确定你真的需要在后台下载那么多数据(因为这需要很长时间),加上一天一百次!
我的意思是,当你的应用程序在(长)背景时段之后进入前景时,它可能不会更新,这是正常情况。因此,当应用程序进入前台时,您需要进行更新;只需要一次更新。否则,您应该退后一步并重新考虑更新过程。
答案 1 :(得分:0)
找到解决方案:
您可以绕过Apple的application:performFetchWithCompletionHandler
功能并设置自己的计时器。为此,请确保执行以下操作:
在您的应用设置下选择了Background fetch
> "功能" > "背景模式"。
在AppDelegate.m
application:didFinishLaunchingWithOptions
内,添加以下代码:
[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
// Nothing
}];
您现在可以在NSTimer
中添加AppDelegate
,它将在后台继续运行。如,
_timerBg = [NSTimer scheduledTimerWithTimeInterval:1800
target:self
selector:@selector(bgFunction)
userInfo:nil
repeats:YES];