GoogleのAPIを使用してGoogleログイン機能



AppDelegate.swift
GoogleAPIを使うためのトークンの設定
```
import Foundation

import UIKit
import GoogleSignIn

class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Initialize sign-in
        // Google Sign-Inの初期化
        GIDSignIn.sharedInstance.configuration = GIDConfiguration(clientID: "トークン文字列")

        return true
    }

    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        return GIDSignIn.sharedInstance.handle(url)
    }
}

```

ContentView.swift
```
import SwiftUI
import Vision
import VisionKit

import SwiftUI
import GoogleSignIn

struct ContentView: View {
    @StateObject private var signInHandler = SignInHandler()

    var body: some View {
        VStack {
            if let user = signInHandler.user {//-------ログインに成功した場合
                Text("こんにちは！！, \(user.profile?.name ?? "User")")
                Button(action: {
                    signInHandler.signOut()
                }) {
                    Text("ログアウトする")
                }
            } else {//---------------ログアウト状態の場合
                GoogleSignInButton {
                    signInHandler.signIn()
                }
                .frame(width: 200, height: 50)
                .padding()
            }
        }
    }
}


struct GoogleSignInButton: View {
    let action: () -> Void

    var body: some View {
        Button(action: action) {
            HStack {
                Image(systemName: "globe") 
                Text("サインインボタン")
            }
            .frame(width: 200, height: 50)
            .background(Color.blue)
            .foregroundColor(.white)
            .cornerRadius(10)
        }
    }
}

class SignInHandler: ObservableObject {
    @Published var user: GIDGoogleUser?

    func signIn() {
        guard let rootViewController = getRootViewController() else {
            return
        }
        GIDSignIn.sharedInstance.signIn(withPresenting: rootViewController) { signInResult, error in
            if let error = error {
                print("Error signing in: \(error.localizedDescription)")
                return
            }
            guard let user = signInResult?.user else { return }
            DispatchQueue.main.async {
                self.user = user
                print("User signed in: \(user.profile?.name ?? "No Name")")
            }
        }
    }

    func signOut() {
        GIDSignIn.sharedInstance.signOut()
        DispatchQueue.main.async {
            self.user = nil
        }
    }

    private func getRootViewController() -> UIViewController? {
        guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
              let window = windowScene.windows.first else {
            return nil
        }
        return window.rootViewController
    }
}


#Preview {
    ContentView()
}

```
見た目部分(メイン)
```
struct ContentView: View {
    @StateObject private var signInHandler = SignInHandler()

    var body: some View {
        VStack {
            if let user = signInHandler.user {//-------ログインに成功した場合
                Text("こんにちは！！, \(user.profile?.name ?? "User")")
                Button(action: {
                    signInHandler.signOut()
                }) {
                    Text("ログアウトする")
                }
            } else {//---------------ログアウト状態の場合
                GoogleSignInButton {
                    signInHandler.signIn()
                }
                .frame(width: 200, height: 50)
                .padding()
            }
        }
    }
}
```

ログインボタン部分
```
struct GoogleSignInButton: View {
    let action: () -> Void

    var body: some View {
        Button(action: action) {
            HStack {
                Image(systemName: "globe") // ここにGoogleのロゴを追加するか、カスタムビューを使用できます
                Text("サインインボタン")
            }
            .frame(width: 200, height: 50)
            .background(Color.blue)
            .foregroundColor(.white)
            .cornerRadius(10)
        }
    }
}
```

ログインの関数用クラス
```
class SignInHandler: ObservableObject {
    @Published var user: GIDGoogleUser?

    func signIn() {
        guard let rootViewController = getRootViewController() else {
            return
        }
        GIDSignIn.sharedInstance.signIn(withPresenting: rootViewController) { signInResult, error in
            if let error = error {
                print("Error signing in: \(error.localizedDescription)")
                return
            }
            guard let user = signInResult?.user else { return }
            DispatchQueue.main.async {
                self.user = user
                print("User signed in: \(user.profile?.name ?? "No Name")")
            }
        }
    }

    func signOut() {
        GIDSignIn.sharedInstance.signOut()
        DispatchQueue.main.async {
            self.user = nil
        }
    }

    private func getRootViewController() -> UIViewController? {
        guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
              let window = windowScene.windows.first else {
            return nil
        }
        return window.rootViewController
    }
}
```

ログイン用の関数

```
    func signIn() {
        guard let rootViewController = getRootViewController() else {
            return
        }
        GIDSignIn.sharedInstance.signIn(withPresenting: rootViewController) { signInResult, error in
            if let error = error {
                print("Error signing in: \(error.localizedDescription)")
                return
            }
            guard let user = signInResult?.user else { return }
            DispatchQueue.main.async {
                self.user = user
                print("User signed in: \(user.profile?.name ?? "No Name")")
            }
        }
    }
```