【问题标题】:iOS Photo Upload From Share Extension, Respond When Upload CompleteiOS 照片从分享扩展上传,上传完成后回复
【发布时间】:2015-02-20 17:31:13
【问题描述】:

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

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

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

【问题讨论】:

  • 您能否分享您在后台上传的代码,因为我遇到了问题,

标签: ios upload share nsurlsession


【解决方案1】:

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

您的委托必须至少实现-URLSession:task:didCompleteWithError:,此时它完成了会话中的一项任务。该任务与一个文件相关联,因此您必须跟踪与哪个文件相关联,才能将其删除。

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

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

【讨论】:

    【解决方案2】:

    尝试使用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;
    }
    

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 2012-02-03
    相关资源
    最近更新 更多