#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))")
}
}