Firestore – iOS快照侦听器错误 – 引用的事务已过期或不再有效

更新 – 2018年1月13日

如果有人仍在关注此事,那么Firebase似乎还没有修复它。

作为一种解决方法,我一直在检查从快照侦听器返回的错误是否与下面提到的两个错误消息之一匹配,如果是,我重新连接监听器。 绝对不理想,但至少它有助于保证我的听众在我期望他们活跃时没有随机过期。

这是一些示例代码,可以帮助任何人遇到此问题:

class FirestoreListener { var firestoreReg: ListenerRegistration? func shouldReattach(for error: Error) -> Bool { return error.localizedDescription == "The referenced transaction has expired or is no longer valid." || error.localizedDescription == "transaction closed" } func addListener() { let doc = Firestore.firestore().collection("foo").document("bar") self.firestoreReg?.remove() self.firestoreReg = doc.addSnapshotListener { [weak self] snapshot, error in guard let strongSelf = self else { return } // Catch firestore transaction expired/closed bug if let error = error { if strongSelf.shouldReattach(for: error) { strongSelf.addListener() } else { // Handle other error } return } // Do something } } } 

更新 – 2017年11月23日

我已将此报告为Firebase的错误,他们已经承认了这个问题。 他们现在正在修复,但没有提供ETA。 只关注他们的发行说明:

https://firebase.google.com/support/releases


我最近开始将我的iOS Swift代码从原始的Firebase RTDB迁移到新的Firestore(Beta),我遇到了一个从未发生过RTDB问题的问题。

更新:

该错误似乎在我的所有addSnapshotListener方法中随机发生。 基本上在添加监听器之后,每隔一段时间它就会被触发(尽管数据库没有变化)并且会返回错误。 一旦发生这种情况,侦听器似乎变为无效并且不再侦听更改。

错误本地化描述:

引用的事务已过期或不再有效。

谷歌搜索错误消息返回一些与谷歌云平台相关的post,但我找不到任何专门针对Firebase Firestore的post。 任何有关这方面的帮助将非常感激。 我在下面添加了一些示例代码,但实际上我已经看到这种情况在我在整个应用程序中使用的几乎所有快照侦听器方法中随机发生。

示例代码:

 Firestore.firestore().collection("foo").document("bar").addSnapshotListener { snapshot, error in guard let snapshot = snapshot, snapshot.exists else { if let error = error { print("ERROR Reading /foo/bar with error message: \(error.localizedDescription)") } methodB() return } guard let dict = snapshot.data() as? [String: String], let value = dict["key"] else { print("WARNING - No value for 'key' in dictionary") methodB() return } // Check database value for 'key' matches 'someValue' if value == "someValue" { print("Success, returned value matches 'someValue'") methodA() } else { print("WARNING - value for 'key' in dictionary does not match 'someValue'") methodB() } } 

而且似乎不只是iOS SDK显示此错误:

onSnapshot出错:FirebaseError:[code = invalid-argument]:事务已关闭

更新

与上面的链接类似,我也注意到很多我的监听器随机返回,并显示以下错误消息:

错误:交易已结束

到目前为止,Android SDK似乎未受影响。