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 服务器时,它会自己排队等待,直到它再次有互联网连接才能上传。如果这发生超时,或者您想以自己的方式进行操作,只需尝试在 setValueupdateChild 函数上使用 completionHandler 上传 - 如果不成功并且错误消息是由于 Internet 引起的,请将其添加到本地缓存将数据和 Firebase 服务器的路径发送到手机。

onLoad,再次尝试相同的上传,直到成功,一旦成功-清除本地缓存。

【讨论】:

以上是关于Firebase 离线支持:在用户离线时上传帖子,当用户在 iOS Swift 应用程序中在线时同步的主要内容,如果未能解决你的问题,请参考以下文章

Firebase - 互联网离线时上传图片

应用离线时如何绕过 Firebase 身份验证?

在设备离线时响应本机应用程序发送推送通知

当用户离线时,Firebase 身份验证会话会持续多长时间?

Firebase 如何处理离线时执行的事件?

离线时发布(React-Native)