在“ Firestore数据库安全规则”中,我使用自定义声明检查。他们工作正常。在我的应用中,我使用匿名身份验证。我按照指示进行操作,在我的第一个视图中,我有:
[[FIRAuth auth] signInAnonymouslyWithCompletion:^(FIRAuthDataResult * _Nullable authResult,NSError * _Nullable error) {
FIRUser *user = authResult.user;
NSLog(@"userId: %@", user.uid);}];
它可以正常工作,并且我也可以在控制台中看到一个userId。然后使用可调用的Cloud Functions,该函数使用其uid向用户添加一个自定义声明。它有效,因为在我的iOS完成中,我请求getIDToken:
[user getIDTokenResultWithCompletion:^(FIRAuthTokenResult *result,NSError *error) {
if (error != nil) {
}
else{
NSLog(@"claims: %@",result.claims);
//here I start my queries}];
在此日志中,我看到我的自定义声明已应用,uid是正确的。只有在那之后,我才开始查询Firestore数据库,但是却收到与安全规则有关的错误:Code = 7“缺少权限或权限不足”。
如果我停止该应用程序,然后使用此查询重新启动它-它们将完美运行。因此,毫无疑问的时机。我什至在从Cloud Functions响应(应用了索赔)后将查询推迟了一分钟,但第一次(不重新启动应用程序)查询未通过安全规则。
是否可以在客户端中更新匿名用户而无需重新启动应用程序?
更新
似乎需要通过将Pod更新到最新版本来解决。就我而言,我有5.0.2并更新为5.0.5
最佳答案
在这里,此代码用于获取和设置firebaseDB中的数据。
**view.h**
@属性(强,非原子)FIRDatabaseReference * refOnline;
**view.m**
NSUserDefaults* standardUserDefaults = [NSUserDefaults standardUserDefaults];
NSString *userID = [NSString stringWithFormat:@"%@",[standardUserDefaults valueForKey:@"UserID"]];
self.refOnline = [[FIRDatabase database] reference];
self.refOnline =[[self.refOnline child:userID] child:@"isOnline"];
//[self.refOnline setValue:@"0"];
[self.refOnline observeSingleEventOfType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot * _Nonnull snapshot) {
NSDictionary *dict = snapshot.value;
NSLog(@"%@",dict);
} withCancelBlock:^(NSError * _Nonnull error) {
NSLog(@"%@", error.localizedDescription);
}];
NSLog(@" %@",[self.refOnline child:@"isOnline"]);
**For Set Value**
[self.refOnline setValue:@"0"];
设置观察者进行状态检查
FIRDatabaseReference *observRver = [[FIRDatabase database] reference];
observRver =[observRver child:[[mutDict valueForKey:@"UserID"] objectAtIndex:indexPath.row]];
[observRver observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot * _Nonnull snapshot) {
if (snapshot.value != [NSNull null]){
NSMutableArray *dict = snapshot.value;
NSString *isOnline = [dict valueForKey:@"isOnline"];
if([isOnline isEqualToString:@"1"]){
cell.img_on_offline.image = [UIImage imageNamed:@"green_on"];
cell.lbl_on_offline.text=@"Online";
} else {
cell.img_on_offline.image = [UIImage imageNamed:@"red_off"];
cell.lbl_on_offline.text=@"Offline";
}
} else {
FIRDatabaseReference *newRefrence = [[FIRDatabase database] reference];
newRefrence =[[newRefrence child:[[mutDict valueForKey:@"UserID"] objectAtIndex:indexPath.row]] child:@"isOnline"];
//[newRefrence setValue:@"1"];
NSLog(@" %@",[newRefrence child:@"isOnline"]);
}
} withCancelBlock:^(NSError * _Nonnull error) {
NSLog(@"%@", error.localizedDescription);
}];
像这样的数据库。
关于ios - iOS Firebase传播针对匿名身份验证的自定义声明,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53391704/