Firebase离线支持:在用户离线时上传帖子,并在iOS Swift应用中用户在线时同步

时间:2018-10-08 07:04:47

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

我在一个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)
                    })
                }
                )

我想知道我应该对代码进行哪些更改以提供脱机功能。任何代码段都将提供更多帮助。

3 个答案:

答案 0 :(得分:0)

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

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

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中的所有对象,然后再次重新上传。

答案 1 :(得分:0)

我不是iOS开发人员,但是我可以共享逻辑流程和一些参考。

用户单击上传时:检查网络是否可用?

  • 如果是:上传帖子。
  • 如果否:
    • 将帖子保存到应用存储或离线数据库
    • 设置广播接收器以在设备联机时接收广播。 This link可能会有所帮助。
    • 设备在线时上传帖子。

如果您正在寻找Firebase提供的解决方案,您可能会发现更多详细信息here

答案 2 :(得分:0)

Firebase在其文档中为您提供了许多方法来执行此操作。 https://firebase.google.com/docs/database/ios/offline-capabilities

上传到Firebase服务器时,它将排队等待并等待再次连接到互联网。如果发生超时或您想以自己的方式进行操作,则只需尝试在setValueupdateChild函数上使用完成处理程序上载-如果未成功,并且错误消息是由于Internet引起的,则添加它到手机的本地缓存中,其中包含数据和Firebase服务器的路径。

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