Давайте воссоздадим кнопку «Войти через Apple» для нашего приложения в SwiftUI. Перед этим давайте разберемся с условиями

SwiftUI - это инновационный, исключительно простой способ создания пользовательских интерфейсов на всех платформах Apple с помощью Swift. Создавайте пользовательские интерфейсы для любого устройства Apple, используя всего один набор инструментов и API . - Официальная документация Apple

Самое приятное, что вы можете интегрировать свои представления с компонентами из фреймворков UIKit, AppKit и WatchKit. Короче говоря, SwiftUI упростил создание пользовательских интерфейсов.

Вход с помощью Apple - это быстрый, простой и более конфиденциальный способ входа в приложения и веб-сайты, используя уже имеющийся у вас Apple ID. - Официальная документация Apple

Почему важен вход в Apple?

  1. Apple скоро заставит каждого разработчика использовать вход через Apple в обязательном порядке. В общем, другого выхода у вас нет.
  2. Вход в Apple с самого начала основан на уважении конфиденциальности пользователей и обеспечении их контроля над своей личной информацией.
  3. Вместо того, чтобы использовать учетную запись в социальной сети или заполнять формы и выбирать другой новый пароль, просто нажмите кнопку «Войти с помощью Apple», просмотрите свою информацию и быстро и безопасно войдите в систему с помощью Face ID, Touch ID или пароля устройства.
  4. Вход через Apple не отслеживает и не профилирует пользователей, поскольку они предпочитают приложения и веб-сайты, и Apple сохраняет только ту информацию, которая необходима для того, чтобы они могли войти в систему и управлять вашей учетной записью.

Без дальнейших ожиданий давайте разберемся, как можно реализовать вход с помощью Apple в SwiftUI. Прежде чем начать, вам необходимо добавить возможность «Войти через Apple» в Xcode. Для этого

  1. Нажмите на свой проект
  2. Перейти к подписке и возможностям
  3. Щелкните знак «+», найдите «Войти через Apple» и выберите его.

Вот и все, мы готовы реализовать вход через Apple. Теперь давайте посмотрим на код.

SwiftUI не предоставляет AppleIdButton, так что давайте с этого начнем. Нам нужно будет закрутить одну из них самим. Здесь мы просто обертываем ASAuthorizationAppleIdButton, чтобы мы могли использовать его в SwiftUI.

На этом этапе в ContentView вы должны иметь возможность отобразить официальную кнопку Apple следующим образом:

Button (action: {}) {
  AppleIdButton()
}
//May be style it a little AppleIdButton().background(Color.primary).clipShape(RoundedRectangle(cornerRadius: 8, style: .continuous)).padding(7).frame(width: UIScreen.main.bounds.width - 100, height: 65)

Вернемся к AuthenticationService. Убедитесь, что вы импортировали AuthenticationServices. Он обеспечивает основу для обработки запросов на авторизацию. Далее нам нужно поработать над Координатором. Этот координатор предоставляет механизм для запроса Apple зарегистрировать нового пользователя или войти в систему существующего пользователя.

Давайте внимательно посмотрим на этот код:

  1. Сначала мы создаем запрос с AppleIDProvider и запрашиваем полное имя и адрес электронной почты пользователя. Здесь следует отметить, что это необязательно, и вы можете выбрать, хотите ли вы хранить эти данные или нет.
  2. Затем мы инициализируем ASAuthorizationController с запросом, который мы создаем на первом шаге, и выполняем наш запрос на регистрацию пользователя или вход в систему.
  3. Нам нужен доступ к протоколу ASAuthorizationControllerDelegate, чтобы иметь доступ к функции делегирования для получения подтверждения (успех или неудача здесь)
  4. didCompleteWithAuthorization: после успешного входа пользователя в систему он проверяет, являются ли учетные данные ASAuthorizationAppleIdCredential. Если да, эта функция возвращает имя и адрес электронной почты пользователя. Хотя вы должны хранить это в связке ключей (более безопасно), мы просто сохраняем его в UserDefaults.
  5. didCompleteWithError: важно обработать этот случай, когда вход не выполняется и мы возвращаем локализованное описание ошибки.

Если вы заметили, что мы сохранили пользователя в нашем UserDefault. Поэтому, прежде чем попасть сюда, мы должны проверить, вошел ли пользователь уже в систему. Это позволит пользователю оставаться в системе до тех пор, пока он не выберет выход вручную. Для этого мы напишем оболочку поверх getAppleRequest (), чтобы проверить, вошел ли уже пользователь в систему.

func getUserInfo() {
   if let userData = UserDefaults.standard.object(forKey: "user")                as? Data,
   let userDecoded = try? JSONDecoder().decode(User.self, from:  userData) {
      print("UserData: \(userDecoded)")
      user = userDecoded
   }
}

Давайте немного очистим наш код, создав ViewModel, с которым наш ContentView может взаимодействовать:

Наконец, из нашего представления мы создаем AppleIdButton. Благодаря этому вы сможете перенаправить пользователя в свое приложение, если пользователь уже вошел в систему.

Вот и все! Теперь в ваше приложение встроена функция «Войти через Apple».

Спасибо за прочтение!