【问题标题】:Enabling offline for firebase realtime database using Ionic app with capacitor使用带电容器的 Ionic 应用程序为 Firebase 实时数据库启用离线功能
【发布时间】:2022-02-01 06:08:57
【问题描述】:

我正在使用带有 firebase 实时数据库和电容器 3 的 ionic。我打算启用离线功能。我已经使用 ionic cap build 构建了应用程序,然后在 xcode 中打开。然后跟随 url https://firebase.google.com/docs/database/ios/offline-capabilities 我在 AppDelegate.swift 中添加了以下代码

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        FirebaseApp.configure()
        Database.database().isPersistenceEnabled = true

        return true
    }

现在为了测试我在 wifi 上运行应用程序并从 firebase db 获取数据。在此之后,我杀死了应用程序并关闭了 wifi。但是,在启动应用程序时,它不会加载数据。

我还有什么遗漏的吗?

我的关键 pod 文件有:

target 'App' do
  capacitor_pods
  # Add your Pods here
  pod 'FirebaseCore', '7.11.0' # Add this line
  pod 'Firebase/Database', '7.11.0' # Add this line
end

下面是我的代码,它不起作用,预计会:

getSeedConfig(){
  return new Promise((resolve, reject) =>{
        const doc = ref(this.db, 'config/seed');
        get(doc).then((snapshot) => {
          if (snapshot.exists()) {
            resolve(snapshot.val())
          } else {
            resolve(null)
          }
        }).catch((error) => {
          reject(error)
        });
  })
}

【问题讨论】:

  • @FrankvanPuffelen 我已经添加了示例代码
  • 嗯……乍一看还不错,尽管从 observable 中获取第一个元素是一种相当复杂的方式。 Calling first() 应该做同样的事情(iirc)。
  • 那么,这里有什么建议?
  • 嗯...我建议在这里使用first(),甚至是不带rxjs 的get or once。 --- 但是在我们当前的代码中,您的subscribe 回调是否曾经在离线时被调用过?
  • 所以我修改了代码 not yes 离线测试,因为我不确定这段代码是否适合您使用基于文档的 get?

标签: javascript ios firebase firebase-realtime-database


【解决方案1】:

在 JavaScript 中使用现代 API 时,不再需要返回自定义 Promise 的情况已经不多了。

据我所知,您现在拥有的这段代码:

getSeedConfig(){
  return new Promise((resolve, reject) =>{
        const doc = ref(this.db, 'config/seed');
        get(doc).then((snapshot) => {
          if (snapshot.exists()) {
            resolve(snapshot.val())
          } else {
            resolve(null)
          }
        }).catch((error) => {
          reject(error)
        });
  })
}

可简写为:

getSeedConfig(){
  const doc = ref(this.db, 'config/seed');
  return get(doc).then((snapshot) => {
    return snapshot.val(); // ? returns null when the snapshot does not exist
  })
}

【讨论】:

  • 嗯,有两点:我使用的是混合框架 ionic,所以不是真正的 web。第二,我正在使用 Promise,因为我需要等待该代码返回配置数据,然后才能根据值采取后续步骤。因此,通过缩短代码,对 getSeedConfig() 的调用将不再等待并且不会给我想要的一致结果。请分享您的想法
  • 此代码返回一个带有结果的承诺,与您的原始代码完全相同。你试过了吗?
  • 我没有。是的,现在已经尝试过了,它的工作原理与我的旧承诺代码非常相似。这更短更干净。正如我所理解的那样,我需要在 swift 版本中明确设置 Database.database().isPersistenceEnabled = true 。这不像 firestore 文档 db case 那样自动。对吗?
  • iOS 和 Android 的原生 SDK 会自动启用本地缓存,而 JavaScript SDK 则不会。我不完全了解您问题中的 Swift 和 JavaScript 代码是如何相互关联的,但这可能只是我缺乏(最近)使用 Ionic 的经验。
  • 我也可能会感到困惑。让我说一下我的理解,它可能会带来一些结论。最近,ionic 已经放弃了 cordova 的电容器框架。因此,现在 ionic 构建结果变成了 xcode 和 android 本机项目。现在,我不知道这是否意味着我需要手动放置代码以在 AppDelegate.swift 中启用持久性,或者我认为它会得到照顾。
猜你喜欢
  • 1970-01-01
  • 2017-03-26
  • 1970-01-01
  • 2016-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-31
  • 2018-11-21
相关资源
最近更新 更多