我们正在制作一个需要将照片和视频上传到 amazon s3 的iOS应用程序。我们需要为此应用程序执行以下任务:
在后台上传视频,图片
如果网络连接丢失,请提醒用户
如果用户信号较低,请稍后向用户发送消息以尝试此上传(我们将所有上传文件存储在本地,直到我们完成上传为止)
我们正在使用NSURLRequest
在后台上传所有文件。但我们不确定这是否是正确的方法,因为它有很多问题。有人可以推荐在iOS中用于上述任务的最佳方法和方法。
答案 0 :(得分:0)
如果你想支持ios6,那很好 - 对于ios7 +切换到NSURLSession
请注意,iOS不保证后台时间,并且可能随时取消您的流程
要检查这一点,请注册一个backgroundHandler,它提供在os确实终止你的进程之前调用的到期块
告诉你想要运行一个bg任务:
UIBackgroundTaskIdentifier token = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
NSLog(@"Ranging for region %@ killed", region.identifier);
}];
if(token == UIBackgroundTaskInvalid) {
NSLog(@"cant start background task");
}
做任何你想做的事情......
完成后,告诉os:
[[UIApplication sharedApplication] endBackgroundTask:token];
注意:这很少无限期地工作,并且意味着以这种方式使用。操作系统仍然可以决定杀了你! (如果你不使用太多的内存和尽可能少的cpu /带宽,你的应用运行更长时间的机会会更好)
关于您的用例:
如果您的NSURLConnection失败,则您的completionBlock或委托会收到错误。
您可以显示UILocalNotification
使用块的虚拟代码:
[NSURLConnection sendAsynchronousRequest:request
queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse *response,
NSData *data,
NSError *connectionError) {
if(connectionError) {
UILocalNotification *theNotification = [[UILocalNotification alloc] init];
theNotification.alertBody = connectionError.description;
theNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:1];
[[UIApplication sharedApplication] scheduleLocalNotification:theNotification];
}
}];