Firestore set调用在Safari中无法正常工作的问题求助
问题:Firestore写入功能在Safari浏览器失效,Chrome正常
- 功能表现:Chrome浏览器中可正常向Firestore添加新文档,但Safari中完全无法生效
- 已尝试操作:添加
firebase.firestore().settings({ experimentalForceLongPolling: true });代码、清除浏览器缓存 - 当前状态:Firestore读写规则已设为允许,可正常读取数据,但Safari中写入/添加新文档失败,错误提示为Failed to get document because the client is offline
可能的解决方案
1. 调整Firestore设置的调用时机
把Firestore配置代码移到Firebase初始化之后,而非点击事件内部。重复调用settings()可能引发兼容性冲突,正确写法如下:
if (!firebase.apps.length) { firebase.initializeApp(firebaseConfig); // 初始化App后立即配置Firestore firebase.firestore().settings({ experimentalForceLongPolling: true }); }
2. 等待写入操作完成再跳转页面
当前代码中,调用set(dataAdded)后立刻执行页面跳转,Safari中可能因请求未完成就被中断而失败。需等待写入操作完成后再跳转:
// 替换原代码中的写入与跳转逻辑 db.collection("users").doc().set(dataAdded) .then(() => { // 写入成功后再跳转 window.location = 'http://www.womanverse.ro/membership'; }) .catch((err) => { console.error("写入用户数据失败:", err); $('p#firebase-register-error').show(); $('p#firebase-register-error').text("注册失败,请稍后重试"); });
3. 检查Safari隐私设置
Safari的严格隐私规则可能阻止Firestore正常工作:
- 打开Safari偏好设置 → 隐私 → 取消勾选「阻止所有Cookie」
- 确认目标域名未被禁止存储网站数据
4. 更新Firebase SDK版本
旧版SDK可能存在Safari兼容性问题,尝试升级到最新稳定版。
相关代码
const firebaseConfig = { apiKey: "AIzaSyA34jId_vxluwcj1F9Zl-JeEeZiP0ip_eY", authDomain: "{PROJECT-NAME}.firebaseapp.com/", databaseURL: "https://{PROJECT-NAME}.firebaseio.com/", projectId: "{PROJECT-NAME}", storageBucket: "https://{PROJECT-NAME}.appspot.com/", messagingSenderId: "316955821458", appId: "1:316955821458:web:5916a8b13256ada9cc2d4b", measurementId: "G-JYCTHTXTVE" }; // 初始化Firebase(避免重复初始化) if (!firebase.apps.length) { firebase.initializeApp(firebaseConfig); } // Firebase注册按钮点击事件 $('#firebase-register-form-submit').click(function (event) { event.preventDefault(); let data = $('#firebase-register-form :input').serializeArray(); firebase.firestore().settings({ experimentalForceLongPolling: true }); let db = firebase.firestore(); let email = data[0].value; let password = data[1].value; let name = data[2].value; let phoneNumber = data[3].value; let checkBox = data[4] ? true : false; // 校验所有字段不为空 if (email !== '' && password !== '' && name !== '' && phoneNumber !== '') { firebase .auth() .createUserWithEmailAndPassword(email, password) .then(() => { let dataAdded = { email: email, isSubscribed: checkBox, name: name, phoneNumber: phoneNumber }; db.collection("users").doc().set(dataAdded); window.location = 'http://www.womanverse.ro/membership'; }) .catch((error) => { console.log(error.message); $('p#firebase-register-error').show(); $('p#firebase-register-error').text(error.message); }); } else { $('p#firebase-register-error').text('请填写所有字段!'); } });
内容的提问来源于stack exchange,提问作者Roland Iordache
相关产品推荐
相关产品推荐

