我创建了一个示例代码,用于重复从网络下载文件(每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项目功能中,我选择了背景提取作为背景模式。
我在这里错过了什么或者我做错了什么,以便在大约3分钟后停止? (根据iOS 7后台传输服务的文档,它应该连续运行,因为背景没有时间限制。)
由于
答案 0 :(得分:4)
iOS7中的后台任务最多只能给你30秒(从10分钟开始大幅下降)。您应该使用新的获取后台模式。您不应该使用计时器,而是使用新提供的API来定期唤醒操作系统并使用NSURLSession
设置下载。
答案 1 :(得分:3)
背景提取是不同的。后台提取将唤醒您的应用程序以定期提取新数据(通常,寻找更新的< 30s网络请求)。这与后台NSURLSessions无关,如果您实际上没有使用它来排队NSURLSessionDownloadTasks或其他更新目的,则应该关闭它。
据我所知,您所看到的行为可能实际上是正常的。我不相信背景NSURLSessionDownloadTasks可以保证连续运行或在任何设备配置上运行(AC与电池,WiFi与蜂窝电话等)。您说您已从Mac断开连接,这会将设备状态从充电切换到电池。除其他因素外,这可能足以暂停传输或降低下载限制。不幸的是,这个系统似乎对开发人员来说非常不透明。
为确保获得最高优先级,请确保NSURLSessionConfiguration上的discretionary
属性设置为false
。在应用程序处于后台时创建的下载任务将始终设置为true
,因此仅在那里进行。
Apple的示例代码将使您走上正确的轨道:https://developer.apple.com/library/iOS/samplecode/SimpleBackgroundTransfer/Introduction/Intro.html
答案 2 :(得分:2)
尝试以下步骤。这对我来说很好。
在你的.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");
}
答案 3 :(得分:1)
实际使用[[UIApplication sharedApplication]beginBackgroundTaskWithExpirationHandler: ^{}];
只能提供180秒.Xcode提供后台活动应用程序的功能,而调试只是为了方便开发人员。
答案 4 :(得分:0)
NSURLSession下载任务确实不受时间限制。但它们完全由系统管理。如果系统资源不足,它们可能会被推迟。通常在没有wifi或没有插入设备时拨打它们。系统还会观察您应用对后台传输服务的使用情况,如果它检测到滥用该功能,则可以优先级较低。每30秒进行一次背景转换,当然被认为是滥用行为。
我建议放弃使用后台传输服务并使用后台获取来设置整个事物(这是一个完全不同的事情)。如果您想要到达商店,请务必小心,您必须属于一个已接受的用例,才能为您的应用批准该功能。如果没有,那么就没有希望了。不确定你要做什么。也许你真的不需要那么多背景活动。