iPhone应用程序后台下载

时间:2014-12-09 15:40:45

标签: ios objective-c iphone xcode

我正在创建一个可以接收不断更新的应用程序(可能每天数百次),为了获得更好的用户体验,最好在后台下载这些内容。

查看Apple的 [1] 文档,我需要将后台模式设置为“Background fetch”。深入探索,您可以阅读application:performFetchWithCompletionHandler [2] 函数,该函数声明:

  

调用此方法时,您的应用程序最多有30秒的挂钟时间来执行下载操作并调用指定的完成处理程序块...如果您的应用程序需要很长时间才能调用完成处理程序,那么可能会给将来获取数据的机会减少。

问题是我们的下载 下载时间超过30秒,因此不会再面临Apple发送更新越来越少的愤怒,因此加剧了这个问题!

那么,我能以某种方式做到这一点吗?

另外,我创建了一个粗略的实验,我创建了一个NSTimer:scheduledTimerWithTimeInterval来运行每分钟记录到控制台。这在iPhone模拟中已成功运行(已运行30分钟以上)以及当我将其放在手机上时(一周加)...为什么会这样!?

2 个答案:

答案 0 :(得分:2)

由于Apple 30s的义务,可能很难做到。他们决定最终阻止大量下载,以免耗尽电池和数据计划。

你必须确定你真的需要在后台下载那么多数据(因为这需要很长时间),加上一天一百次!

我的意思是,当你的应用程序在(长)背景时段之后进入前景时,它可能不会更新,这是正常情况。因此,当应用程序进入前台时,您需要进行更新;只需要一次更新。否则,您应该退后一步并重新考虑更新过程。

答案 1 :(得分:0)

找到解决方案:

您可以绕过Apple的application:performFetchWithCompletionHandler功能并设置自己的计时器。为此,请确保执行以下操作:

  1. 在您的应用设置下选择了Background fetch> "功能" > "背景模式"。

  2. AppDelegate.m application:didFinishLaunchingWithOptions内,添加以下代码:

    [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        // Nothing
    }];
    
  3. 您现在可以在NSTimer中添加AppDelegate,它将在后台继续运行。如,

    _timerBg = [NSTimer scheduledTimerWithTimeInterval:1800
                                                target:self
                                              selector:@selector(bgFunction)
                                              userInfo:nil
                                               repeats:YES];