iOS端读写Firebase实时数据库报permission-denied错误如何解决
你已经将Realtime Database安全规则配置为全开放读写,且同一份代码在Android端运行正常,说明业务代码、数据库安全规则本身不存在问题,iOS端单独触发权限拒绝报错,均为iOS侧Firebase配置错误导致,常见触发场景:
- 你创建的Realtime Database实例不在默认的
us-central1区域,iOS端SDK初始化时未手动指定数据库URL,默认连接到了us-central1区域下不属于你当前项目的空数据库实例,触发权限校验失败 - iOS工程内的
GoogleService-Info.plist配置文件版本过旧、或错放了其他Firebase项目的配置文件,导致SDK关联到了错误的数据库实例 - iOS工程未配置必要的网络权限、ATS访问规则,系统拦截了SDK到Firebase服务器的请求,返回了误导性的权限拒绝报错
- 开启了Firebase App Check但未完成iOS端的App Check集成,请求被Firebase后端判定为非法请求,返回权限错误
按优先级依次操作排查:
手动指定数据库实例地址
打开Firebase控制台进入Realtime Database页面,复制页面顶部显示的完整数据库URL(格式为https://<项目标识>-<区域后缀>.firebasedatabase.app/),修改数据库初始化代码,强制指定连接地址:// 替换为你控制台查到的实际数据库URL final FirebaseDatabase db = FirebaseDatabase.instanceFor( app: Firebase.app(), databaseURL: "https://替换为你的实际数据库地址.firebasedatabase.app" ); // 后续读写操作均使用这个手动初始化的db实例创建引用 DatabaseReference dbref = db.ref('chatRooms'); final rooms = await dbref.get();这是跨区域部署数据库时iOS端最常见的故障诱因,优先操作这一步,80%以上的同类问题改完这步就能解决。
替换正确的配置文件并清理缓存
进入Firebase控制台-项目设置,选中你当前项目绑定的iOS应用,重新下载最新的GoogleService-Info.plist文件,替换掉iOS工程Runner目录下的旧配置文件。替换完成后执行以下命令清理构建缓存,再重新编译运行:flutter clean flutter pub get cd ios && pod install --repo-update补全iOS端网络权限配置
打开iOS工程下的ios/Runner/Info.plist文件,添加以下配置项,放开网络访问权限:<!-- 本地网络访问权限声明 --> <key>NSLocalNetworkUsageDescription</key> <string>需要网络权限访问服务获取数据</string> <!-- 放开ATS网络限制 --> <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>排查App Check配置
如果上述操作完成后仍报错,进入Firebase控制台的App Check页面,查看是否开启了Realtime Database的强制拦截,如果已开启,先临时关闭强制拦截测试:如果关闭后iOS端可以正常读写,说明是iOS端未正确集成App Check,补全App Check的iOS端配置、添加调试阶段的测试令牌即可。
内容的提问来源于stack exchange,提问作者yeasin71

