Google 致力于为黑人社区推动种族平等。查看具体举措

使用 FirebaseUI 轻松将登录添加到您的 iOS 应用

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

FirebaseUI是一个构建在 Firebase 身份验证 SDK 之上的库,它提供了可在您的应用中使用的插入式 UI 流。 FirebaseUI 提供以下好处:

  • 多个提供商:电子邮件/密码、电子邮件链接、电话验证、Google 登录、Facebook 登录和 Twitter 登录的登录流程。
  • 帐户管理:处理帐户管理任务的流程,例如帐户创建和密码重置。
  • 匿名帐户链接:流以自动将匿名帐户链接到身份提供者。
  • 可定制:自定义 FirebaseUI 的外观以匹配您的应用。此外,由于 FirebaseUI 是开源的,您可以分叉该项目并完全根据您的需要对其进行自定义。

在你开始之前

  1. 将 Firebase 添加到您的 Apple 项目中。

  2. 将 FirebaseUI 添加到您的 Podfile:

    pod 'FirebaseUI'
    

    如果您愿意,您可以只添加 Auth 组件和要使用的提供程序:

    pod 'FirebaseUI/Auth'
    
    pod 'FirebaseUI/Google'
    pod 'FirebaseUI/Facebook'
    pod 'FirebaseUI/OAuth' # Used for Sign in with Apple, Twitter, etc
    pod 'FirebaseUI/Phone'
    
  3. 如果您尚未将应用连接到 Firebase 项目,请从Firebase 控制台执行此操作。

设置登录方法

在您可以使用 Firebase 登录用户之前,您必须启用并配置您想要支持的登录方法。

电子邮件地址和密码

Firebase 控制台中,打开身份验证部分并启用电子邮件和密码身份验证。

  1. Firebase 控制台中,打开身份验证部分。在登录方法选项卡上,启用电子邮件/密码提供程序。请注意,必须启用电子邮件/密码登录才能使用电子邮件链接登录。

  2. 在同一部分中,启用电子邮件链接(无密码登录)登录方法,然后单击保存

  3. 您可以通过使用FIREmailLinkAuthSignInMethod初始化FUIEmailAuth实例来启用电子邮件链接登录。您还需要提供一个有效的FIRActionCodeSettings对象,并将handleCodeInApp设置为 true。

迅速

var actionCodeSettings = ActionCodeSettings()
actionCodeSettings.url = URL(string: "https://example.appspot.com")
actionCodeSettings.handleCodeInApp = true
actionCodeSettings.setAndroidPackageName("com.firebase.example", installIfNotAvailable: false, minimumVersion: "12")

let provider = FUIEmailAuth(authUI: FUIAuth.defaultAuthUI()!,
                            signInMethod: FIREmailLinkAuthSignInMethod,
                            forceSameDevice: false,
                            allowNewEmailAccounts: true,
                            actionCodeSetting: actionCodeSettings)

Objective-C

FIRActionCodeSettings *actionCodeSettings = [[FIRActionCodeSettings alloc] init];
actionCodeSettings.URL = [NSURL URLWithString:@"https://example.appspot.com"];
actionCodeSettings.handleCodeInApp = YES;
[actionCodeSettings setAndroidPackageName:@"com.firebase.example"
                    installIfNotAvailable:NO
                           minimumVersion:@"12"];

id<FUIAuthProvider> provider = [[FUIEmailAuth alloc] initWithAuthUI:[FUIAuth defaultAuthUI]
                                                       signInMethod:FIREmailLinkAuthSignInMethod
                                                    forceSameDevice:NO
                                              allowNewEmailAccounts:YES
                                                  actionCodeSetting:actionCodeSettings];
  1. 此外,您需要将传递给初始化程序的 URL 列入白名单。您可以在Firebase 控制台中执行此操作,打开身份验证部分。在登录方法选项卡上,在Authorized domain下添加 URL。

  2. 捕获深层链接后,您需要将其传递给身份验证 UI,以便对其进行处理。

迅速

FUIAuth.defaultAuthUI()!.handleOpen(url, sourceApplication: sourceApplication)

Objective-C

[[FUIAuth defaultAuthUI] handleOpenURL:url sourceApplication:sourceApplication];
  1. FirebaseUI-iOS 中的电子邮件链接登录与FirebaseUI-AndroidFirebaseUI-web兼容,其中从 FirebaseUI-Android 启动流程的用户可以打开链接并使用 FirebaseUI-web 完成登录。对于相反的流程也是如此。

苹果

  1. 遵循 Firebase使用 Apple 登录指南中的开始之前遵守 Apple 匿名数据要求部分。

  2. 将 Sign in with Apple 功能添加到您的权利文件中。

  3. 初始化为 Sign in with Apple 配置的 OAuth 提供程序实例:

    迅速

    provider = FUIOAuth.appleAuthProvider()
    

    Objective-C

    FUIOAuth *provider = [FUIOAuth appleAuthProvider];
    

谷歌

  1. Firebase 控制台中,打开身份验证部分并启用 Google 登录。

  2. 在 Xcode 项目中添加反向客户端 ID 作为 URL 方案。您可以在GoogleService-Info.plist文件中找到此值。

Facebook

  1. 按照Facebook 的入门页面设置 Facebook 登录 SDK。

  2. Firebase 控制台中,打开身份验证部分并启用 Facebook。要启用 Facebook 登录,您必须提供您的 Facebook 应用程序 ID 和应用程序密码,您可以在 Facebook 开发人员控制台中获取这些信息。

  3. Project Settings > Capabilities屏幕在您的 Xcode 项目中启用钥匙串共享。

  4. 在您的 Xcode 项目中添加fb FACEBOOK_APP_ID作为 URL 方案。

  5. 将您的 Facebook 应用 ID 和显示名称添加到Info.plist文件中:

    钥匙价值
    脸书AppID FACEBOOK_APP_ID (例如1234567890
    Facebook 显示名称您的应用程序的名称
  6. 初始化 Facebook 提供者实例:

    迅速

    provider = FUIFacebookAuth(authUI: FUIAuth.defaultAuthUI())
    

    Objective-C

    FUIFacebookAuth *provider = [[FUIFacebookAuth alloc] initWithAuthUI:[FUIAuth defaultAuthUI]];
    

  7. 如果要使用Facebook Limited Login ,请在FUIFacebookAuth实例上设置useLimitedLogin属性。

    迅速

    provider.useLimitedLogin = true
    

    Objective-C

    provider.useLimitedLogin = YES;
    

推特

  1. Firebase 控制台中,打开身份验证部分并启用 Twitter。要启用 Twitter 登录,您必须提供您的 Twitter API 使用者密钥和秘密,您可以在 Twitter 应用程序管理控制台中获取它们。

  2. 初始化为 Twitter 登录配置的 OAuth 提供程序实例:

    迅速

    provider = FUIOAuth.twitterAuthProvider()
    

    Objective-C

    FUIOAuth *provider = [FUIOAuth twitterAuthProvider];
    

电话号码

  1. Firebase 控制台中,打开身份验证部分并启用电话号码登录。

  2. Firebase 必须能够验证电话号码登录请求是否来自您的应用。实现这一点的方法之一是通过 APNs 通知。有关详细信息,请参阅启用应用验证

    要启用 APNs 通知以用于 Firebase 身份验证:

    1. 在 Xcode 中,为您的项目启用推送通知

    2. 将您的 APNs 身份验证密钥上传到 Firebase。如果您还没有 APNs 身份验证密钥,请确保在Apple Developer Member Center中创建一个。

      1. 在 Firebase 控制台的项目中,选择齿轮图标,选择Project Settings ,然后选择Cloud Messaging选项卡。

      2. iOS app configuration下的APNs authentication key中,单击Upload按钮。

      3. 浏览到您保存密钥的位置,选择它,然后单击打开。添加密钥的密钥 ID(可在Apple Developer Member Center中获得),然后单击Upload

      如果您已经拥有 APNs 证书,则可以改为上传证书。

  3. 当设备上无法接收 APNs 通知时,Firebase 会使用 reCAPTCHA 来验证请求。

    要启用 reCAPTCHA 验证,如果您尚未将反向客户端 ID 添加为 URL 方案(例如,启用 Google 登录),请在您的 Xcode 项目中执行此操作。您可以在GoogleService-Info.plist文件中找到此值。

  4. 可选:Firebase 使用方法 swizzling 自动获取您应用的 APNs 令牌,处理 Firebase 发送到您的应用的静默推送通知,并在验证期间自动拦截来自 reCAPTCHA 验证页面的自定义方案重定向。

    如果您不想使用 swizzling,请参阅附录:在 Firebase SDK 身份验证文档中使用电话登录而不使用 swizzling

登入

要启动 FirebaseUI 登录流程,首先初始化 FirebaseUI:

迅速

import FirebaseAuthUI

/* ... */

FirebaseApp.configure()
let authUI = FUIAuth.defaultAuthUI()
// You need to adopt a FUIAuthDelegate protocol to receive callback
authUI.delegate = self

Objective-C

@import FirebaseAuthUI;

...

[FIRApp configure];
FUIAuth *authUI = [FUIAuth defaultAuthUI];
// You need to adopt a FUIAuthDelegate protocol to receive callback
authUI.delegate = self;

然后,将 FirebaseUI 配置为使用您想要支持的登录方法:

迅速

import FirebaseAuthUI
import FirebaseFacebookAuthUI
import FirebaseGoogleAuthUI
import FirebaseOAuthUI
import FirebasePhoneAuthUI

let providers: [FUIAuthProvider] = [
  FUIGoogleAuth(),
  FUIFacebookAuth(),
  FUITwitterAuth(),
  FUIPhoneAuth(authUI:FUIAuth.defaultAuthUI()),
]
self.authUI.providers = providers

Objective-C

@import FirebaseAuthUI;
@import FirebaseFacebookAuthUI;
@import FirebaseGoogleAuthUI;
@import FirebaseOAuthUI;
@import FirebasePhoneAuthUI;

...

NSArray<id<FUIAuthProvider>> *providers = @[
  [[FUIGoogleAuth alloc] init],
  [[FUIFacebookAuth alloc] init],
  [[FUITwitterAuth alloc] init],
  [[FUIPhoneAuth alloc] initWithAuthUI:[FUIAuth defaultAuthUI]]
];
_authUI.providers = providers;

如果您启用了 Google 或 Facebook 登录,请为 Google 和 Facebook 注册流程的结果实现一个处理程序:

迅速

func application(_ app: UIApplication, open url: URL,
    options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool {
  let sourceApplication = options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String?
  if FUIAuth.defaultAuthUI()?.handleOpen(url, sourceApplication: sourceApplication) ?? false {
    return true
  }
  // other URL handling goes here.
  return false
}

Objective-C

- (BOOL)application:(UIApplication *)app
            openURL:(NSURL *)url
            options:(NSDictionary *)options {
  NSString *sourceApplication = options[UIApplicationOpenURLOptionsSourceApplicationKey];
  return [[FUIAuth defaultAuthUI] handleOpenURL:url sourceApplication:sourceApplication];
}

最后,从FUIAuth获取AuthViewController的实例。然后,您可以将其呈现为应用程序的第一个视图控制器,也可以从应用程序中的另一个视图控制器呈现它。

迅速

要获取登录方法选择器:

let authViewController = authUI.authViewController()

如果您只使用电话号码登录,则可以直接显示电话号码登录视图:

let phoneProvider = FUIAuth.defaultAuthUI().providers.first as! FUIPhoneAuth
phoneProvider.signIn(withPresenting: currentlyVisibleController, phoneNumber: nil)

Objective-C

要获取登录方法选择器:

UINavigationController *authViewController = [authUI authViewController];

如果您只使用电话号码登录,则可以直接显示电话号码登录视图:

FUIPhoneAuth *phoneProvider = [FUIAuth defaultAuthUI].providers.firstObject;
[phoneProvider signInWithPresentingViewController:currentlyVisibleController phoneNumber:nil];

在您呈现身份验证视图并且用户登录后,结果将返回到didSignInWithUser:error:方法中的 FirebaseUI 身份验证委托:

迅速

func authUI(_ authUI: FUIAuth, didSignInWith user: FIRUser?, error: Error?) {
  // handle user and error as necessary
}

Objective-C

   - (void)authUI:(FUIAuth *)authUI
didSignInWithUser:(nullable FIRUser *)user
            error:(nullable NSError *)error {
  // Implement this method to handle signed in user or error if any.
}

登出

FirebaseUI 提供了退出 Firebase 身份验证以及所有社交身份提供者的便捷方法:

迅速

authUI.signOut()

Objective-C

[authUI signOut];

定制

您可以通过继承 FirebaseUI 的视图控制器并在FUIAuth的委托方法中指定它们来自定义登录屏幕:

迅速

func authPickerViewController(forAuthUI authUI: FUIAuth) -> FUIAuthPickerViewController {
  return FUICustomAuthPickerViewController(nibName: "FUICustomAuthPickerViewController",
                                           bundle: Bundle.main,
                                           authUI: authUI)
}

func emailEntryViewController(forAuthUI authUI: FUIAuth) -> FUIEmailEntryViewController {
  return FUICustomEmailEntryViewController(nibName: "FUICustomEmailEntryViewController",
                                           bundle: Bundle.main,
                                           authUI: authUI)
}

func passwordRecoveryViewController(forAuthUI authUI: FUIAuth, email: String) -> FUIPasswordRecoveryViewController {
  return FUICustomPasswordRecoveryViewController(nibName: "FUICustomPasswordRecoveryViewController",
                                                 bundle: Bundle.main,
                                                 authUI: authUI,
                                                 email: email)
}

func passwordSignInViewController(forAuthUI authUI: FUIAuth, email: String) -> FUIPasswordSignInViewController {
  return FUICustomPasswordSignInViewController(nibName: "FUICustomPasswordSignInViewController",
                                               bundle: Bundle.main,
                                               authUI: authUI,
                                               email: email)
}

func passwordSignUpViewController(forAuthUI authUI: FUIAuth, email: String) -> FUIPasswordSignUpViewController {
  return FUICustomPasswordSignUpViewController(nibName: "FUICustomPasswordSignUpViewController",
                                               bundle: Bundle.main,
                                               authUI: authUI,
                                               email: email)
}

func passwordVerificationViewController(forAuthUI authUI: FUIAuth, email: String, newCredential: AuthCredential) -> FUIPasswordVerificationViewController {
  return FUICustomPasswordVerificationViewController(nibName: "FUICustomPasswordVerificationViewController",
                                                     bundle: Bundle.main,
                                                     authUI: authUI,
                                                     email: email,
                                                     newCredential: newCredential)
}

Objective-C

- (FUIAuthPickerViewController *)authPickerViewControllerForAuthUI:(FUIAuth *)authUI {
  return [[FUICustomAuthPickerViewController alloc] initWithNibName:@"FUICustomAuthPickerViewController"
                                                             bundle:[NSBundle mainBundle]
                                                             authUI:authUI];
}

- (FUIEmailEntryViewController *)emailEntryViewControllerForAuthUI:(FUIAuth *)authUI {
  return [[FUICustomEmailEntryViewController alloc] initWithNibName:@"FUICustomEmailEntryViewController"
                                                             bundle:[NSBundle mainBundle]
                                                             authUI:authUI];

}

- (FUIPasswordSignInViewController *)passwordSignInViewControllerForAuthUI:(FUIAuth *)authUI
                                                                     email:(NSString *)email {
  return [[FUICustomPasswordSignInViewController alloc] initWithNibName:@"FUICustomPasswordSignInViewController"
                                                                 bundle:[NSBundle mainBundle]
                                                                 authUI:authUI
                                                                  email:email];

}

- (FUIPasswordSignUpViewController *)passwordSignUpViewControllerForAuthUI:(FUIAuth *)authUI
                                                                     email:(NSString *)email {
  return [[FUICustomPasswordSignUpViewController alloc] initWithNibName:@"FUICustomPasswordSignUpViewController"
                                                                 bundle:[NSBundle mainBundle]
                                                                 authUI:authUI
                                                                  email:email];

}

- (FUIPasswordRecoveryViewController *)passwordRecoveryViewControllerForAuthUI:(FUIAuth *)authUI
                                                                         email:(NSString *)email {
  return [[FUICustomPasswordRecoveryViewController alloc] initWithNibName:@"FUICustomPasswordRecoveryViewController"
                                                                   bundle:[NSBundle mainBundle]
                                                                   authUI:authUI
                                                                    email:email];

}

- (FUIPasswordVerificationViewController *)passwordVerificationViewControllerForAuthUI:(FUIAuth *)authUI
                                                                                 email:(NSString *)email
                                                                         newCredential:(FIRAuthCredential *)newCredential {
  return [[FUICustomPasswordVerificationViewController alloc] initWithNibName:@"FUICustomPasswordVerificationViewController"
                                                                       bundle:[NSBundle mainBundle]
                                                                       authUI:authUI
                                                                        email:email
                                                                newCredential:newCredential];
}

您可以自定义应用程序服务条款的 URL,该 URL 链接在帐户创建屏幕上:

迅速

let kFirebaseTermsOfService = URL(string: "https://example.com/terms")!
authUI.tosurl = kFirebaseTermsOfService

Objective-C

authUI.TOSURL = [NSURL URLWithString:@"https://example.com/terms"];

最后,您可以通过指定自定义捆绑包来自定义向用户显示的消息和提示:

迅速

authUI.customStringsBundle = NSBundle.mainBundle() // Or any custom bundle.

Objective-C

authUI.customStringsBundle = [NSBundle mainBundle]; // Or any custom bundle.

下一步

  • 有关使用和自定义 FirebaseUI 的更多信息,请参阅 GitHub 上的README文件。
  • 如果您在 FirebaseUI 中发现问题并想报告它,请使用GitHub 问题跟踪器