iOS照片从共享扩展上传,上传完成后响应

时间:2014-12-22 15:34:24

标签: ios upload share nsurlsession

我有一个分享扩展,我正在将照片上传到我的服务器。我在设备上处理图像并将其转换为.jpg。我将其保存到临时目录,因为NSURLSession只能从后台的文件上传,而不能从NSData上传。请求被发送,共享扩展调用completeRequestReturningItems:completionHandler:nil,终止扩展。

上传成功,这很好,但是我需要在上传完成后立即删除临时文件。我对如何回应上传完成感到困惑。我已经看到了实现NSURLSessionDelegate的例子,但我不知道在哪里实现它。如果我在我的共享扩展代码中这样做,我认为它没有做任何事情,因为共享扩展已终止,然后上传发生在后台。

有关我需要实现此代码或代码示例的任何帮助都会很棒。

2 个答案:

答案 0 :(得分:0)

尝试使用AFNetworking对我来说非常棒。这里的代码示例来自我的应用之一。

[[[BackgroundSessionManager sharedManager] uploadTaskWithRequest:request fromFile:fileUrl progress:nil completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
    if (responseObject && [responseObject[@"success"] boolValue]) {
        NSLog(@"removed");
        [[NSFileManager defaultManager] removeItemAtPath:strDestinationPath error:nil];
    }

}] resume];

[self.extensionContext completeRequestReturningItems:[self.extensionContext inputItems] completionHandler:^(BOOL expired) {

}];

然后您需要将此委托添加到ApplicationDelegate

- (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)())completionHandler {
    NSAssert([[BackgroundSessionManager sharedManager].session.configuration.identifier isEqualToString:identifier], @"Identifiers didn't match");
    [BackgroundSessionManager sharedManager].savedCompletionHandler = completionHandler;
}

您甚至可以在主机应用中跟踪上传进度。如果您还需要代码示例,请告诉我

答案 1 :(得分:0)

您的 NSURLSession 必须分配一个委托 - 最好不是SLComposeServiceViewController的子类 - ,该对象应该负责从共享容器文件夹中删除这些文件 - 请参阅containerURLForSecurityApplicationGroupIdentifier:

您的代理人必须至少实施-URLSession:task:didCompleteWithError:,此时会完成会话中的一项任务。该任务与一个文件相关联,因此您必须跟踪与哪个文件关联,以便您将其删除。

会话的代表将一直有效,直到任务完成,除非iOS由于某种原因终止,然后您应该在 AppDelegate 中实施-application:handleEventsForBackgroundURLSession:completionHandler:,重新创建会话以继续上传任务并使用委托来处理会话的进度和完成。

测试可能非常棘手,因此在测试时,请尝试使用大文件激发iOS终止您的共享扩展,以便您的主应用程序可以在后台处理待处理的上传任务。