【问题标题】:iOS 7 Background transfer service stops after 3 minutesiOS 7 后台传输服务在 3 分钟后停止
【发布时间】:2014-01-05 17:24:33
【问题描述】:

我创建了一个示例代码来重复从网络下载文件(每 30 秒左右)。在 iOS 7 中使用带有 NSURLSession 的后台传输服务
我跟着这个教程http://mobile.tutsplus.com/tutorials/iphone/ios-7-sdk-background-transfer-service/ 并添加了一个这样的计时器来重复它。

    [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil];
mute = [NSTimer scheduledTimerWithTimeInterval:30.0f
                                        target:self
                                      selector:@selector(startDownload)
                                      userInfo:nil
                                       repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:mute forMode:NSRunLoopCommonModes];

当我在模拟器和连接到 Xcode 的 iPad 上运行它(通过单击主页按钮在后台运行)(我可以在其中看到日志)时,一切正常,并且不断下载。 但是,当我断开 iPad 与 Mac 的连接并在大约 3 秒后在 iPad 上在后台运行它时,它会停止运行(调用 AppDelegate 中的handleEventsForBackgroundURLSession)。

在 Xcode 项目功能中,我选择了 Background fetch 作为 Background Modes。

我在这里遗漏了什么,或者我做错了什么,导致它在大约 3 分钟后停止? (根据 iOS 7 后台传输服务的文档,它应该连续运行,因为后台没有时间限制。)

谢谢

【问题讨论】:

    标签: ios objective-c ipad ios7


    【解决方案1】:

    尝试以下步骤。这对我来说很好。

    在您的 .h 中

    UIBackgroundTaskIdentifier bgTask;
    

    在.m中

    //background task code
    UIApplication *app = [UIApplication sharedApplication];
    
    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ [app endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];
    
    [NSTimer scheduledTimerWithTimeInterval:30.0f target:self selector:@selector(startDownload) userInfo:nil repeats:YES];
    

    你的下载方法是

    -(void)startDownload{
    
        NSLog(@"will log even if in background or foreground");
    }
    

    【讨论】:

    • 感谢尼丁的回复。但还是一样的结果。与 Mac 断开连接后,您的应用程序是否在 iPad 上运行?在 Xcode 调试模式和模拟器下运行时,它可以工作。但问题是在 iPad 上将其作为实际应用程序运行时。
    • 感谢 Nitin 在您的帖子和 stackoverflow.com/questions/10319643/… 的帮助下,我成功了。但是现在我的问题是iOS论坛的一些专家说使用这样的计时器在后台运行并不是一件好事。他建议在上一次下载完成时调用starDownload,而不使用计时器。打算这样做。
    【解决方案2】:

    iOS7 中的后台任务最多只会给你 30 秒(从 10 分钟大幅下降)。您应该改用新的 fetch 背景模式。您不应该使用计时器,而是使用新提供的 API 来要求操作系统定期唤醒,并使用 NSURLSession 设置您的下载。

    【讨论】:

    • 我已经在使用 NSURLSession 进行下载,并将后台获取设置为后台模式。我使用的是后台传输而不是任务。您能否解释一下“您不应该使用计时器,而是使用新提供的 API 来要求操作系统定期唤醒”是什么意思。谢谢
    • @Madhu 你说你正在使用 fetch 但我没有看到任何与此相关的代码。在后台模式下设置是不够的。您需要阅读后台获取及其工作原理。您在代码中设置了一个计时器。你不应该。应用程序暂停后计时器不会运行。
    • 感谢您的回复。关于将 Background 模式设置为 Fetch,我认为我所要做的就是在 Xcode 项目功能中设置它。看来我误会了。我会搜索一下看看。感谢您的澄清。
    • @Madhu 你找到解决方案了吗?如果我的回答对你有帮助,请采纳。
    • 我正在阅读的其他网页说 iOS7 提供 3 分钟的后台时间?
    【解决方案3】:

    后台获取是不同的。 Background Fetch 将唤醒您的应用程序以定期获取新数据(通常是

    据我了解,您看到的行为可能实际上是正常的。我不相信后台 NSURLSessionDownloadTasks 可以保证连续运行或在任何设备配置(AC 与电池、WiFi 与蜂窝等)上运行。您说您与 Mac 断开连接,这会将设备状态从充电切换到电池。除其他因素外,这可能足以暂停传输或降低下载限制。不幸的是,这个系统对开发人员来说似乎非常不透明。

    为确保您获得可用的最高优先级,请确保您的 NSURLSessionConfiguration 上的 discretionary 属性设置为 false。应用在后台创建的下载任务将始终将此设置为true,因此仅供参考。

    Apple 的示例代码会让你走上正轨:https://developer.apple.com/library/iOS/samplecode/SimpleBackgroundTransfer/Introduction/Intro.html

    【讨论】:

      【解决方案4】:

      实际使用 [[UIApplication sharedApplication]beginBackgroundTaskWithExpirationHandler: ^{}]; 只会给你 180 秒。Xcode 提供后台活动应用程序的功能,同时调试只是为了方便开发人员。

      【讨论】:

        【解决方案5】:

        NSURLSession 下载任务确实不受时间限制。但它们完全由系统管理。如果系统资源不足,它们可能会被推迟。它们通常在没有 wifi 或设备未插入时被拨下。系统还会观察您的应用程序对后台传输服务的使用情况,如果它检测到它滥用该功能,则可能会将其处理为较低的优先级。每 30 秒进行一次后台传输,肯定会被视为滥用行为。

        我建议放弃使用后台传输服务并使用后台获取设置整个事情(顺便说一句,这是完全不同的事情)。如果您想访问商店,请小心,您必须属于已接受的用例之一,该功能才能被批准用于您的应用程序。如果没有,那么希望渺茫。不确定您要做什么。也许你真的不需要这么多的后台活动。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-03-04
          • 1970-01-01
          • 2018-04-15
          • 2018-01-03
          • 1970-01-01
          • 2015-11-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多