1. Başlamadan önce
Bu codelab'de, Google ile oturum açma özelliğini uygulayan ve simülatörde çalışan bir iOS uygulaması oluşturma adımları açıklanmaktadır. Hem SwiftUI hem de UIKit kullanılarak yapılan uygulamalar sağlanır.
SwiftUI, Apple'ın yeni uygulama geliştirme için modern kullanıcı arayüzü altyapısıdır. Tek bir paylaşılan kod tabanından tüm Apple platformları için kullanıcı arayüzleri oluşturulmasına olanak tanır. En az iOS 13 sürümü gerekir.
UIKit, Apple'ın iOS için orijinal ve temel kullanıcı arayüzü çerçevesidir. Eski iOS sürümleri için geriye dönük uyumluluk sağlar. Bu nedenle, çeşitli eski cihazları desteklemesi gereken yerleşik uygulamalar için iyi bir seçenektir.
Geliştirme ihtiyaçlarınıza en uygun olan çerçeveyle ilgili yolu izleyebilirsiniz.
Ön koşullar
Neler öğreneceksiniz?
- Google Cloud projesi oluşturma
- Google Cloud Console'da OAuth istemcileri oluşturma
- iOS uygulamanızda Google ile oturum açma özelliğini uygulama
- Google ile oturum açma düğmesini özelleştirme
- Kimlik jetonunun kodunu çözme
- iOS uygulamanızda Uygulama Kontrolü'nü etkinleştirme
İhtiyacınız olanlar
- Xcode'un güncel bir sürümü
- Yüklü Xcode sürümünün sistem gereksinimlerini karşılayan bir macOS bilgisayar
Bu codelab, iOS 18.3 simülatörüyle Xcode 16.3 kullanılarak oluşturuldu. Geliştirme için Xcode'un en son sürümünü kullanmanız gerekir.
2. Yeni bir Xcode projesi oluşturma
- Xcode'u açın ve Create a new Xcode project'i (Yeni Xcode projesi oluştur) seçin.
- iOS sekmesini seçin, Uygulama şablonunu belirleyin ve İleri'yi tıklayın.

- Proje seçeneklerinde:
- Ürün adınızı girin.
- İsteğe bağlı olarak Ekibinizi seçin.
- Kuruluş Kimliğinizi girin.
- Oluşturulan Bundle Identifier'ı (Paket Kimliği) not edin. İlerleyen aşamalarda bu bilgiye ihtiyacınız olacaktır.
- Arayüz için aşağıdakilerden birini seçin:
- SwiftUI tabanlı bir uygulama için SwiftUI.
- UIKit tabanlı bir uygulama için resimli taslak.
- Dil için Swift'i seçin.
- İleri'yi tıklayın ve projenizi kaydetmek için bir konum seçin.

3. OAuth istemcisi oluşturma
Uygulamanızın Google'ın kimlik doğrulama hizmetleriyle iletişim kurmasına izin vermek için bir OAuth istemci kimliği oluşturmanız gerekir. Bu işlem için Google Cloud projesi gerekir. Aşağıdaki adımlar, proje ve OAuth istemci kimliği oluşturma sürecinde size yol gösterecektir.
Bir Google Cloud projesi seçin veya oluşturun
- Google Cloud Console'a gidip bir proje seçin veya oluşturun. Önceden var olan bir projeyi seçiyorsanız konsol sizi otomatik olarak bir sonraki gerekli adıma yönlendirir.

- Yeni Google Cloud projeniz için bir ad girin.
- Oluştur'u seçin.

İzin ekranınızı yapılandırma
Seçilen proje için daha önce bir izin ekranı yapılandırdıysanız şimdi yapılandırmanız istenmez. Bu durumda, bu bölümü atlayıp OAuth 2.0 istemcisi oluşturma bölümüne geçebilirsiniz.
- İzin ekranını yapılandır'ı seçin.

- Marka bilinci oluşturma sayfasında Başlayın'ı seçin.

- Proje yapılandırma sayfasında aşağıdaki alanları doldurun:
- Uygulama Bilgileri: Uygulamanız için bir ad ve kullanıcı destek e-postası girin. Bu destek e-postası, kullanıcıların izinleriyle ilgili sorular için sizinle iletişime geçebilmesi amacıyla herkese açık olarak gösterilir.
- Kitle: Harici'yi seçin.
- İletişim Bilgileri: Google'ın projenizle ilgili olarak sizinle iletişime geçebileceği bir e-posta adresi girin.
- Google API Hizmetleri: Kullanıcı Verileri Politikası'nı inceleyin.
- Oluştur'u tıklayın.

- Gezinme menüsünde Müşteriler sayfasını seçin.
- Create Client'ı (İstemci Oluştur) tıklayın.

OAuth 2.0 istemcisi oluşturma
- Application type (Uygulama türü) için iOS'i seçin.
- Müşteriniz için bir ad girin.
- Son adımda oluşturulan Bundle Identifier'ı (Paket Tanımlayıcısı) girin.
- Apple tarafından ekibinize atanan Ekip Kimliği'ni girin. Bu adım şu anda isteğe bağlıdır ancak bu codelab'de App Check'i daha sonra etkinleştirmek için bir Takım Kimliği gereklidir.
- Oluştur'u seçin.

- İletişim penceresinden istemci kimliğini kopyalayın. Bu kimliğe daha sonra ihtiyacınız olacaktır.
- Daha sonra başvurmak için plist dosyasını indirin.

4. Xcode projenizi yapılandırma
Bir sonraki adım, Xcode projenizi Google ile oturum açma SDK'sı ile çalışacak şekilde ayarlamaktır. Bu işlem, SDK'yı projenize bağımlılık olarak eklemeyi ve proje ayarlarınızı benzersiz bir istemci kimliğiyle yapılandırmayı içerir. Bu kimlik, oturum açma işlemi sırasında SDK'nın Google'ın kimlik doğrulama hizmetiyle güvenli bir şekilde iletişim kurmasına olanak tanır.
Google ile oturum açma bağımlılıklarını yükleyin
- Xcode projenizi açın.
- File > Add Package Dependencies'e (Dosya > Paket Bağımlılıkları Ekle) gidin.
- Arama çubuğuna Google ile oturum açma deposunun URL'sini girin: https://github.com/google/GoogleSignIn-iOS

- Paket Ekle'yi seçin.
- GoogleSignIn paketi için ana uygulama hedefini seçin.
- SwiftUI kullanıyorsanız GoogleSignInSwift paketi için ana uygulama hedefini seçin. UIKit'i kullanmayı planlıyorsanız bu paket için hedef seçmeyin.
- Paket Ekle'yi seçin.

Uygulamanızın kimlik bilgilerini yapılandırma
- Proje Gezgini'nde projenizin kökünü tıklayın.
- Ana düzenleyici alanında, HEDEFLER listesinden ana uygulama hedefinizi seçin.
- Düzenleyici alanının üst kısmındaki Bilgi sekmesini seçin.
- Özel iOS Hedef Özellikleri bölümündeki son satırın üzerine gelin ve görünen + düğmesini tıklayın.

- Anahtar sütununa GIDClientID yazın.
- Değer sütununa, Google Cloud Console'dan kopyaladığınız istemci kimliğini yapıştırın.

- Google Cloud Console'dan indirdiğiniz plist dosyasını açın.
- Ters İstemci Kimliği değerini kopyalayın.

- Bilgi sekmesinin en altındaki URL Türleri'ni genişletin.
- + düğmesini seçin.
- URL Şemaları kutusuna Ters İstemci Kimliği'ni girin.

Artık uygulamamıza oturum açma düğmesini eklemeye başlayabiliriz.
5. Oturum açma düğmesini ekleme
Xcode projesi yapılandırıldıktan sonra uygulamaya Google ile oturum aç düğmesini eklemeye başlayabilirsiniz.
Bu adımın temel mantığı GIDSignIn.sharedInstance.signIn çağrısıdır. Bu yöntem, kimlik doğrulama sürecini başlatır ve Google ile oturum açma akışını kullanıcıya sunmak için kontrolü Google ile oturum açma SDK'sına devreder.
SwiftUI
- Xcode Proje Gezgini'nde ContentView.swift dosyasını bulun.
- Bu dosyanın içeriğini aşağıdaki metinle değiştirin:
import GoogleSignIn
import GoogleSignInSwift
import SwiftUI
struct ContentView: View {
var body: some View {
VStack {
GoogleSignInButton(action: handleSignInButton).padding()
}
}
func handleSignInButton() {
// Find the current window scene.
guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene else {
print("There is no active window scene")
return
}
// Get the root view controller from the window scene.
guard
let rootViewController = windowScene.windows.first(where: { $0.isKeyWindow })?
.rootViewController
else {
print("There is no key window or root view controller")
return
}
// Start the sign-in process.
GIDSignIn.sharedInstance.signIn(
withPresenting: rootViewController
) { signInResult, error in
guard let result = signInResult else {
// Inspect error
print("Error signing in: \(error?.localizedDescription ?? "No error description")")
return
}
// If sign in succeeded, display the app's main content View.
print("ID Token: \(result.user.idToken?.tokenString ?? "")")
}
}
}
#Preview {
ContentView()
}

UIKit
- Xcode Proje Gezgini'nde ViewController.swift dosyasını bulun.
- Bu dosyanın içeriğini aşağıdaki metinle değiştirin:
import GoogleSignIn
import UIKit
class ViewController: UIViewController {
// Create an instance of the Sign in with Google button
let signInButton = GIDSignInButton()
override func viewDidLoad() {
super.viewDidLoad()
// Add the sign-in button to your view
view.addSubview(signInButton)
// Position the button using constraints
signInButton.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
signInButton.centerXAnchor.constraint(equalTo: view.centerXAnchor),
signInButton.centerYAnchor.constraint(equalTo: view.centerYAnchor),
])
// Add a target to the button to call a method when it's pressed
signInButton.addTarget(self, action: #selector(signInButtonTapped), for: .touchUpInside)
}
// This method is called when the sign-in button is pressed.
@objc func signInButtonTapped() {
// Start the sign-in process.
GIDSignIn.sharedInstance.signIn(withPresenting: self) { signInResult, error in
guard let result = signInResult else {
// Inspect error
print("Error signing in: \(error?.localizedDescription ?? "No error description")")
return
}
// If sign in succeeded, print the ID token.
print("ID Token: \(result.user.idToken?.tokenString ?? "")")
}
}
}

Oturum açma düğmesini görüntüleme
Uygulamanızı simülatörde başlatın. Google ile oturum açma düğmesini görürsünüz ancak bu düğme henüz düzgün çalışmaz. Kullanıcı kimliğini doğruladıktan sonra uygulamanıza geri yönlendirmeyi işleyecek kodu henüz uygulamadığınız için bu durum beklenir.
6. Oturum açma düğmesini özelleştirme
Varsayılan Google ile oturum açma düğmesini, uygulamanızın temasına daha iyi uyacak şekilde özelleştirebilirsiniz. Google ile oturum açma SDK'sı, düğmenin renk şemasını ve stilini değiştirmenize olanak tanır.
SwiftUI
Varsayılan düğme, aşağıdaki kod satırıyla sayfaya eklenir:
GoogleSignInButton(action: handleSignInButton)
GoogleSignInButton, başlatıcısına parametreler iletilerek özelleştirilir. Aşağıdaki kod, oturum açma düğmesinin koyu modda gösterilmesini sağlar.
- ContentView.swift dosyasını açın.
GoogleSignInButtoniçin başlatıcıyı aşağıdaki değerleri içerecek şekilde güncelleyin:
GoogleSignInButton(
scheme: .dark, // Options: .light, .dark, .auto
style: .standard, // Options: .standard, .wide, .icon
state: .normal, // Options: .normal, .disabled
action: handleSignInButton
).padding()

Özelleştirme seçenekleri hakkında daha fazla bilgi için GoogleSignInSwift Framework Reference'a bakın.
UIKit
Varsayılan düğme, aşağıdaki kod satırlarıyla oluşturulur:
// Create an instance of the Sign in with Google button
let signInButton = GIDSignInButton()
// Add the button to your view
view.addSubview(signInButton)
GIDSignInButton, düğme örneğinde özellikler ayarlanarak özelleştirilir. Aşağıdaki kod, oturum açma düğmesinin koyu modda gösterilmesini sağlar.
- ViewController.swift dosyasını açın.
viewDidLoadişlevinde görünümdeki oturum açma düğmesini eklemeden hemen önce aşağıdaki kod satırlarını ekleyin:
// Set the width and color of the sign-in button
signInButton.style = .standard // Options: .standard, .wide, .iconOnly
signInButton.colorScheme = .dark // Options: .dark, .light

Özelleştirme hakkında daha fazla bilgi için GoogleSignIn Framework Reference'a (GoogleSignIn Framework Referansı) bakın.
7. Kimlik doğrulama yönlendirme URL'sini işleme
Oturum açma düğmesi eklendikten sonraki adım, kullanıcının kimliği doğrulandıktan sonra gerçekleşen yönlendirmeyi işlemektir. Kimlik doğrulamanın ardından Google, geçici bir yetkilendirme kodu içeren bir URL döndürür. Oturum açma işlemini tamamlamak için bir işleyici bu URL'yi yakalar ve imzalı bir kimlik jetonu (JWT) ile değiştirilmek üzere Google ile oturum açma SDK'sına iletir.
SwiftUI
Appyapınızı içeren dosyayı açın. Bu dosya projenize göre adlandırılır. Dolayısıyla, dosyanın adı YourProjectNameApp.swift gibi bir şey olur.- Bu dosyanın içeriğini aşağıdaki metinle değiştirin:
import GoogleSignIn
import SwiftUI
@main
struct iOS_Sign_in_with_Google_App: App {
var body: some Scene {
WindowGroup {
ContentView()
.onOpenURL { url in
GIDSignIn.sharedInstance.handle(url)
}
}
}
}
UIKit
- AppDelegate.swift dosyasını açın.
- Dosyanın en üstüne aşağıdaki içe aktarma işlemini ekleyin:
import GoogleSignIn
AppDelegatesınıfının içine aşağıdaki kimlik doğrulama işleyici işlevini ekleyin. Bu kodu yerleştirmek için iyi bir yer,application(_:didFinishLaunchingWithOptions:)yönteminin kapatma ayracından hemen sonrasıdır:
func application(
_ app: UIApplication,
open url: URL,
options: [UIApplication.OpenURLOptionsKey: Any] = [:]
) -> Bool {
var handled: Bool
handled = GIDSignIn.sharedInstance.handle(url)
if handled {
return true
}
// If not handled by this app, return false.
return false
}
Bu değişiklikleri yaptıktan sonra AppDelegate.swift dosyanız şu şekilde görünmelidir:
import GoogleSignIn
import UIKit
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
// Override point for customization after application launch.
return true
}
func application(
_ app: UIApplication,
open url: URL,
options: [UIApplication.OpenURLOptionsKey: Any] = [:]
) -> Bool {
var handled: Bool
handled = GIDSignIn.sharedInstance.handle(url)
if handled {
return true
}
// If not handled by this app, return false.
return false
}
// MARK: UISceneSession Lifecycle
func application(
_ application: UIApplication,
configurationForConnecting connectingSceneSession: UISceneSession,
options: UIScene.ConnectionOptions
) -> UISceneConfiguration {
// Called when a new scene session is being created.
// Use this method to select a configuration to create the new scene with.
return UISceneConfiguration(
name: "Default Configuration",
sessionRole: connectingSceneSession.role
)
}
func application(
_ application: UIApplication,
didDiscardSceneSessions sceneSessions: Set<UISceneSession>
) {
// Called when the user discards a scene session.
// If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
// Use this method to release any resources that were specific to the discarded scenes, as they will not return.
}
}
Oturum açma akışını test etme
Artık oturum açma akışının tamamını test edebilirsiniz.
Uygulamanızı çalıştırın ve oturum açma düğmesine dokunun. Kimliğinizi doğruladıktan sonra Google, uygulamanın bilgilerinize erişmesine izin verebileceğiniz bir izin ekranı gösterir. Onayladığınızda oturum açma işlemi tamamlanır ve uygulamaya geri dönersiniz.
Oturum açma akışı başarıyla tamamlandığında, Google ile oturum açma SDK'sı kullanıcının kimlik bilgilerini cihazın anahtar zincirinde güvenli bir şekilde saklar. Bu kimlik bilgileri daha sonra, kullanıcının sonraki uygulama başlatmalarında oturumunun açık kalmasına izin vermek için kullanılabilir.
8. Oturumu kapatma düğmesi ekleme
Oturum açma işlemi çalıştığına göre, bir sonraki adım oturumu kapatma düğmesi eklemek ve kullanıcı arayüzünü kullanıcının mevcut oturum açma durumunu yansıtacak şekilde güncellemek. Oturum açma işlemi başarılı olduğunda SDK, GIDGoogleUser nesnesi sağlar. Bu nesne, kullanıcı arayüzünü kişiselleştirmek için kullanacağınız, kullanıcının adı ve e-posta adresi gibi temel bilgileri içeren bir profile özelliği içerir.
SwiftUI
- ContentView.swift dosyanızı açın.
ContentViewyapınızın en üstüne bir durum değişkeni ekleyin. Bu değişken, kullanıcı oturum açtıktan sonra kullanıcının bilgilerini tutar.@Statedeğişkeni olduğundan, değeri her değiştiğinde SwiftUI kullanıcı arayüzünüzü otomatik olarak günceller:
struct ContentView: View {
@State private var user: GIDGoogleUser?
}
ContentViewyapınızın mevcutbodydeğerini aşağıdakiVStackile değiştirin. Bu işlem,userdurum değişkeninin kullanıcı içerip içermediğini kontrol eder. Bu durumda, karşılama mesajı ve oturumu kapatma düğmesi gösterilir. Aksi takdirde, orijinal Google ile oturum açma düğmesi gösterilir:
var body: some View {
VStack {
// Check if the user is signed in.
if let user = user {
// If signed in, show a welcome message and the sign-out button.
Text("Hello, \(user.profile?.givenName ?? "User")!")
.font(.title)
.padding()
Button("Sign Out", action: signOut)
.buttonStyle(.borderedProminent)
} else {
// If not signed in, show the "Sign in with Google" button.
GoogleSignInButton(
scheme: .dark, // Options: .light, .dark, .auto
style: .standard, // Options: .standard, .wide, .icon
state: .normal, // Options: .normal, .disabled
action: handleSignInButton
).padding()
}
}
}
- Yeni
userdeğişkeninizesignInResult.userdeğerini atamak içinhandleSignInButtontamamlama bloğunu güncelleyin. Kullanıcı arayüzünün oturum açılmış görünüme geçmesini tetikleyen durumlar:
func handleSignInButton() {
// Find the current window scene.
guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene else {
print("There is no active window scene")
return
}
// Get the root view controller from the window scene.
guard
let rootViewController = windowScene.windows.first(where: { $0.isKeyWindow })?
.rootViewController
else {
print("There is no key window or root view controller")
return
}
// Start the sign-in process.
GIDSignIn.sharedInstance.signIn(
withPresenting: rootViewController
) { signInResult, error in
guard let result = signInResult else {
// Inspect error
print("Error signing in: \(error?.localizedDescription ?? "No error description")")
return
}
DispatchQueue.main.async {
self.user = result.user
}
// If sign in succeeded, display the app's main content View.
print("ID Token: \(result.user.idToken?.tokenString ?? "")")
}
}
- Çıkış yapma düğmeniz tarafından çağrılacak yeni bir
signOutişleviniContentViewyapınızın en altına ekleyin:
func signOut() {
GIDSignIn.sharedInstance.signOut()
// After signing out, set the `user` state variable to `nil`.
self.user = nil
}
Uygulamayı başlatın ve oturum açın. Başarılı bir kimlik doğrulama işleminden sonra kullanıcı arayüzünün değiştiğini görmeniz gerekir.

Bu değişiklikleri yaptıktan sonra ContentView.swift dosyanız şu şekilde görünmelidir:
import GoogleSignIn
import GoogleSignInSwift
import SwiftUI
struct ContentView: View {
@State private var user: GIDGoogleUser?
var body: some View {
VStack {
// Check if the user is signed in.
if let user = user {
// If signed in, show a welcome message and the sign-out button.
Text("Hello, \(user.profile?.givenName ?? "User")!")
.font(.title)
.padding()
Button("Sign Out", action: signOut)
.buttonStyle(.borderedProminent)
} else {
// If not signed in, show the "Sign in with Google" button.
GoogleSignInButton(
scheme: .dark, // Options: .light, .dark, .auto
style: .standard, // Options: .standard, .wide, .icon
state: .normal, // Options: .normal, .disabled
action: handleSignInButton
).padding()
}
}
}
func handleSignInButton() {
// Find the current window scene.
guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene else {
print("There is no active window scene")
return
}
// Get the root view controller from the window scene.
guard
let rootViewController = windowScene.windows.first(where: { $0.isKeyWindow })?
.rootViewController
else {
print("There is no key window or root view controller")
return
}
// Start the sign-in process.
GIDSignIn.sharedInstance.signIn(
withPresenting: rootViewController
) { signInResult, error in
guard let result = signInResult else {
// Inspect error
print("Error signing in: \(error?.localizedDescription ?? "No error description")")
return
}
DispatchQueue.main.async {
self.user = result.user
}
// If sign in succeeded, display the app's main content View.
print("ID Token: \(result.user.idToken?.tokenString ?? "")")
}
}
func signOut() {
GIDSignIn.sharedInstance.signOut()
// After signing out, set the `user` state variable to `nil`.
self.user = nil
}
}
#Preview {
ContentView()
}
UIKit
- ViewController.swift dosyasını açın.
ViewControlleröğesinin en üstünde,signInButtonöğesini bildirdiğiniz yerin hemen altına bir kapatma düğmesi ve bir karşılama etiketi ekleyin:
let signOutButton = UIButton(type: .system)
let welcomeLabel = UILabel()
- Aşağıdaki işlevi
ViewControllerdosyasının en altına ekleyin. Bu işlev, oturum açma durumuna göre kullanıcıya farklı bir kullanıcı arayüzü gösterir:
private func updateUI(for user: GIDGoogleUser?) {
if let user = user {
// User is signed in.
signInButton.isHidden = true
signOutButton.isHidden = false
welcomeLabel.isHidden = false
welcomeLabel.text = "Hello, \(user.profile?.givenName ?? "User")!"
} else {
// User is signed out.
signInButton.isHidden = false
signOutButton.isHidden = true
welcomeLabel.isHidden = true
}
}
viewDidLoadişlevinin en altına, karşılama etiketini ve oturumu kapatma düğmesini görünüme eklemek için aşağıdaki kodu ekleyin:
// --- Set up the Welcome Label ---
welcomeLabel.translatesAutoresizingMaskIntoConstraints = false
welcomeLabel.textAlignment = .center
welcomeLabel.font = .systemFont(ofSize: 24, weight: .bold)
view.addSubview(welcomeLabel)
NSLayoutConstraint.activate([
welcomeLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor),
welcomeLabel.bottomAnchor.constraint(equalTo: signInButton.topAnchor, constant: -20),
])
// --- Set up the Sign-Out Button ---
signOutButton.translatesAutoresizingMaskIntoConstraints = false
signOutButton.setTitle("Sign Out", for: .normal)
view.addSubview(signOutButton)
NSLayoutConstraint.activate([
signOutButton.centerXAnchor.constraint(equalTo: view.centerXAnchor),
signOutButton.topAnchor.constraint(equalTo: signInButton.bottomAnchor, constant: 20),
])
signOutButton.addTarget(self, action: #selector(signOutButtonTapped), for: .touchUpInside)
// --- Set Initial UI State ---
updateUI(for: nil)
- Başarılı bir oturum açma işleminde
UpdateUIyöntemini çağırmak içinsignInButtonTappedişlevini güncelleyin:
@objc func signInButtonTapped() {
// Start the sign-in process.
GIDSignIn.sharedInstance.signIn(withPresenting: self) { signInResult, error in
guard let result = signInResult else {
// Inspect error
print("Error signing in: \(error?.localizedDescription ?? "No error description")")
return
}
// If sign in succeeded, print the ID token.
print("ID Token: \(result.user.idToken?.tokenString ?? "")")
DispatchQueue.main.async {
self.updateUI(for: result.user)
}
}
}
- Son olarak, oturumu kapatma işlemini işlemek için
ViewControlleröğesine birsignOutButtonTappedişlevi ekleyin:
@objc func signOutButtonTapped() {
GIDSignIn.sharedInstance.signOut()
// Update the UI for the signed-out state.
updateUI(for: nil)
}
Uygulamayı başlatın ve oturum açın. Başarılı bir kimlik doğrulama işleminden sonra kullanıcı arayüzünün değiştiğini görmeniz gerekir.

Bu değişiklikleri yaptıktan sonra ViewController.swift dosyanız şu şekilde görünmelidir:
import GoogleSignIn
import UIKit
class ViewController: UIViewController {
// Create an instance of the Sign in with Google button
let signInButton = GIDSignInButton()
let signOutButton = UIButton(type: .system)
let welcomeLabel = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
// Set the width and color of the sign-in button
signInButton.style = .standard // Options: .standard, .wide, .iconOnly
signInButton.colorScheme = .dark // Options: .dark, .light
// Add the sign-in button to your view
view.addSubview(signInButton)
// Position the button using constraints
signInButton.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
signInButton.centerXAnchor.constraint(equalTo: view.centerXAnchor),
signInButton.centerYAnchor.constraint(equalTo: view.centerYAnchor),
])
// Add a target to the button to call a method when it's pressed
signInButton.addTarget(self, action: #selector(signInButtonTapped), for: .touchUpInside)
// --- Set up the Welcome Label ---
welcomeLabel.translatesAutoresizingMaskIntoConstraints = false
welcomeLabel.textAlignment = .center
welcomeLabel.font = .systemFont(ofSize: 24, weight: .bold)
view.addSubview(welcomeLabel)
NSLayoutConstraint.activate([
welcomeLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor),
welcomeLabel.bottomAnchor.constraint(equalTo: signInButton.topAnchor, constant: -20),
])
// --- Set up the Sign-Out Button ---
signOutButton.translatesAutoresizingMaskIntoConstraints = false
signOutButton.setTitle("Sign Out", for: .normal)
view.addSubview(signOutButton)
NSLayoutConstraint.activate([
signOutButton.centerXAnchor.constraint(equalTo: view.centerXAnchor),
signOutButton.topAnchor.constraint(equalTo: signInButton.bottomAnchor, constant: 20),
])
signOutButton.addTarget(self, action: #selector(signOutButtonTapped), for: .touchUpInside)
// --- Set Initial UI State ---
updateUI(for: nil)
}
// This method is called when the sign-in button is pressed.
@objc func signInButtonTapped() {
// Start the sign-in process.
GIDSignIn.sharedInstance.signIn(withPresenting: self) { signInResult, error in
guard let result = signInResult else {
// Inspect error
print("Error signing in: \(error?.localizedDescription ?? "No error description")")
return
}
// If sign in succeeded, print the ID token.
print("ID Token: \(result.user.idToken?.tokenString ?? "")")
DispatchQueue.main.async {
self.updateUI(for: result.user)
}
}
}
private func updateUI(for user: GIDGoogleUser?) {
if let user = user {
// User is signed in.
signInButton.isHidden = true
signOutButton.isHidden = false
welcomeLabel.isHidden = false
welcomeLabel.text = "Hello, \(user.profile?.givenName ?? "User")!"
} else {
// User is signed out.
signInButton.isHidden = false
signOutButton.isHidden = true
welcomeLabel.isHidden = true
}
}
@objc func signOutButtonTapped() {
GIDSignIn.sharedInstance.signOut()
// Update the UI for the signed-out state.
updateUI(for: nil)
}
}
9. Kullanıcının oturum açma durumunu geri yükleme
Geri gelen kullanıcıların deneyimini iyileştirmek için bir sonraki adım, uygulama başlatıldığında oturum açma durumlarını geri yüklemektir. Arama restorePreviousSignIn, kullanıcının her seferinde oturum açma akışını tamamlaması gerekmemesi için anahtar zincirinde kayıtlı kimlik bilgilerini kullanarak kullanıcıyı sessizce yeniden oturum açar.
SwiftUI
- ContentView.swift dosyasını açın.
bodydeğişkenindekiVStackişaretinden hemen sonra aşağıdaki kodu ekleyin:
.onAppear {
// On appear, try to restore a previous sign-in.
GIDSignIn.sharedInstance.restorePreviousSignIn { user, error in
// This closure is called when the restoration is complete.
if let user = user {
// If a user was restored, update the `user` state variable.
DispatchQueue.main.async {
self.user = user
}
// Print the ID token to the console when restored.
print("Restored ID Token: \(user.idToken?.tokenString ?? "")")
}
}
}
ContentView.swift dosyanız şu şekilde görünmelidir:
import GoogleSignIn
import GoogleSignInSwift
import SwiftUI
struct ContentView: View {
@State private var user: GIDGoogleUser?
var body: some View {
VStack {
// Check if the user is signed in.
if let user = user {
// If signed in, show a welcome message and the sign-out button.
Text("Hello, \(user.profile?.givenName ?? "User")!")
.font(.title)
.padding()
Button("Sign Out", action: signOut)
.buttonStyle(.borderedProminent)
} else {
// If not signed in, show the "Sign in with Google" button.
GoogleSignInButton(
scheme: .dark, // Options: .light, .dark, .auto
style: .standard, // Options: .standard, .wide, .icon
state: .normal, // Options: .normal, .disabled
action: handleSignInButton
).padding()
}
}
.onAppear {
// On appear, try to restore a previous sign-in.
GIDSignIn.sharedInstance.restorePreviousSignIn { user, error in
// This closure is called when the restoration is complete.
if let user = user {
// If a user was restored, update the `user` state variable.
DispatchQueue.main.async {
self.user = user
}
// Print the ID token to the console when restored.
print("Restored ID Token: \(user.idToken?.tokenString ?? "")")
}
}
}
}
func handleSignInButton() {
// Find the current window scene.
guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene else {
print("There is no active window scene")
return
}
// Get the root view controller from the window scene.
guard
let rootViewController = windowScene.windows.first(where: { $0.isKeyWindow })?
.rootViewController
else {
print("There is no key window or root view controller")
return
}
// Start the sign-in process.
GIDSignIn.sharedInstance.signIn(
withPresenting: rootViewController
) { signInResult, error in
guard let result = signInResult else {
// Inspect error
print("Error signing in: \(error?.localizedDescription ?? "No error description")")
return
}
DispatchQueue.main.async {
self.user = result.user
}
// If sign in succeeded, display the app's main content View.
print("ID Token: \(result.user.idToken?.tokenString ?? "")")
}
}
func signOut() {
GIDSignIn.sharedInstance.signOut()
// After signing out, set the `user` state variable to `nil`.
self.user = nil
}
}
#Preview {
ContentView()
}
UIKit
- ViewController.swift dosyasını açın.
viewDidLoadyönteminin sonuna aşağıdakirestorePreviousSignInçağrısını ekleyin:
// Attempt to restore a previous sign-in session
GIDSignIn.sharedInstance.restorePreviousSignIn { user, error in
if let user = user {
print("Successfully restored sign-in for user: \(user.profile?.givenName ?? "Unknown")")
// Print the ID token when a session is restored.
print("Restored ID Token: \(user.idToken?.tokenString ?? "")")
// On success, update the UI for the signed-in state on the main thread.
DispatchQueue.main.async {
self.updateUI(for: user)
}
}
}
ViewController.swift dosyanız şu şekilde görünmelidir:
import GoogleSignIn
import UIKit
class ViewController: UIViewController {
// Create an instance of the Sign in with Google button
let signInButton = GIDSignInButton()
let signOutButton = UIButton(type: .system)
let welcomeLabel = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
// Set the width and color of the sign-in button
signInButton.style = .standard // Options: .standard, .wide, .iconOnly
signInButton.colorScheme = .dark // Options: .dark, .light
// Add the sign-in button to your view
view.addSubview(signInButton)
// Position the button using constraints
signInButton.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
signInButton.centerXAnchor.constraint(equalTo: view.centerXAnchor),
signInButton.centerYAnchor.constraint(equalTo: view.centerYAnchor),
])
// Add a target to the button to call a method when it's pressed
signInButton.addTarget(self, action: #selector(signInButtonTapped), for: .touchUpInside)
// --- Set up the Welcome Label ---
welcomeLabel.translatesAutoresizingMaskIntoConstraints = false
welcomeLabel.textAlignment = .center
welcomeLabel.font = .systemFont(ofSize: 24, weight: .bold)
view.addSubview(welcomeLabel)
NSLayoutConstraint.activate([
welcomeLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor),
welcomeLabel.bottomAnchor.constraint(equalTo: signInButton.topAnchor, constant: -20),
])
// --- Set up the Sign-Out Button ---
signOutButton.translatesAutoresizingMaskIntoConstraints = false
signOutButton.setTitle("Sign Out", for: .normal)
view.addSubview(signOutButton)
NSLayoutConstraint.activate([
signOutButton.centerXAnchor.constraint(equalTo: view.centerXAnchor),
signOutButton.topAnchor.constraint(equalTo: signInButton.bottomAnchor, constant: 20),
])
signOutButton.addTarget(self, action: #selector(signOutButtonTapped), for: .touchUpInside)
// --- Set Initial UI State ---
updateUI(for: nil)
// Attempt to restore a previous sign-in session
GIDSignIn.sharedInstance.restorePreviousSignIn { user, error in
if let user = user {
print("Successfully restored sign-in for user: \(user.profile?.givenName ?? "Unknown")")
// Print the ID token when a session is restored.
print("Restored ID Token: \(user.idToken?.tokenString ?? "")")
// On success, update the UI for the signed-in state on the main thread.
DispatchQueue.main.async {
self.updateUI(for: user)
}
}
}
}
// This method is called when the sign-in button is pressed.
@objc func signInButtonTapped() {
// Start the sign-in process.
GIDSignIn.sharedInstance.signIn(withPresenting: self) { signInResult, error in
guard let result = signInResult else {
// Inspect error
print("Error signing in: \(error?.localizedDescription ?? "No error description")")
return
}
// If sign in succeeded, print the ID token.
print("ID Token: \(result.user.idToken?.tokenString ?? "")")
DispatchQueue.main.async {
self.updateUI(for: result.user)
}
}
}
private func updateUI(for user: GIDGoogleUser?) {
if let user = user {
// User is signed in.
signInButton.isHidden = true
signOutButton.isHidden = false
welcomeLabel.isHidden = false
welcomeLabel.text = "Hello, \(user.profile?.givenName ?? "User")!"
} else {
// User is signed out.
signInButton.isHidden = false
signOutButton.isHidden = true
welcomeLabel.isHidden = true
}
}
@objc func signOutButtonTapped() {
GIDSignIn.sharedInstance.signOut()
// Update the UI for the signed-out state.
updateUI(for: nil)
}
}
Sessiz oturum açma özelliğini test etme
Oturum açtıktan sonra uygulamadan tamamen çıkıp uygulamayı yeniden başlatın. Artık düğmeye dokunmanıza gerek kalmadan otomatik olarak oturum açtığınızı görürsünüz.
10. Kimlik jetonunu anlama
GIDGoogleUser nesnesi, kullanıcının adını ve e-posta adresini kullanarak kullanıcı arayüzünü kişiselleştirmek için kullanışlı olsa da SDK'dan döndürülen en önemli veri parçası kimlik jetonudur.
Bu codelab'de, JWT içeriklerini incelemek için bir online araç kullanılır. Bir üretim uygulamasında bu kimlik jetonunu arka uç sunucunuza göndermeniz gerekir. Sunucunuz kimlik jetonunun bütünlüğünü doğrulamalıdır ve JWT'yi kullanarak arka uç platformunuzda yeni bir hesap oluşturma veya kullanıcı için yeni bir oturum başlatma gibi daha anlamlı işlemler yapmalıdır.
JWT jetonuna erişme ve jetonun kodunu çözme
- Uygulamanızı başlatın.
- Xcode konsolunu açın. Yazdırılmış bir kimlik jetonu görürsünüz. Bu,
eyJhbGciOiJSUzI1Ni ... Hecz6Wm4Qgibi görünür. - Kimlik jetonunu kopyalayın ve JWT'nin kodunu çözmek için jwt.io gibi bir online araç kullanın.
Kod çözme işlemi yapılan JWT şöyle görünür:
{
"alg": "RS256",
"kid": "c8ab71530972bba20b49f78a09c9852c43ff9118",
"typ": "JWT"
}
{
"iss": "https://accounts.google.com",
"azp": "171291171076-rrbkcjrp5jbte92ai9gub115ertscphi.apps.googleusercontent.com",
"aud": "171291171076-rrbkcjrp5jbte92ai9gub115ertscphi.apps.googleusercontent.com",
"sub": "10769150350006150715113082367",
"email": "example@example.com",
"email_verified": true,
"at_hash": "JyCYDmHtzhjkb0-qJhKsMg",
"name": "Kimya",
"picture": "https://lh3.googleusercontent.com/a/ACg8ocIyy4VoR31t_n0biPVcScBHwZOCRaKVDb_MoaMYep65fyqoAw=s96-c",
"given_name": "Kimya",
"iat": 1758645896,
"exp": 1758649496
}
Önemli jeton alanları
Kod çözme işlemi yapılan kimlik jetonu, farklı amaçlara yönelik alanlar içerir. Ad ve e-posta gibi bazıları kolayca anlaşılabilirken diğerleri, arka uç sunucunuz tarafından doğrulama için kullanılır.
Aşağıdaki alanı anlamak özellikle önemlidir:
- sub:
subalanı, kullanıcının Google Hesabı için benzersiz ve kalıcı bir tanımlayıcıdır. Kullanıcılar birincil e-posta adreslerini veya adlarını değiştirebilir ancaksubkimlikleri asla değişmez. Bu durum,subalanını arka uç kullanıcı hesaplarınız için birincil anahtar olarak kullanmak üzere mükemmel bir değer haline getirir.
Kimlik jetonundan kullanıcı bilgilerini alma başlıklı makalede, jeton alanlarının anlamları hakkında daha fazla bilgi verilmektedir.
11. Uygulama Kontrolü ile uygulamanızın güvenliğini sağlama
Yalnızca uygulamanızın projeniz adına Google'ın OAuth 2.0 uç noktalarına erişebilmesini sağlamak için App Check'i etkinleştirmeniz önemle tavsiye edilir. Uygulama Kontrolü, arka uç hizmetlerinize gelen isteklerin gerçek ve kurcalanmamış bir cihazdaki orijinal uygulamanızdan geldiğini doğrulayarak çalışır.
Bu bölümde, App Check'i uygulamanıza nasıl entegre edeceğiniz ve hem simülatörde hata ayıklama hem de gerçek cihazda çalışan bir üretim derlemesi için nasıl yapılandıracağınız gösterilmektedir.
Konsol kurulumu
App Check'i uygulamanıza entegre etmek için Google Cloud ve Firebase konsollarında tek seferlik kurulum yapmanız gerekir. Bu işlem için Google Cloud Console'da iOS OAuth istemciniz için App Check'i etkinleştirmeniz, App Check hata ayıklama sağlayıcısıyla kullanılacak bir API anahtarı oluşturmanız ve Google Cloud projenizi Firebase'e bağlamanız gerekir.
Google Cloud Console'da App Check'i etkinleştirme
- Google Cloud projenizle ilişkili istemciler listesine gidin.
- iOS uygulamanız için oluşturduğunuz OAuth 2.0 istemci kimliğini seçin.
- iOS için Google Kimliği'nin altında Uygulama Kontrolü'nü etkinleştirin.

- Kaydet'i tıklayın.
API anahtarı oluşturma
- Google Cloud projenizin API Kitaplığı sayfasına gidin.
- Arama çubuğuna Firebase App Check API yazın.

- Firebase Uygulama Kontrolü API'si'ni seçip etkinleştirin.
- API'ler ve Hizmetler'e gidin ve gezinme menüsünde Kimlik Bilgileri'ni seçin.
- Sayfanın üst kısmındaki Kimlik bilgisi oluştur'u seçin.

- Bu API anahtarına bir ad atayın.
- Uygulama kısıtlamaları bölümünde iOS uygulamalarını seçin.
- Uygulamanızın paket tanımlayıcısını onaylı uygulama olarak ekleyin.
- API kısıtlamaları bölümünde Anahtarı kısıtla'yı seçin.
- Açılır menüden Firebase App Check API'yi seçin.
- Oluştur'u seçin.

- Oluşturulan API anahtarını kopyalayın. Bu bilgiye daha sonraki bir adımda ihtiyacınız olacak.
Firebase'i Google Cloud projenize ekleme
- Firebase konsoluna gidin.
- Firebase projesi oluşturarak başlayın'ı seçin.
- Firebase'i Google Cloud projesine ekle'yi seçin.

- Açılır listeden bir Google Cloud projesi seçin ve kayıt akışına devam edin.
- Firebase ekle'yi seçin.
- Firebase projeniz hazır olduğunda projeyi açmak için Devam'ı seçin.
İstemci tarafı kod entegrasyonu
App Check için Google Cloud projesi yapılandırıldıktan sonra, App Check'i etkinleştirmek üzere istemci tarafı kodunu yazma zamanı gelir. Onay için kullanılan sağlayıcı, üretim ve hata ayıklama ortamlarında farklıdır. Gerçek bir cihazdaki üretim uygulaması, gerçekliğini kanıtlamak için Apple'ın yerleşik App Attest hizmetini kullanır. Ancak iOS simülasyon aracı bu tür bir onay sağlayamadığından hata ayıklama ortamı, API anahtarı iletilen özel bir hata ayıklama sağlayıcısı gerektirir.
Aşağıdaki kod, derleme zamanında doğru sağlayıcıyı otomatik olarak seçmek için bir derleyici yönergesi kullanarak her iki senaryoyu da işler.
SwiftUI
- Ana uygulama dosyasını açın.
- İçe aktarma işlemlerinden sonra ve
@mainözelliğinden önce aşağıdakiAppDelegatesınıfını tanımlayın:
class AppDelegate: NSObject, UIApplicationDelegate {
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil
) -> Bool {
#if targetEnvironment(simulator)
// Configure for debugging on a simulator.
// TODO: Replace "YOUR_API_KEY" with the key from your Google Cloud project.
let apiKey = "YOUR_API_KEY"
GIDSignIn.sharedInstance.configureDebugProvider(withAPIKey: apiKey) { error in
if let error {
print("Error configuring GIDSignIn debug provider: \(error)")
}
}
#else
// Configure GIDSignIn for App Check on a real device.
GIDSignIn.sharedInstance.configure { error in
if let error {
print("Error configuring GIDSignIn for App Check: \(error)")
} else {
print("GIDSignIn configured for App Check.")
}
}
#endif
return true
}
}
- Sağlanan kodda
"YOUR_API_KEY"kısmını Google Cloud Console'dan kopyaladığınız API anahtarıyla değiştirin. - Aşağıdaki satırı
Appstruct'ınızın içine,bodydeğişkeninden hemen önce ekleyin. Bu, AppDelegate sınıfınızı uygulama yaşam döngüsüne kaydeder ve uygulamanın başlatılmasına ve diğer sistem etkinliklerine yanıt vermesini sağlar:
@UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
Ana uygulama dosyanız şu şekilde görünmelidir:
import GoogleSignIn
import SwiftUI
class AppDelegate: NSObject, UIApplicationDelegate {
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil
) -> Bool {
#if targetEnvironment(simulator)
// Configure for debugging on a simulator.
// TODO: Replace "YOUR_API_KEY" with the key from your Google Cloud project.
let apiKey = "YOUR_API_KEY"
GIDSignIn.sharedInstance.configureDebugProvider(withAPIKey: apiKey) { error in
if let error {
print("Error configuring GIDSignIn debug provider: \(error)")
}
}
#else
// Configure GIDSignIn for App Check on a real device.
GIDSignIn.sharedInstance.configure { error in
if let error {
print("Error configuring GIDSignIn for App Check: \(error)")
} else {
print("GIDSignIn configured for App Check.")
}
}
#endif
return true
}
}
@main
struct iOS_Sign_in_with_Google_App: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
var body: some Scene {
WindowGroup {
ContentView()
.onOpenURL { url in
GIDSignIn.sharedInstance.handle(url)
}
}
}
}
UIKit
- AppDelegate.swift dosyasını açın.
application(_:didFinishLaunchingWithOptions:)yöntemini, Uygulama Kontrolü başlatma işlemini içerecek şekilde güncelleyin:
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
#if targetEnvironment(simulator)
// Configure for debugging on a simulator.
// TODO: Replace "YOUR_API_KEY" with the key from your Google Cloud project.
let apiKey = "YOUR_API_KEY"
GIDSignIn.sharedInstance.configureDebugProvider(withAPIKey: apiKey) { error in
if let error {
print("Error configuring GIDSignIn debug provider: \(error)")
}
}
#else
// Configure GIDSignIn for App Check on a real device.
GIDSignIn.sharedInstance.configure { error in
if let error {
print("Error configuring GIDSignIn for App Check: \(error)")
}
}
#endif
return true
}
- Sağlanan kodda
"YOUR_API_KEY"kısmını Google Cloud Console'dan kopyaladığınız API anahtarıyla değiştirin.
AppDelegate.swift dosyanız şu şekilde görünmelidir:
import GoogleSignIn
import UIKit
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
#if targetEnvironment(simulator)
// Configure for debugging on a simulator.
// TODO: Replace "YOUR_API_KEY" with the key from your Google Cloud project.
let apiKey = "YOUR_API_KEY"
GIDSignIn.sharedInstance.configureDebugProvider(withAPIKey: apiKey) { error in
if let error {
print("Error configuring GIDSignIn debug provider: \(error)")
}
}
#else
// Configure GIDSignIn for App Check on a real device.
GIDSignIn.sharedInstance.configure { error in
if let error {
print("Error configuring GIDSignIn for App Check: \(error)")
}
}
#endif
return true
}
func application(
_ app: UIApplication,
open url: URL,
options: [UIApplication.OpenURLOptionsKey: Any] = [:]
) -> Bool {
var handled: Bool
handled = GIDSignIn.sharedInstance.handle(url)
if handled {
return true
}
// If not handled by this app, return false.
return false
}
// MARK: UISceneSession Lifecycle
func application(
_ application: UIApplication,
configurationForConnecting connectingSceneSession: UISceneSession,
options: UIScene.ConnectionOptions
) -> UISceneConfiguration {
// Called when a new scene session is being created.
// Use this method to select a configuration to create the new scene with.
return UISceneConfiguration(
name: "Default Configuration",
sessionRole: connectingSceneSession.role
)
}
func application(
_ application: UIApplication,
didDiscardSceneSessions sceneSessions: Set<UISceneSession>
) {
// Called when the user discards a scene session.
// If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
// Use this method to release any resources that were specific to the discarded scenes, as they will not return.
}
}
Simülatörde Test App Check'i test etme
- Xcode menü çubuğunda Product (Ürün) > Scheme (Şema) > Edit Scheme (Şemayı Düzenle) seçeneğine gidin.
- Gezinme menüsünde Çalıştır'ı seçin.
- Arguments (Bağımsız değişkenler) sekmesini seçin.
- Arguments Passed on Launch (Başlatmada İletilen Parametreler) bölümünde + simgesini seçin ve -FIRDebugEnabled ifadesini ekleyin. Bu başlatma bağımsız değişkeni, Firebase hata ayıklama günlük kaydını etkinleştirir.
- Kapat'ı seçin.

- Uygulamanızı simülatörde başlatın.
- Xcode konsolunda yazdırılan App Check hata ayıklama jetonunu kopyalayın.

- Firebase konsolunda projenize gidin.
- Gezinme menüsünde Oluştur bölümünü genişletin.
- Uygulama Kontrolü'nü seçin.
- Uygulamalar sekmesini seçin.
- Farenizle uygulamanızın üzerine gelin ve üç nokta menü simgesini seçin.

- Hata ayıklama jetonlarını yönetin'i seçin.
- Hata ayıklama jetonu ekle'yi seçin.
- Hata ayıklama jetonunuza bir ad verin ve değer için daha önce kopyaladığınız hata ayıklama jetonunu yapıştırın.
- Jetonunuzu kaydetmek için Kaydet'i seçin.

- Simülatöre dönüp oturum açın.
Metriklerin konsolda görünmesi birkaç dakika sürebilir. Bu işlem tamamlandıktan sonra, iki yerden birinde Doğrulanmış istek sayısında artış olup olmadığını kontrol ederek App Check'in çalıştığını doğrulayabilirsiniz:
- Firebase konsolunun App Check bölümündeki API'ler sekmesinde.

- Google Cloud Console'da OAuth istemcinizin düzenleme sayfasında.

Uygulamanızın Uygulama Kontrolü metriklerini izleyip meşru isteklerin doğrulandığını onayladıktan sonra Uygulama Kontrolü'nü zorunlu kılmayı etkinleştirmeniz gerekir. Uygulandıktan sonra App Check, tüm doğrulanmamış istekleri reddeder. Böylece yalnızca gerçek uygulamanızdan gelen trafik, projeniz adına Google'ın OAuth 2.0 uç noktalarına erişebilir.
12. Ek kaynaklar
Tebrikler!
OAuth 2.0 iOS istemcisi yapılandırdınız, bir iOS uygulamasına Google ile oturum açma düğmesi eklediniz, düğmenin görünümünü nasıl özelleştireceğinizi öğrendiniz, JWT kimlik jetonunun kodunu çözdünüz ve uygulamanız için App Check'i etkinleştirdiniz.
Bu bağlantılar, sonraki adımlarda size yardımcı olabilir:
- iOS için Google ile Oturum Açma'yı kullanmaya başlama
- iOS için Google ile Oturum Açma deposu
- Google kimliği jetonunu doğrulama
- iOS'te Google ile Oturum Açma için App Check'i kullanmaya başlama
- Erişim jetonlarını iptal etme ve uygulamanın bağlantısını kesme
- Google Cloud projeleri hakkında daha fazla bilgi edinin.
- Google Identity kimlik doğrulama yöntemleri
- Uygulama Kontrolü'nü zorunlu kılmayı etkinleştirme