KMM项目iOS端Firestore查询权限不足问题求助
项目背景
- 已为KMM项目的Android和iOS原生端完成Firebase SDK配置
- 共享层使用
gitlive firebase sdk实现Firestore数据库查询逻辑,代码如下:
@OptIn(ExperimentalCoroutinesApi::class) override fun invoke(): Flow<List<TicketUi>> = flow { val list = Firebase.firestore .collection("users") .document(Firebase.auth.currentUser!!.uid) .collection("receipts") .snapshots .mapLatest { it.documents.map { doc -> // 将文档转换为Receipt的额外代码 } } // 收集flow并发射列表 list.collect { ticketUiList -> emit(ticketUiList) } }.catch { error -> Logger.e { "Error in GetAllTicketsUseCaseImpl.invoke(): ${error.cause} && message: ${error.message}" } emit(emptyList<TicketUi>()) }
iOS端配置情况
已完成iOS端Firebase项目创建、添加GoogleServices-Info.plist、引入包含Auth和Firestore的Firebase SDK,并在AppDelegate中执行以下配置:
FirebaseApp.configure() // Firestore配置 let settings = Firestore.firestore().settings settings.host = "127.0.0.1:8080" settings.cacheSettings = MemoryCacheSettings() settings.isSSLEnabled = false Firestore.firestore().settings = settings FirebaseConfiguration.shared.setLoggerLevel(.debug) Auth.auth().useEmulator(withHost:"127.0.0.1", port:8081) let auth = Auth.auth() if auth.currentUser == nil { // 匿名登录 auth.signInAnonymously { authResult, error in if let error = error { // 登录失败 print("signInAnonymously:failure \(error.localizedDescription)") } else { // 登录成功 print("signInAnonymously:success") if let user = authResult?.user { print("User: \(user.uid)") } } } } else { // 已登录 print("Already logged in: \(auth.currentUser?.uid ?? "No UID")") }
错误信息
Error Domain=FIRFirestoreErrorDomain Code=7 "Missing or insufficient permissions." UserInfo={NSLocalizedDescription=Missing or insufficient permissions.
11.1.0 - [FirebaseFirestore][I-FST000001] Listen for query at users/9hYte9W9Sf1FlH6vMJdnVs0qPNLd/receipts failed: Missing or insufficient permissions.
Firestore模拟器规则
已设置为允许所有读写:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if true; } } }
疑问
Android端可正常监听查询并获取数据,但iOS端出现权限问题,请问可能遗漏了什么配置?或有什么方法可获取更详细的错误信息?
排查与解决建议
改用Firestore官方模拟器初始化方式
你当前手动修改settings.host和SSL的方式可能存在兼容性问题,建议替换为官方提供的useEmulator方法:// 替换原Firestore配置代码 let firestore = Firestore.firestore() firestore.useEmulator(withHost: "127.0.0.1", port: 8080) firestore.settings.cacheSettings = MemoryCacheSettings() FirebaseConfiguration.shared.setLoggerLevel(.debug)官方方法会自动处理SSL和连接配置,更适配gitlive SDK的调用逻辑。
确保查询在匿名登录完成后执行
匿名登录是异步操作,若共享层的查询在登录回调完成前触发,可能导致权限验证异常。可以在iOS端登录成功的回调中再启动共享层的查询逻辑,或在共享层添加监听用户登录状态的逻辑,确保currentUser存在后再执行查询。检查SDK版本兼容性
确认gitlive firebase sdk的版本与iOS端引入的Firebase SDK版本匹配,版本不兼容可能导致模拟器连接或权限验证流程异常。获取更详细的错误日志
- 在iOS端开启Firestore详细日志:
Firestore.enableLogging(true) - 查看Firestore模拟器的控制台输出,确认iOS端的请求是否到达模拟器,以及模拟器返回的具体拒绝原因。
- 在iOS端开启Firestore详细日志:
验证模拟器规则是否生效
启动模拟器时确保指定了规则文件路径:firebase emulators:start --only firestore --rules firestore.rules也可以访问
http://127.0.0.1:8080/emulator/v1/projects/[你的项目ID]/databases/(default)/rules查看当前生效的规则,确认是否为你设置的允许所有读写的规则。
内容的提问来源于stack exchange,提问作者Barrufet

