10

我的应用程序需要从用户手机上传视频文件,然后在服务器上进行处理。问题是文件的大小可以达到 200 MB 以上,并且用户不会让应用程序保持打开状态等待文件上传。由于苹果不允许应用程序在后台运行超过有限的时间。如何确保我的文件已上传。我正在使用 afnetworking 来设置 ios 7 库给出的上传任务。

请如果有人能指出我正确的方向或有任何解决方案,将不胜感激。我在这个问题上敲了太久。谢谢。

        NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];


    [manager setTaskDidSendBodyDataBlock:^(NSURLSession *session,NSURLSessionTask *task ,int64_t bytesSent, int64_t totalBytesSent,int64_t totalBytesExpectedToSend){
        CGFloat progress = ((CGFloat)totalBytesSent / (CGFloat)sensize);

       NSLog(@"Uploading files %lld  -- > %lld",totalBytesSent,totalBytesExpectedToSend);
        [self.delegate showingProgress:progress forIndex:ind];
    }];



    dataTask = [manager uploadTaskWithStreamedRequest:request progress:nil completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
        if (error) {
            NSLog(@"Error: %@", error);
        } else {

        }

       }];

我的请求是一个普通的多部分表单请求。

4

2 回答 2

7

利用:

NSURLSessionConfiguration:backgroundSessionConfiguration:

代替

NSURLSessionConfiguration:defaultSessionConfiguration

NSURLSessionConfiguration:backgroundSessionConfiguration:文档中:

后台会话中的上传和下载任务由外部守护程序执行,而不是由应用程序本身执行。因此,即使应用程序暂停、退出或崩溃,传输也会在后台继续进行。

所以在你的情况下,改变:

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];

至:

NSString *appID = [[NSBundle mainBundle] bundleIdentifier];
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfiguration:appID];

在您的应用委托上实施application:handleEventsForBackgroundURLSession:completionHandler:将允许您的应用在上传完成时被唤醒(即在后台模式下未暂停或未终止)(无论是否成功完成)。

不要与后台获取混淆。你不需要它。后台获取只是简单地唤醒您的应用程序以定期让您的应用程序有机会定期获取少量内容。但是,它对于定期重新启动失败的“后台模式”上传可能很有用。

于 2014-01-11T20:16:06.623 回答
-1

如果默认会话配置,您应该使用后台会话配置。这可确保一旦用户退出您的应用程序,您的数据传输将在后台继续进行。

当然,只要用户在设备的设置应用程序中为您的应用程序启用了后台获取,这是正确的。

请务必在您的项目设置中启用后台获取功能:

能力
(来源:migueldiazrubio.com

后台获取
(来源:migueldiazrubio.com

然后application:handleEventsForBackgroundURLSession:completionHandler:在您的 App Delegate 中实现,以便在数据传输结束时收到通知,并使用接收/发送的文件在您的应用程序内执行您需要做的任何事情(UI 更新……)。不要忘记打电话completionHandler通知系统你已经结束了你的任务。然后,iOS 将截取您应用的活动屏幕的屏幕截图,并在 iOS 7 多任务屏幕中更新该屏幕。

于 2013-10-16T12:50:11.477 回答