Firebase 离线支持:在用户离线时上传帖子,当用户在 iOS Swift 应用程序中在线时同步
Posted
技术标签:
【中文标题】Firebase 离线支持:在用户离线时上传帖子,当用户在 iOS Swift 应用程序中在线时同步【英文标题】:Firebase Offline Support: upload posts while user is offline and sync when user comes online in iOS Swift app 【发布时间】:2019-03-12 19:34:06 【问题描述】:我在一个 ios-Swift 项目中使用 firebase,在该项目中我必须启用离线支持来上传帖子,帖子中有一个图片和标题,就像 Instagram 一样,所以我想要的是当用户离线并且他/她想上传一个帖子,他/她的照片被保存在缓存中,当用户上线时,该照片被上传并返回一个下载网址,我们可以使用该网址将帖子保存在数据库中。
示例代码为:
let photoIDString = UUID().uuidString
let storageRef = Storage.storage().reference(forURL: "storage ref URL").child("posts").child(photoIDString)
storageRef.putData(imageData, metadata: nil, completion: (metadata, error) in
guard let metadata = metadata else
return
if error != nil
return
storageRef.downloadURL(completion: ( url, error ) in
guard let downloadURL = url else
return
let photoUrl = downloadURL.absoluteString
self.sendDataToDatabase(photoUrl: photoUrl)
)
)
我想知道我应该对我的代码进行哪些更改以提供离线功能。任何代码 sn-p 都会有更多帮助。
【问题讨论】:
欢迎来到 ***!请分享您到目前为止编写的代码,以便我们为您提供帮助! 【参考方案1】:问题是当出现错误时最好将其视为重新发送到服务器。 对于离线情况,您可以检查 error 返回是否为网络错误,或手动检查网络连接可用性。
您可以创建一个重新发送的对象数组 例如
var resendList : [YourObjectType]
// when failed to send to server
resendList.append(yourFailedObject)
然后,2 个解决方案:
手动检查网络连接并在 appDelegate 中的 func applicationDidBecomeActive(_ application: UIApplication)
中激活应用时重新上传。要检查连接,您可以尝试这里的方法:Check for internet connection with Swift 但这有一个问题,用户必须退出应用程序并再次返回连接网络
使用https://***.com/a/27310748/4919289 的建议方法跟踪(收听通知)连接变化并将其重新上传到服务器
并循环遍历 resendList 中的所有对象并再次重新上传。
【讨论】:
【参考方案2】:我不是 iOS 开发者,但我可以分享逻辑流程和一些参考资料。
当用户点击上传时:检查网络是否可用?
如果是:上传帖子。 如果没有: 将帖子保存到应用存储或离线数据库 设置广播接收器以在设备上线时接收广播。 This link 可能会有所帮助。 在设备上线时上传帖子。如果您正在寻找 Firebase 提供的解决方案,您可以找到更多详细信息here。
【讨论】:
【参考方案3】:Firebase 在其文档中为您提供了多种方法来执行此操作。 https://firebase.google.com/docs/database/ios/offline-capabilities
当上传到 firebase 服务器时,它会自己排队等待,直到它再次有互联网连接才能上传。如果这发生超时,或者您想以自己的方式进行操作,只需尝试在 setValue
或 updateChild
函数上使用 completionHandler 上传 - 如果不成功并且错误消息是由于 Internet 引起的,请将其添加到本地缓存将数据和 Firebase 服务器的路径发送到手机。
onLoad,再次尝试相同的上传,直到成功,一旦成功-清除本地缓存。
【讨论】:
以上是关于Firebase 离线支持:在用户离线时上传帖子,当用户在 iOS Swift 应用程序中在线时同步的主要内容,如果未能解决你的问题,请参考以下文章