【问题标题】:Firebase Storage Upload Fails in Adverse Network Conditions iOSFirebase 存储上传在不利的网络条件下失败 iOS
【发布时间】:2016-11-02 21:13:01
【问题描述】:

Firebase Storage 在其 iOS 文档中声称 here

无论网络质量如何,都会执行上传和下载。上传和下载非常强大,这意味着它们会在停止的地方重新启动

所以人们会期望它在上传时处理丢失的连接,但它似乎没有。

使用 iOS 中的以下 Swift 代码,我可以在有连接时很好地执行上传,但如果设备没有连接或者它曾经与网络断开连接,则会出现故障条件。

let storage = FIRStorage.storage().referenceForURL("VALID_URL_REMOVED")

let imagesRef = storage.child("images/test.jpg")

let data = UIImageJPEGRepresentation(observationImage!, 0.7);

let uploadTask = imagesRef.putData(data!, metadata: nil)

uploadTask.observeStatus(.Progress) { snapshot in
    // Upload reported progress
    if let progress = snapshot.progress {
        let percentComplete = 100.0 * Double(progress.completedUnitCount) / Double(progress.totalUnitCount)
        print("percent \(percentComplete)")
    }
}

uploadTask.observeStatus(.Success) { snapshot in
    // Upload completed successfully
    print("success")
}

uploadTask.observeStatus(.Failure) { snapshot in
    print("error")
    print(snapshot.error?.localizedDescription)
}

这段代码的调试输出如下。

/*
percent 0.0
percent 0.0044084949781492
2016-06-30 11:49:16.480 Removed[5020:] <FIRAnalytics/DEBUG> Network status has changed. Code, status: 1, Disconnected
percent 0.0044084949781492
error
Optional("An unknown error occurred, please check the server response.")
*/

Firebase 的实时数据库离线存储也是用下面的代码设置的,但我不确定这是否相关。

FIRDatabase.database().persistenceEnabled = true

我还尝试使用以下几行手动设置超时,如this 问题的答案中所述,没有任何更改。

let config = FIRStorage()
config.maxUploadRetryTime = 1000000

有没有办法让它在不从头开始实现功能的情况下处理这些断开连接?我错过了什么吗?

【问题讨论】:

    标签: ios swift firebase-storage


    【解决方案1】:

    您缺少观察者。现在你只观察 .success 和 .failure 事件。尝试为 .resume、.pause、.progress 添加观察者来处理不同的事件。

    // Listen for state changes, errors, and completion of the upload.
    
    uploadTask.observe(.resume) { snapshot in
    // Upload resumed, also fires when the upload starts
    }
    
    uploadTask.observe(.pause) { snapshot in
    // Upload paused
    }
    
    uploadTask.observe(.progress) { snapshot in
    // Upload reported progress
    let percentComplete = 100.0 * Double(snapshot.progress!.completedUnitCount)
    / Double(snapshot.progress!.totalUnitCount)
    
    }
    
    uploadTask.observe(.failure) { snapshot in
    if let error = snapshot.error as? NSError {
    switch (FIRStorageErrorCode(rawValue: error.code)!) {
    case .objectNotFound:
      // File doesn't exist
      break
    case .unauthorized:
      // User doesn't have permission to access file
      break
    case .cancelled:
      // User canceled the upload
      break
    
    /* ... */
    
    case .unknown:
      // Unknown error occurred, inspect the server response
      break
    default:
      // A separate error occurred. This is a good place to retry the upload.
      break
      }
    
     }
    
    }
    

    【讨论】:

    • 我可能有误解,但在我看来,添加观察者暂停和恢复似乎并不能解决上传失败的问题。另一方面,可能只是当网络状态发生变化时必须手动暂停和恢复。
    猜你喜欢
    • 1970-01-01
    • 2020-11-20
    • 2015-05-18
    • 2018-08-13
    • 2019-06-28
    • 2019-05-07
    • 2019-04-20
    • 2021-01-06
    相关资源
    最近更新 更多