我正在使用此代码

var currentTimeStamp: TimeInterval?

    let ref = Database.database().reference().child("serverTimestamp")

    ref.setValue(ServerValue.timestamp())

    ref.observe(.value, with: { snap in

        if let t = snap.value as? Timestamp {
           // print(t/1000)
           // currentTimeStamp = t/1000

            //Add additional data(Timestamp) to list
            mutableData["timestamp"] = currentTimeStamp

            //FINALLY , set data
            newdoc.setData(mutableData) { (error) in
                completion(docID)
            }
        }
    })


得到这个错误

Firebase/Database][I-RDB038012] Listener at /serverTimestamp failed: permission_denied


我的规则设置为Auth,但是auth用户仍然无法获取时间戳

// These rules grant access to a node matching the authenticated
// user's ID from the Firebase auth token
{
  "rules": {
    "users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    }
  }
}


我想在Firebase Realtime Database中写入时间戳,当前结构为。

myproject [null]
    | ____ serverTimestamp:1

以为我已经制定了完成公众的规则仍然无法获得时间戳

最佳答案

您为用户节点设置了规则。您还需要为“ serverTimestamp”节点指定规则。

    {
      "rules": {
        "users": {
           "$uid": {
              ".read": "$uid === auth.uid",
              ".write": "$uid === auth.uid"
           }
        },
        "serverTimestamp": {
           ".read": "auth_uid != null",
           ".write": "auth_uid != null"
        }
      }
    }


这是如果您保持结构相同。

当您在Firebase中指定规则时,它们使用的术语是原子的,您需要为每个节点指定规则,并且每个子节点在应用自己的规则之前先应用父规则。您的规则仅适用于“ $ uid”节点,您未为“ serverTimestamp”指定任何规则,并且由于“ serverTimestamp”不在“ $ uid”之下,因此权限被拒绝。

例如,如果您尝试读取/写入“用户”节点,则使用当前权限,您还将获得拒绝权限。您只能访问“用户/($ uid)/”

关于ios - Firebase ios无法获取时间戳[Firebase/Database] [I-RDB038012]/serverTimestamp处的监听器失败:Permission_denied,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53219510/

10-09 02:34