我有一个分享扩展,我正在将照片上传到我的服务器。我在设备上处理图像并将其转换为.jpg。我将其保存到临时目录,因为NSURLSession只能从后台的文件上传,而不能从NSData上传。请求被发送,共享扩展调用completeRequestReturningItems:completionHandler:nil,终止扩展。
上传成功,这很好,但是我需要在上传完成后立即删除临时文件。我对如何回应上传完成感到困惑。我已经看到了实现NSURLSessionDelegate的例子,但我不知道在哪里实现它。如果我在我的共享扩展代码中这样做,我认为它没有做任何事情,因为共享扩展已终止,然后上传发生在后台。
有关我需要实现此代码或代码示例的任何帮助都会很棒。
答案 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终止您的共享扩展,以便您的主应用程序可以在后台处理待处理的上传任务。