在恶意网络条件iOS中,Firebase存储上传失败

Tha*_*mes 11 ios swift firebase-storage

火力地堡存储声称这里的iOS版的文件,它

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

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

使用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)
}
Run Code Online (Sandbox Code Playgroud)

此代码的调试输出如下.

/*
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.")
*/
Run Code Online (Sandbox Code Playgroud)

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

FIRDatabase.database().persistenceEnabled = true
Run Code Online (Sandbox Code Playgroud)

我还尝试使用以下行手动设置问题的答案中提到的超时,没有任何更改.

let config = FIRStorage()
config.maxUploadRetryTime = 1000000
Run Code Online (Sandbox Code Playgroud)

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

who*_*who 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
  }

 }

}
Run Code Online (Sandbox Code Playgroud)

  • 我可能误解了,但在我看来,添加暂停和恢复观察者并不能解决上传失败的问题。另一方面,当网络状态发生变化时,可能必须手动暂停和恢复。 (3认同)