我目前在iOS(swift)上使用FirebaseUI遇到问题,当我尝试处理电子邮件链接时,它将无法登录用户。
我让用户使用FirebaseUI电子邮件链接流,该流成功将电子邮件发送到他们的电子邮件。当我打开电子邮件中的链接时,它将通过方法打开
AppDelegate.swift
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
print(self.TAG, "GOT TO RESTORATION HANDLER!", userActivity, userActivity.webpageURL)
guard let webUrl = userActivity.webpageURL else {
return false
}
let handled = DynamicLinks.dynamicLinks().handleUniversalLink(webUrl) { (link, err) in
print(self.TAG, "HANDLING UNIVERSAL LINK!", link, err)
self.handlePasswordlessSignIn(with: link?.url)
}
return handled
}
这是根据https://firebase.google.com/docs/dynamic-links/ios/receive#open-dynamic-links-in-your-app中的步骤6完成的。>
然后我尝试像这样处理登录:
if let link = link, let auth = FUIAuth.defaultAuthUI(), let del = delegate { let actionCodeSettings = ActionCodeSettings() actionCodeSettings.url = URL(string: websiteContinueURL ) actionCodeSettings.handleCodeInApp = true actionCodeSettings.setIOSBundleID(Bundle.main.bundleIdentifier!) actionCodeSettings.setAndroidPackageName(bundleIdentifier, installIfNotAvailable: true, minimumVersion: "12") let provider = FUIEmailAuth(authAuthUI: auth, signInMethod: EmailLinkAuthSignInMethod, forceSameDevice: true, allowNewEmailAccounts: true, actionCodeSetting: actionCodeSettings) auth.providers = [provider, FUIGoogleAuth(), FUIFacebookAuth()] print(self.TAG, "TRYING TO SIGN IN EMAIL LINK!!!") if auth.handleOpen(link, sourceApplication: Bundle.main.bundleIdentifier!) { // if it handled it, which it does, I callback from here // but the auth state at this point, or at any other point after this, // even after the "signed in" modal, is unchanged } }
然后提供一个模式弹出框,显示“已登录!”但用户的身份验证状态不变。我使用该方法来处理网址,具体是因为a)由于使用FirebaseUI,在登录之前,我无法访问他们用于注册的用户的电子邮件和b)是通过文档https://firebase.google.com/docs/auth/ios/firebaseui#email_link_authentication告诉我使用的方法(这是Auth.defaultAuthUI,但应为FUIAuth.defaultAuthUI(),Auth没有属性/方法defaultAuthUI,因为这是FirebaseUI组件)
我尝试了以下操作:
此only
[注意:我已经将登录方法追溯到我可以看到的代码中,并且sourceApplication字段似乎无关紧要,因此即使我正在使用包标识符,接收它的方法也从未使用过它。只是为了确认:
FUIAuth.m
- (BOOL)handleOpenURL:(NSURL *)URL sourceApplication:(NSString *)sourceApplication { // Complete IDP-based sign-in flow. for (id<FUIAuthProvider> provider in _providers) { if ([provider handleOpenURL:URL sourceApplication:sourceApplication]) { return YES; } } // The URL was not meant for us. return NO; }
FUIEmailAuth.m(在其中实现的类扩展了FUIAuthProvider协议)
- (BOOL)handleOpenURL:(NSURL *)URL sourceApplication:(nullable NSString *)sourceApplication { self.emailLink = URL.absoluteString; // Retrieve continueUrl from URL NSURLComponents *urlComponents = [NSURLComponents componentsWithString:URL.absoluteString]; NSString *continueURLString; for (NSURLQueryItem *queryItem in urlComponents.queryItems) { if ([queryItem.name isEqualToString:@"continueUrl"]) { continueURLString = queryItem.value; } } if (!continueURLString) { NSLog(@"FUIEmailAuth unable to handle url without continue URL: %@", URL); return NO; } // Retrieve url parameters from continueUrl NSMutableDictionary *urlParameterDict= [NSMutableDictionary dictionary]; NSURLComponents *continueURLComponents = [NSURLComponents componentsWithString:continueURLString]; for (NSURLQueryItem *queryItem in continueURLComponents.queryItems) { urlParameterDict[queryItem.name] = queryItem.value; } // Retrieve parameters from local storage NSMutableDictionary *localParameterDict = [NSMutableDictionary dictionary]; localParameterDict[kEmailLinkSignInEmailKey] = [GULUserDefaults.standardUserDefaults stringForKey:kEmailLinkSignInEmailKey]; localParameterDict[@"ui_sid"] = [GULUserDefaults.standardUserDefaults stringForKey:@"ui_sid"]; // Handling flows NSString *urlSessionID = urlParameterDict[@"ui_sid"]; NSString *localSessionID = localParameterDict[@"ui_sid"]; BOOL sameDevice = urlSessionID && localSessionID && [urlSessionID isEqualToString:localSessionID]; if (sameDevice) { // Same device if (urlParameterDict[@"ui_pid"]) { // Unverified provider linking [self handleUnverifiedProviderLinking:urlParameterDict[@"ui_pid"] email:localParameterDict[kEmailLinkSignInEmailKey]]; } else if (urlParameterDict[@"ui_auid"]) { // Anonymous upgrade [self handleAnonymousUpgrade:urlParameterDict[@"ui_auid"] email:localParameterDict[kEmailLinkSignInEmailKey]]; } else { // Normal email link sign in [self handleEmaiLinkSignIn:localParameterDict[kEmailLinkSignInEmailKey]]; } } else { // Different device if ([urlParameterDict[@"ui_sd"] isEqualToString:@"1"]) { // Force same device enabled [self handleDifferentDevice]; } else { // Force same device not enabled [self handleConfirmEmail]; } } return YES; }
所以我不认为这是问题。
iOS目标:12.2语言:Swift Firebase SDK版本:6.3.0 Firebase UI版本:8.1.0 Firebase动态链接版本:4.0.5设备:运行iOS 12.4.2的iPad Air我目前正在遇到此问题...
UPDATE