【问题标题】:Firebase Offline Support: upload posts while user is offline and sync when user comes online in iOS Swift appFirebase 离线支持:在用户离线时上传帖子,当用户在 iOS Swift 应用程序中在线时同步
【发布时间】: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 都会有更多帮助。

【问题讨论】:

  • 欢迎来到 StackOverflow!请分享您到目前为止编写的代码,以便我们为您提供帮助!

标签: swift firebase firebase-realtime-database google-cloud-functions firebase-storage


【解决方案1】:

问题是当出现错误时最好将其视为重新发送到服务器。 对于离线情况,您可以检查 error 返回是否为网络错误,或手动检查网络连接可用性。

您可以创建一个重新发送的对象数组 例如

var resendList : [YourObjectType]

// when failed to send to server
resendList.append(yourFailedObject)

然后,2 个解决方案:

  1. 手动检查网络连接并在 appDelegate 中的 func applicationDidBecomeActive(_ application: UIApplication) 中激活应用时重新上传。要检查连接,您可以尝试这里的方法:Check for internet connection with Swift 但这有一个问题,用户必须退出应用程序并再次返回连接网络

  2. 使用https://stackoverflow.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,再次尝试相同的上传,直到成功,一旦成功-清除本地缓存。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-14
        • 2017-02-12
        • 2011-09-10
        • 2020-09-01
        • 2012-10-14
        • 1970-01-01
        相关资源
        最近更新 更多