Легко добавьте вход в свое приложение iOS с помощью FirebaseUI.

FirebaseUI — это библиотека, созданная на основе Firebase Authentication SDK, которая предоставляет готовые пользовательские интерфейсы для использования в вашем приложении. 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. Вы можете включить вход по ссылке электронной почты, инициализировав экземпляр FUIEmailAuth с помощью FIREmailLinkAuthSignInMethod . Вам также потребуется предоставить допустимый объект FIRActionCodeSettings со свойством handleCodeInApp , имеющим значение true.

Быстрый

var actionCodeSettings = ActionCodeSettings()
actionCodeSettings.url = URL(string: "https://example.firebasestorage.app")
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.firebasestorage.app"];
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 , открыв раздел «Аутентификация» . На вкладке «Способ входа» добавьте URL-адрес в раздел «Авторизованные домены» .

  2. После того как вы перехватили глубокую ссылку, вам нужно будет передать ее в пользовательский интерфейс авторизации, чтобы ее можно было обработать.

Быстрый

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

Objective-C

[[FUIAuth defaultAuthUI] handleOpenURL:url sourceApplication:sourceApplication];
  1. Вход по ссылке на электронную почту в FirebaseUI-iOS совместим с FirebaseUI-Android и FirebaseUI-web : пользователь, начавший вход из FirebaseUI-Android, может открыть ссылку и завершить вход в FirebaseUI-web. То же самое верно и для обратного входа.

Яблоко

  1. Следуйте разделам « Перед началом работы» и «Соблюдение требований Apple к анонимным данным» в руководстве « Вход в Firebase с Apple» .

  2. Добавьте возможность входа с помощью Apple в свой файл прав.

  3. Инициализируйте экземпляр поставщика OAuth, настроенный для входа с помощью Apple:

    Быстрый

    provider = FUIOAuth.appleAuthProvider()

    Objective-C

    FUIOAuth *provider = [FUIOAuth appleAuthProvider];

Google

  1. Настройте вход в Google, используя это руководство

Фейсбук

  1. Настройте Facebook Login SDK, следуя инструкциям на странице начала работы Facebook .

  2. В консоли Firebase откройте раздел «Аутентификация» и включите вход через Facebook. Чтобы включить вход через Facebook, необходимо указать идентификатор приложения Facebook и секретный ключ приложения, которые можно получить в консоли разработчиков Facebook.

  3. Включите общий доступ к связке ключей в проекте Xcode на экране «Настройки проекта» > «Возможности» .

  4. Добавьте fb FACEBOOK_APP_ID в качестве схемы URL в ваш проект Xcode.

  5. Добавьте идентификатор приложения Facebook и отображаемое имя в файл Info.plist :

    Ключ Ценить
    FacebookAppID FACEBOOK_APP_ID (например, 1234567890 )
    FacebookDisplayName Название вашего приложения
  6. Инициализируйте экземпляр поставщика Facebook:

    Быстрый

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

    Objective-C

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

  7. Если вы хотите использовать ограниченный вход Facebook , задайте свойство useLimitedLogin для экземпляра FUIFacebookAuth .

    Быстрый

    provider.useLimitedLogin = true

    Objective-C

    provider.useLimitedLogin = YES;

Твиттер

  1. В консоли Firebase откройте раздел «Аутентификация» и включите Twitter. Чтобы включить вход через Twitter, необходимо указать ключ и секретный ключ пользователя Twitter API, которые можно получить в консоли управления приложениями Twitter.

  2. Инициализируйте экземпляр поставщика OAuth, настроенный для входа через Twitter:

    Быстрый

    provider = FUIOAuth.twitterAuthProvider()

    Objective-C

    FUIOAuth *provider = [FUIOAuth twitterAuthProvider];

Номер телефона

  1. В консоли Firebase откройте раздел «Аутентификация» и включите вход по номеру телефона.

  2. Firebase должен иметь возможность проверять, поступают ли запросы на вход по номеру телефона из вашего приложения. Один из способов — использовать уведомления APN. Подробнее см. в разделе « Включить проверку приложения» .

    Чтобы включить уведомления APNs для использования с Firebase Authentication :

    1. В Xcode включите push-уведомления для вашего проекта.

    2. Загрузите свой ключ аутентификации APNs в Firebase. Если у вас ещё нет ключа аутентификации APNs, обязательно создайте его в Центре разработчиков Apple .

      1. Внутри вашего проекта в консоли Firebase выберите значок шестеренки, выберите Настройки проекта , а затем выберите вкладку Облачные сообщения .

      2. В разделе «Ключ аутентификации APNs» в разделе «Конфигурация приложения iOS» нажмите кнопку «Загрузить» , чтобы загрузить ключ аутентификации разработки, ключ аутентификации производства или оба. Требуется как минимум один.

      3. Перейдите к месту сохранения ключа, выберите его и нажмите «Открыть» . Добавьте идентификатор ключа (доступен в Центре разработчиков Apple ) и нажмите «Загрузить» .

      Если у вас уже есть сертификат APNs, вы можете загрузить его.

  3. Если на устройстве не удается получить уведомления APN, Firebase использует reCAPTCHA для проверки запросов.

    Чтобы включить проверку reCAPTCHA, выполните следующие действия в Xcode:

    1. Откройте конфигурацию проекта: дважды щёлкните по названию проекта в левом дереве. Выберите приложение в разделе «ЦЕЛИ» , затем перейдите на вкладку «Информация» и разверните раздел «Типы URL» .
    2. Нажмите кнопку «+» и добавьте свой закодированный идентификатор приложения в качестве URL-схемы. Вы можете найти свой закодированный идентификатор приложения на странице «Общие настройки» консоли Firebase, в разделе вашего приложения iOS. Остальные поля оставьте пустыми.

      После завершения ваша конфигурация должна выглядеть примерно так (но со значениями, специфичными для вашего приложения):

      Скриншот интерфейса настройки пользовательской схемы URL в Xcode
  4. Необязательно : Firebase использует метод swizzling для автоматического получения токена APNs вашего приложения, для обработки скрытых push-уведомлений, которые Firebase отправляет в ваше приложение, и для автоматического перехвата перенаправления пользовательской схемы со страницы проверки reCAPTCHA во время проверки.

    Если вы предпочитаете не использовать свизлинг, см. Приложение: Использование входа по телефону без свизлинга в документации по аутентификации Firebase SDK.

Войти

Чтобы начать процесс входа в 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];
}

Наконец, получите экземпляр AuthViewController из FUIAuth . Затем вы можете представить его как первый контроллер представления вашего приложения или как другой контроллер представления в вашем приложении.

Быстрый

Чтобы получить селектор метода входа:

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];

После отображения представления аутентификации и входа пользователя в систему результат возвращается делегату FirebaseUI Auth в методе didSignInWithUser:error:

Быстрый

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 Authentication, а также из всех поставщиков социальных идентификаторов:

Быстрый

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-адрес в соответствии с условиями обслуживания вашего приложения, ссылка на которые находится на экране создания учетной записи:

Быстрый

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 см. в файле README на GitHub.
  • Если вы обнаружили проблему в FirebaseUI и хотите сообщить о ней, воспользуйтесь системой отслеживания ошибок GitHub .