2016-09-03 1 views
1

Ich versuche, einen Chat-Raum in IOS mit Firebase einzurichten. Die Dinge funktionieren gut, wenn ich im Simulator der Firebase-Konsole teste, aber nicht in der IOS-App arbeite.Firebase - bekomme keine Nachricht mit gelesenen Regeln

Die Struktur ich benutze, ist wie diese

root/Mitglieder/Zimmer-id/auth.uid/userdata

root/Nachrichten/room_id/Nachrichten/Nachricht

ich ein neues Zimmer schaffen in IOS mit

- (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];  
    } 
} 

und fügen Sie das andere Mitglied aus diesem Raum (hart codiert uid Verwendung bis jetzt):

-(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]; 

} 

Die Show Konsole dies für die Mitglieder: enter image description here und dies für Nachrichten: enter image description here

und starten Sie den Hörer wie folgt aus:

-(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]; 
    }]; 

} 

Das ist alles gut eine Nachricht hinzuzufügen, zu arbeiten die Datenbank und sehe es in der App, wenn ich Regeln wie folgt einstelle:

{ 
    "rules": { 
    "members": { 
     ".read": "auth !== null", 
     ".write": "auth !== null", 
    }, 
    "messages": { 
     ".write":"auth !== null", 
     ".read": "auth !== null", 
      "$room_id": { 

     } 
    } 
    } 
} 
Jetzt

, da will ich nicht jeder in der Lage sein, die Nachrichten zu lesen ich die Regel auf:

{ 
     "rules": { 
     "members": { 
      ".read": "auth !== null", 
      ".write": "auth !== null", 
     }, 
     "messages": { 
     ".write": "auth !== null", 
       "$room_id": { 

        ".read": "root.child('members/'+$room_id+'/'+auth.uid).exists()", 

      } 
     } 
     } 
    } 

Wenn ich das tut, der Hörer in der IOS App wird keinen Anruf erhalten. Beim Überprüfen der room_id und des Benutzers, die mit dem Simulator in der Firebase-Konsole aus der App erstellt wurden, wird der Lesevorgang als OK markiert.

Meine Annahme war, dass der Listener initialisiert wurde, bevor die neuen Mitglieder erstellt wurden, aber sogar die Initialisierung zu verzögern hat nicht geholfen.

Können Sie mir helfen, indem Sie mich auf die richtige Richtung zeigen? Danke vielmals!

Antwort

0

OK, ich habe eine Lösung gefunden, die jetzt funktioniert. Der Beobachter für den Chatraum wurde erstellt, bevor der Chatroom in der Mitgliederliste verfügbar ist. Daher gibt die .read-Regel false zurück.

Meine Problemumgehung setzt einen Beobachter auf die Mitgliederliste, die den Beobachter für Nachrichten beim Auslösen startet.

Dies ist mein Code:

-(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]; 
     } 

    }]; 
} 

Hoffe, dass es jemand helfen könnte.