Firebase UI电子邮件链接会打开应用程序,并通过适当的方法进行处理,但未登录用户

问题描述 投票:0回答:1
  • iOS目标:12.2
  • 语言:斯威夫特
  • Firebase SDK版本:6.3.0
  • Firebase UI版本:8.1.0
  • Firebase动态链接版本:4.0.5
  • 设备:运行iOS 12.4.2的iPad Air

我目前在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组件)

我尝试了以下操作:

  • 在打开应用程序时将链接发送到的应用程序方法中,我尝试发送原始的userActivity.webpageURL。不起作用。
  • 在此之前,我曾尝试注销用户,以便在处理url之前没有现有用户。不起作用。
  • 试图捕获其他应用程序方法中的URL,该方法不起作用,因为它只能通过还原处理程序发送到该方法。
  • only

发生在iOS上,因为我每次都能完成android中的相同流程而不会出现问题。由于电子邮件链接验证似乎要求将应用程序部署到应用程序商店,因此我也无法在自己的项目中复制此文件,因为我以前遇到的一个较早的问题是动态链接不会打开该应用程序。但是,解决该问题后,就会弹出此窗口。

[注意:我已经将登录方法追溯到我可以看到的代码中,并且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我目前正在遇到此问题...

ios swift firebase firebase-authentication firebaseui
1个回答
0
投票

UPDATE

© www.soinside.com 2019 - 2024. All rights reserved.