You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

KMM项目iOS端Firestore查询权限不足问题求助

问题:KMM项目iOS端Firestore查询权限错误(Android端正常)

项目背景

  • 已为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端的请求是否到达模拟器,以及模拟器返回的具体拒绝原因。
  • 验证模拟器规则是否生效
    启动模拟器时确保指定了规则文件路径:

    firebase emulators:start --only firestore --rules firestore.rules
    

    也可以访问http://127.0.0.1:8080/emulator/v1/projects/[你的项目ID]/databases/(default)/rules查看当前生效的规则,确认是否为你设置的允许所有读写的规则。

内容的提问来源于stack exchange,提问作者Barrufet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 19:13:19