2013-12-17 88 views
4

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

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

当我(通过点击主页按钮背景)在模拟器和iPad上连接到的Xcode(在那里我可以看到日志)运行一切正常,并保持不断下载。 但是当我从iPad断开iPad并在大约3秒后在后台在iPad上运行它时,它停止运行(AppDelegate中的handleEventsForBackgroundURLSession被调用)。

在Xcode项目功能中,我选择了背景获取作为背景模式。

我在这里错过了什么,或者我做了什么错误,以便它在3分钟后停止? (根据它应该持续运行,因为在后台为这个没有时间限制的iOS 7后台传输服务本细则。)

感谢

回答

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"); 
} 
+0

感谢您的回复尼廷。但仍然是相同的结果。从Mac断开连接后,您的应用程序是否在iPad上运行?在Xcode调试模式和模拟器中运行时,它可以工作。但问题是在iPad上将其作为实际应用运行时。 – Madhu

+0

这是我用在我的应用程序,工作正常.. –

+0

谢谢尼廷我得到它的工作与您的文章的帮助和这个http://stackoverflow.com/questions/10319643/objective-c-proper-use-of -beginbackgroundtaskwithexpirationhandler。但现在我的问题是iOS论坛上的一些专家说,使用像这样的计时器在后台运行并不是一件好事。他建议在上次下载完成时调用starDownload,而不使用计时器。打算这样做。 – Madhu

4

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

+1

我已经在使用NSURLSession进行下载,并将背景获取设置为背景模式。我正在使用后台传输而不是任务。你能解释一下你的意思吗?“你不应该使用计时器,而是使用新提供的API来请求操作系统被定期唤醒”。谢谢 – Madhu

+0

@Madhu你说你正在使用抓取,但我没有看到任何与此相关的代码。仅在背景模式下设置是不够的。您需要阅读后台提取以及它的工作原理。您在代码中设置了一个计时器。你不应该。计时器在应用程序暂停后不会运行。 –

+0

感谢您的回复。关于将背景模式设置为Fetch,我认为我所要做的就是将其设置为Xcode项目功能。看来我误解了。我会搜索一下并看看。感谢您的澄清。 – Madhu

3

背景获取是不同的。后台抓取会唤醒您的应用以定期获取新数据(通常是寻找更新的网络请求)。这与后台NSURLSessions无关,如果你没有实际使用它来排队NSURLSessionDownloadTasks或其他更新目的,可能应该关闭它。

从我所了解的情况来看,您所看到的行为实际上可能是正常的。我不相信背景NSURLSessionDownloadTasks保证持续运行或在任何设备配置上运行(AC vs电池,WiFi vs Cellular等)。您说你从Mac断开连接,将设备状态从充电切换到电池。除其他因素外,这可能足以暂停传输或降低下载限制。不幸的是,这个系统对开发者来说似乎很不透明。

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

苹果的示例代码将让你在正确的轨道上:https://developer.apple.com/library/iOS/samplecode/SimpleBackgroundTransfer/Introduction/Intro.html

1

实际使用[[UIApplication sharedApplication]beginBackgroundTaskWithExpirationHandler: ^{}];会给你只有180 sec.Xcode提供的背景活跃APP设施在调试才刚刚缓和的开发。

0

NSURLSession下载任务确实不受时间限制。但它们完全由系统管理。如果系统资源不足,他们可能会被推迟。当没有无线网络或设备未插入时,通常会拨打它们。系统还会观察您的应用对后台传输服务的使用情况,如果检测到它滥用了该功能,则可能会以较低的优先级对待它。每30秒一次背景传输,肯定被认为是滥用。

我建议放弃使用后台传输服务,并设置整个事情使用后台获取(这是一个完全不同的东西btw)。如果您想要访问商店,请注意,您必须符合其中一个可接受的用例,才能为您的应用批准此功能。如果不是,那就没有希望了。不知道你在做什么。也许你并不需要有太多的背景活动。