iOS Firebase登录界面登录时崩溃,报NSInvalidArgumentException异常
解决Firebase邮箱链接登录崩溃的问题
嘿,我之前也踩过这个Firebase登录的坑,看到你抛出的NSInvalidArgumentException,核心原因就是Firebase要求你必须先验证登录链接的有效性,才能用它完成登录操作,直接用未校验的链接就会触发崩溃。
咱们一步步来修复这个问题:
核心修复步骤
Firebase的邮箱链接登录流程里,有个强制的前置校验环节——调用isSignInWithEmailLink:link:(OC)或者isSignIn(withEmailLink:)(Swift)方法,确认链接是合法的登录链接后,再执行登录操作。
代码示例(Objective-C)
在AppDelegate的openURL方法里做校验和登录:
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options { NSString *loginLink = url.absoluteString; // 第一步:先校验链接是否为合法的Firebase登录链接 if ([[FIRAuth auth] isSignInWithEmailLink:loginLink]) { // 这里要替换成用户之前输入的邮箱(建议存在UserDefaults里) NSString *userEmail = [[NSUserDefaults standardUserDefaults] stringForKey:@"user_login_email"]; // 第二步:校验通过后再执行登录 [[FIRAuth auth] signInWithEmail:userEmail link:loginLink completion:^(FIRUser * _Nullable user, NSError * _Nullable error) { if (error) { NSLog(@"登录失败: %@", error.localizedDescription); return; } // 登录成功,处理用户逻辑 NSLog(@"登录成功,用户ID: %@", user.uid); }]; } else { NSLog(@"该链接不是有效的Firebase邮箱登录链接"); } return YES; }
代码示例(Swift)
同样在AppDelegate的openURL方法中处理:
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { let loginLink = url.absoluteString // 前置校验链接有效性 if Auth.auth().isSignIn(withEmailLink: loginLink) { // 取出之前保存的用户邮箱 guard let userEmail = UserDefaults.standard.string(forKey: "user_login_email") else { NSLog("未找到用户邮箱,请重新输入") return true } // 执行登录 Auth.auth().signIn(withEmail: userEmail, link: loginLink) { user, error in if let error = error { print("登录失败: \(error.localizedDescription)") return } // 登录成功后的逻辑 print("登录成功,用户ID: \(user?.uid ?? "")") } } else { print("无效的Firebase登录链接") } return true }
额外注意事项
- 必须用Firebase官方方法发送链接:不要自己手动拼接登录链接,一定要调用
sendSignInLinkToEmail:completion:(OC)或sendSignInLink(toEmail:completion:)(Swift)来生成并发送链接,否则链接会被判定为无效。 - 配置URL Scheme:在Firebase控制台的Auth设置中,把你的App的URL Scheme添加到“授权域”列表里,否则链接跳转回App后会无法被正确识别。
- 保存用户邮箱:用户输入邮箱后,一定要把邮箱存在本地(比如UserDefaults),因为登录时需要将邮箱和链接配对使用。
内容的提问来源于stack exchange,提问作者james
相关产品推荐
相关产品推荐

