Как преобразовать одностраничный пример протокола AppDelegate.h для входа в Google iOS- > в протокол AppDelegate.swift для перехода на страницу входа в систему?

#ios #swift #google-apps-script

Вопрос:

Пример входа Google на GitHub SignInSampleForPod.xcworkspace создает вход на одну страницу с помощью AppDelegate.h Протокол SignInViewController.m и т. Д.

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

У меня достаточно настроен идентификатор клиента Google iOS, чтобы перейти на мою страницу входа.swift показывает кнопку входа в Google через AppDelegate.swift:

 class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?

func application(
_ app: UIApplication,
open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]
) -> Bool {
var handled: Bool 
handled = GIDSignIn.sharedInstance.handle(url)
if handled {
  return true
}
// Handle other custom URL types.
// If not handled by this app, return false.
return false
}

func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GIDSignIn.sharedInstance.restorePreviousSignIn { user, error in
  if error != nil || user == nil {
    // Show the app's signed-out state.
  } else {
    // Show the app's signed-in state.
  }
}
return true
}
 

И страница входа.swift:

 class LoginViewController: UIViewController {
let signInConfig = GIDConfiguration.init(clientID: "foo-bar85.apps.googleusercontent.com")
override func viewDidLoad() {
    super.viewDidLoad()
GIDSignIn.sharedInstance.signIn(with: signInConfig, presenting: self) { user, error in
      guard error == nil else { return }
      guard let user = user else { return }

      let emailAddress = user.profile?.email

      let fullName = user.profile?.name
      let givenName = user.profile?.givenName
      let familyName = user.profile?.familyName

      let profilePicUrl = user.profile?.imageURL(withDimension: 320)
  }
 

Перейдите на страницу входа в систему

Итак, мой вопрос в том, что такое код входа в Google AppDelegate.swift для полей, показанных ниже, для отображения основной информации профиля:

     // Show the app's signed-out state.
  } else {
    // Show the app's signed-in state.
 

Ответ №1:

Возможно, я не в состоянии ясно понять вашу проблему. Но я пытаюсь ответить, основываясь на своем понимании.

Вы можете создать класс (GoogleLoginManager) для всех материалов, связанных с входом в Google, и создать кнопку в пользовательском интерфейсе, а затем вызвать этот метод (вход) из действия кнопки.

 @IBAction func googleButtonAction(_ sender: Any) {
    
    GoogleLoginManager.shared.signIn(controller: self) { (profile) in
        print("GoogleLogin profile : (String(describing: profile.name)), (String(describing: profile.email))")
        
    } onFailure: { (error) in
        print("GoogleLogin error : (String(describing: error.localizedDescription))")
    }
}
 

импорт основы
импорт GoogleSignIn

класс GoogleLoginManager: SocialLogin {

 fileprivate var onSuccess : success?
fileprivate var onFailure : failure?

static let shared = GoogleLoginManager()
private override init() { }

func signIn(controller: UIViewController, onSuccess : @escaping success, onFailure : @escaping failure) {
    
    self.onSuccess = onSuccess
    self.onFailure = onFailure
    
    GIDSignIn.sharedInstance().clientID = GOOGLE_CLIENT_ID
    GIDSignIn.sharedInstance().delegate = self
    
    GIDSignIn.sharedInstance().presentingViewController = controller
    GIDSignIn.sharedInstance().signIn()
    
    // Automatically sign in the user.
    // GIDSignIn.sharedInstance()?.restorePreviousSignIn()
}

func signOut() {
    GIDSignIn.sharedInstance().signOut()
}
 

}

расширение GoogleLoginManager : GIDSignInDelegate {

 func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!,
          withError error: Error!) {
    if let error = error {
        if (error as NSError).code == GIDSignInErrorCode.hasNoAuthInKeychain.rawValue {
            print("The user has not signed in before or they have since signed out.")
        }
        else if (error as NSError).code == GIDSignInErrorCode.canceled.rawValue {
            print("user canceled the sign in request")
        }
        else {
            print("(error.localizedDescription)")
        }
        self.onFailure?(error)
        return
    }
    var profile =  SocialProfileModel.init(user: user)
    profile.loginSuccess = true
    self.onSuccess?(profile)
}

func sign(_ signIn: GIDSignIn!, didDisconnectWith user: GIDGoogleUser!,
          withError error: Error!) {
    // Perform any operations when the user disconnects from app here.
    print("GIDSignIn : didDisconnectWith")
    
}
 

}

Комментарии:

1. Вы можете проверить полный код здесь : github.com/singh46/SocialLogin-iOS

2. Я отредактировал свой вопрос, думая, что минимум, который мне нужно добавить,-это какой-то стандартный код в поле «Показать состояние входа в приложение».

Ответ №2:

Мне просто нужно было немного изменить вышеприведенное приложение.swift — добавив стандартный UIButton, связанный со следующим действием — получает информацию о профиле:

  @IBAction func LogInButtonTouched(_ sender: UIButton) {
  GIDSignIn.sharedInstance.signIn(with: signInConfig, presenting: self) { user, error in
      guard error == nil else { return }
      guard let user = user else { return }

      let emailAddress = user.profile?.email

      let fullName = user.profile?.name
      let givenName = user.profile?.givenName
      let familyName = user.profile?.familyName

      let profilePicUrl = user.profile?.imageURL(withDimension: 320)
    print("GoogleLogin profile : (String(describing: user.profile?.name)), (String(describing: user.profile?.email))")
  }
}