背景上传问题(目标c)

时间:2014-05-29 10:23:08

标签: objective-c ios7 background-process

我们正在制作一个需要将照片和视频上传到 amazon s3 的iOS应用程序。我们需要为此应用程序执行以下任务:

  1. 在后台上传视频,图片

  2. 如果网络连接丢失,请提醒用户

  3. 如果用户信号较低,请稍后向用户发送消息以尝试此上传(我们将所有上传文件存储在本地,直到我们完成上传为止)

  4. 我们正在使用NSURLRequest在后​​台上传所有文件。但我们不确定这是否是正确的方法,因为它有很多问题。有人可以推荐在iOS中用于上述任务的最佳方法和方法。

1 个答案:

答案 0 :(得分:0)

如果你想支持ios6,那很好 - 对于ios7 +切换到NSURLSession

请注意,iOS不保证后台时间,并且可能随时取消您的流程

要检查这一点,请注册一个backgroundHandler,它提供在os确实终止你的进程之前调用的到期块

  1. 告诉你想要运行一个bg任务:

    UIBackgroundTaskIdentifier token = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        NSLog(@"Ranging for region %@ killed", region.identifier);
    }];
    if(token == UIBackgroundTaskInvalid) {
        NSLog(@"cant start background task");
    }
    
  2. 做任何你想做的事情......

  3. 完成后,告诉os:

        [[UIApplication sharedApplication] endBackgroundTask:token];
    
  4. 注意:这很少无限期地工作,并且意味着以这种方式使用。操作系统仍然可以决定杀了你! (如果你不使用太多的内存和尽可能少的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];
        }
    }];