当前位置: 首页 > 知识库问答 >
问题:

Firebase-不要获取带有读取规则的消息

叶健柏
2023-03-14

我正试图用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。

我的假设是,侦听器是在创建新成员之前初始化的,但即使延迟初始化也无济于事。

你能帮我指一下正确的方向吗?谢谢!

共有1个答案

白浩荡
2023-03-14

好吧,我找到了一个暂时有效的解决方案。聊天室的观察者是在聊天室在成员列表中可用之前创建的,因此。读取规则返回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