Swift:从共享扩展将文件上传到 Firebase 存储

问题描述 投票:0回答:2

我正在尝试从 iOS 中的共享扩展将图像上传到 Firebase 存储,我已经进行了身份验证并正在与数据库通信,但是当我尝试上传文件时,它立即失败。

我已经确保我正在使用的代码可以在我的主应用程序中使用它。我还确保文件在正确上传之前已保存在文件管理器中。

这是在上传之前保存文件的代码:

if let data = downsizeImage(image: image).jpegData(compressionQuality: 0.2) {
    let fileManager = FileManager.default

    let url = fileManager.containerURL(forSecurityApplicationGroupIdentifier: "group.com.<DOMAIN>.imageShare")?.appendingPathComponent("ImageToSend.jpg")
    do {
          try data.write(to: url!)
        }
    catch {
          print(error.localizedDescription)
        }
}

这是上传任务的代码:

let storageRef: StorageReference = Storage.storage().reference().child(storageLocation).child(UUID().uuidString)

var completed = false
var mediaUploadTask: StorageUploadTask?
let mediaTimeoutTask = DispatchWorkItem{ () in
            if !completed {
                    mediaUploadTask?.cancel()
                }
}

DispatchQueue.main.asyncAfter(deadline: .now() + 30, execute: mediaTimeoutTask)
mediaUploadTask = storageRef.putFile(from: mediaUrl, metadata: nil) {(metadata, error) in
completed = true
...
}

应该发生的情况是图像已成功上传,并且功能将正常继续。实际发生的情况是上传几乎立即失败。这是返回的错误:

Printing description of error:
▿ Optional<Error>
  - some : Error Domain=FIRStorageErrorDomain Code=-13000 "An unknown error occurred, please check the server response." 
UserInfo={bucket=link-ages-55880.appspot.com,
 _NSURLErrorFailingURLSessionTaskErrorKey=BackgroundUploadTask <AC5EADEA-6257-4C32-9454-17626156AA15>.<1>,
 object=media/4qnjSBKysi79uCR3cTzf/04D22317-D2C0-4A5C-B032-4F37DB2C8F7A,
 _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "BackgroundUploadTask <AC5EADEA-6257-4C32-9454-17626156AA15>.<1>"
), 
NSLocalizedDescription=An unknown error occurred, please check the server response., 
ResponseErrorDomain=NSURLErrorDomain, ResponseErrorCode=-995}

如果有人知道问题可能是什么,我们将不胜感激您的想法。谢谢。

这是调试器的屏幕截图:

ios swift firebase firebase-storage
2个回答
3
投票

我已经发现问题所在了。由于 iOS 沙箱的工作方式,请调用:

storageRef.putFile(from: mediaUrl, metadata: nil, completion: {(metadata, error) in})

失败了。更多信息在这里:原始答案

请致电:

storageRef.putData(Data, metadata: nil, completion: {(metadata, error) in})

按预期工作。


0
投票

putFile
在扩展中不起作用,因为
GTMSessionUploadFetcher
尝试使用背景
URLSessionConfiguration
,而如果没有与主应用程序进行一些复杂的协调,这在扩展中是不可能的。当上传由第三方库(如 Firebase)执行时,情况尤其复杂。

我向 Firebase Storage 提交了修复,确保仅当上传发生在主应用程序中(即不在扩展程序中)时才使用后台会话。此修复包含在 Firebase 10.24.0 中。换句话说,现在,您可以在扩展中安全地使用

putFile

© www.soinside.com 2019 - 2024. All rights reserved.