我正试图用IOS和firebase建立一个聊天室。当我在firebase控制台的模拟器中测试时,一切正常,但在IOS应用程序中不工作。
我用的结构是这样的
root/members/room id/auth。uid/userdata
root/messages/room_id/messages/message
我用IOS创建了一个新房间
- (void)initRoom
{
NSMutableDictionary *mdata = [[NSMutableDictionary alloc] init];
FIRUser *user = [FIRAuth auth].currentUser;
mdata[@"uid"] = user.uid;
// get the key for the new room
roomKey = [[_rootRef child:@"messages"] childByAutoId].key;
if (roomKey != nil) {
// add auth.uid to member/roomkey
NSString *memberID = [[[_rootRef child:@"members"] child: roomKey ] child: user.uid ].key;
[[[[_rootRef child:@"members"] child: roomKey ] child: memberID ] setValue:mdata];
[self addMemberToRoom];
}
}
并为该房间添加另一名成员(目前使用硬编码uid):
-(void) addMemberToRoom{
NSString *memberID = [[[_rootRef child:@"members"] child: roomKey ] child: @"QLfRoGpoCjWpzira7fljBj8g3EJ3"].key;
NSMutableDictionary *mdata = [[NSMutableDictionary alloc] init];
mdata[@"uid"] = @"QLfRoGpoCjWpzira7fljBj8g3EJ3";
if (memberID !=nil) {
[[[[_rootRef child:@"members"] child: roomKey ] child: memberID ] setValue:mdata];
}
// start listener
[self observeMessages];
}
然后像这样开始听众:
-(void)observeMessages
{
_msgHandle = [[[_rootRef child:@"messages"] child: roomKey] observeEventType:FIRDataEventTypeChildAdded withBlock:^(FIRDataSnapshot *snapshot) {
NSDictionary<NSString *, NSString *> *message = snapshot.value;
NSString *name = message[@"senderId"];
NSString *text = message[@"message"];
[self addMessagewithId:name andText:text];
// animates the receiving of a new message on the view
[self finishReceivingMessage];
}];
}
当我设置这样的规则时,将消息添加到数据库并在应用程序中看到它,这一切都很好:
{
"rules": {
"members": {
".read": "auth !== null",
".write": "auth !== null",
},
"messages": {
".write":"auth !== null",
".read": "auth !== null",
"$room_id": {
}
}
}
}
现在,由于我不希望每个人都能阅读这些信息,我将规则设置为:
{
"rules": {
"members": {
".read": "auth !== null",
".write": "auth !== null",
},
"messages": {
".write": "auth !== null",
"$room_id": {
".read": "root.child('members/'+$room_id+'/'+auth.uid).exists()",
}
}
}
}
执行此操作时,IOS应用程序中的侦听器将不会收到任何调用。在Firebase控制台中使用模拟器检查从应用创建的room_id和用户读取标记为OK。
我的假设是,侦听器是在创建新成员之前初始化的,但即使延迟初始化也无济于事。
你能帮我指一下正确的方向吗?谢谢!
好吧,我找到了一个暂时有效的解决方案。聊天室的观察者是在聊天室在成员列表中可用之前创建的,因此。读取规则返回false。
我的解决方法是在成员列表中设置一个观察者,在其触发时启动消息观察者。
这是我的代码:
-(void) getLastRoom // invoked when new room is added to members node
{
FIRUser *user = [FIRAuth auth].currentUser;
NSString *uid = user.uid;
_msgHandle = [[[[_rootRef child:@"members"] child: roomKey] queryEqualToValue: uid] observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) {
NSString *chatRoom = snapshot.key; //-> returns the roomkey of the chatroom
if ([chatRoom isEqualToString:roomKey]){
[self observeMessages];
}
}];
}
希望它能帮助别人。
我遇到的问题是,使用下面显示的以下Firebase规则,经过身份验证的用户可以成功写入数据库,但无法从中读取,因为我在控制台中获得了“拒绝权限”。当我将读取和写入设置为true(公共)时,读取和写入功能都正常工作。我从数据库中读取的代码也显示如下: 规则: 示例数据库: 以下是确切的错误:
我目前正试图建立一个小型应用程序上的firebase作为它的评估。它看起来很有趣,而且超级高效,但我对firestore规则有一个问题。 我有一个集合(游戏),其对象如下所示: 它没有像预期的那样起作用。我希望它允许我列出的文档,但是如果有一个文档我无法,我希望获得“缺少或不足的权限”。我所能做的是列出所有文档,但不直接读取其中一些文档(规则在试图获取单个文档时有效,但在从集合中列出文档时无效)。
我试图在一个有几个嵌套动态子节点的数据模型中实现Firebase rules read限制。 我有以下数据模型:
获取城市计价规则 说明 接入者可以通过以下两种方式获取城市计价规则: 通过URL链接获取计价规则页面 通过接口获取城市计价规则 方式一:通过URL获取 此方式是通过修改URL中的flier和area参数,获得不同车型不同城市的计价规则 地址URL https://static.udache.com/passenger/apps/price/price-rule/index.html?version
我最近收到一封来自Firebase的电子邮件,告诉我我的数据库(FiRest)的规则不安全,所以我将它们更改为以下内容: 在我有这些规则之前: 在做出改变后,电子邮件不断地回来,我不知道还能做什么。我已经尝试了以下链接中给出的几个选项,但它们都不能满足我的需要。 https://firebase.google.com/docs/rules/insecure-rules#firestore 我需要授
问题内容: 我是ANTLR初学者,想计算符号的SHA1-哈希值。 我的简化示例语法: 当词法分析器删除所有空白时,将使用不同的字符串,但是不幸的是,获得了相同的SHA1-Hash值。 是否有可能在所有跳过的空格和其他通道的文本之间获得规则的“原始”文本? (我想到的一种可能性是将所有字符都包含在-和-lexer规则中,但是还有更多规则,因此这不是很实用。) 我使用标准的ANTLRInputStre