我在我的iOS应用中使用Firebase SDK 3.8进行电子邮件/密码身份验证。我让用户输入他们的电子邮件/密码,然后我打电话给
[[FIRAuth auth] createUserWithEmail:email password:password completion:^(FIRUser *_Nullable user, NSError *_Nullable error)
一旦他们成功进行身份验证,我就会使用他们的身份验证令牌在我自己的服务器上调用API。我的服务器使用Firebase文档中描述的逻辑验证JWT,以确保令牌有效。每小时,令牌过期,我的服务器返回401.然后iOS客户端尝试刷新令牌:
- (void)refreshUserToken:(BOOL)force {
...
[self.firebaseUser getTokenWithCompletion:^(NSString *_Nullable idToken, NSError *_Nullable error) {
if (error) {
// Handle error
[self resetAndGoToSignUp];
} else {
self.firebaseToken = idToken;
...
}
}];
}
resetAndGoToSignUp函数执行此操作:
// Sign out Firebase User
NSError *error;
BOOL status = [[FIRAuth auth] signOut:&error];
if (!status) {
// show user alert
...
}
// go to my sign up page
AppDelegate *appDelegateTemp = (AppDelegate *)[[UIApplication sharedApplication] delegate];
appDelegateTemp.window.rootViewController = [[UIStoryboard storyboardWithName:@"SignUp" bundle:[NSBundle mainBundle]] instantiateInitialViewController];
此时,当用户输入他们的电子邮件/密码时,firebase createUserWithEmail API始终返回:
FirAuthErrorDomain: 17020
这应该是一个临时的网络错误,但它会继续返回相同的错误。我甚至尝试删除并重新安装应用程序从头开始,API继续返回相同的东西。基本上,一旦用户无法刷新令牌,似乎他们永远无法重新进入我的应用程序。 (如果令牌和凭证存储在钥匙串中,则删除/重新安装可能无法解决任何问题)。首次启动时,当我根据NSUserDefaults检测到您之前没有使用过该应用程序时,我也会调用此代码以确保您已退出:
// Sign out Firebase User here
NSError *error;
BOOL status = [[FIRAuth auth] signOut:&error];
但这似乎没有帮助。我仍然收到错误17020.我必须按照我调用Firebase API的顺序做错事。有没有人碰到这个并找到了解决方案?
如果它有帮助,这至少发生在两个不同的设备上 - iPad和iPhone6s,一个运行iOS 10.2,另一个运行iOS 9.3.5
更新 - 已解决
我一次又一次得到17020的原因是我在执行另一系列测试时拒绝了我的应用程序的Cellular Data权限,而且还没有使用wifi。一旦我重新启用了蜂窝数据,我就可以登录了。: - /