我的应用将视频上传到Facebook。即使不耐烦的用户在上传过程中点击了主页按钮,我也希望在后台完成上传。
经过一番阅读,我试过了这个:
UIBackgroundTaskIdentifier bti = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
[[UIApplication sharedApplication] endBackgroundTask:bti];
}];
[fb requestWithGraphPath:@"me/videos"
andParams:params
andHttpMethod:@"POST"
andDelegate:self];
[[UIApplication sharedApplication] endBackgroundTask:bti];
使用fb请求方法完成工作。视频通过http连接上传到Facebook。这样可以正常工作,但如果您在上传过程中通过单击“主页”按钮来设置应用程序,则会暂停上载。如果您预览应用程序,则会继续上传。
我希望会发生的是上传会在后台完成。
有什么希望让它发挥作用?我是否在整个beginBackgroundTask中做错了什么?以这种方式工作似乎太简单了,但这就是文档似乎所说的。
任何帮助,非常感谢。
- 约翰
答案 0 :(得分:15)
好的,我明白了。您需要在后台完成的长任务开始时执行“开始”代码,即使在应用程序退出后也是如此,然后在任务完成时执行“结束”代码。
上面的代码太早执行'end'代码,因此几乎立即结束了后台执行。
这样做的方法是做一些事情:
// make sure save can complete in the background
if ([[UIDevice currentDevice] isMultitaskingSupported])
backgroundTaskID = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{}];
当长任务开始时。正如上面提到的那样,hypercrypt,'backgroundTaskID必须是一个ivar,或者当长任务完成时你可以得到的东西。
任务完成后,执行以下操作:
if ([[UIDevice currentDevice] isMultitaskingSupported]) {
[[UIApplication sharedApplication] endBackgroundTask:backgroundTaskID];
backgroundTaskID = UIBackgroundTaskInvalid;
}
它就像一个魅力。
答案 1 :(得分:9)
您需要在委托回调中调用[[UIApplication sharedApplication] endBackgroundTask:bti];
。您需要将bti
存储在ivar中或作为静态变量存储。