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

iOS接入Firebase实现拉黑功能时查询拉黑列表文档不存在如何解决

问题原因及修复方案

常见排查方向

  • 路径参数不匹配:Firestore 文档ID大小写敏感,且要求字符串完全匹配,写入时的用户名、查询时传入的用户名、UserDefaults存储的当前用户名字符串三者只要存在大小写差异、前后空格、字符差异,都会导致查询路径和实际存储路径不一致,无法命中文档。你可以在查询函数开头打印当前查询的完整路径,和Firestore控制台的存储路径逐一比对确认。
  • 安全规则限制:如果你只开放了blocked集合的写入权限,未开放读权限的情况下,Firestore查询会默认返回文档不存在。你可以先在查询回调中新增错误打印,确认是否有权限类报错:
if let error = error {
    print("查询错误:\(error.localizedDescription)")
    return
}

对应的安全规则参考配置如下:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{currentUser}/blocked/{blockedUser} {
      allow read, write: if request.auth != null && currentUser == request.auth.token.username;
    }
  }
}
  • 异步逻辑时序问题:你当前用全局变量存储拉黑状态,若在调用查询函数后立刻读取该变量,此时异步查询还未返回结果,拿到的是初始值false,也会导致逻辑异常,建议改为闭包回调获取查询结果。

优化后的代码示例

// 查询方法改为带闭包回调
public func IsBlockedByUser(username: String, completion: @escaping (Bool) -> Void) {
    guard let currentUser = UserDefaults.standard.string(forKey: "username") else {
        completion(false)
        return
    }
    let ref = database.collection("users")
        .document(currentUser)
        .collection("blocked")
        .document(username)
    ref.getDocument { (document, error) in
        if let error = error {
            print("查询失败:\(error)")
            completion(false)
            return
        }
        completion(document?.exists ?? false)
    }
}

// 调用示例,拿到结果后再更新UI
IsBlockedByUser(username: 目标用户用户名) { [weak self] isBlocked in
    DispatchQueue.main.async {
        if isBlocked {
            // 展示拉黑提示
        } else {
            // 加载正常个人主页信息
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 12:15:08