iOS uygulamasına Google ile Oturum Açma özelliğini ekleme

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

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

  1. Xcode'u açın ve Create a new Xcode project'i (Yeni Xcode projesi oluştur) seçin.
  2. iOS sekmesini seçin, Uygulama şablonunu belirleyin ve İleri'yi tıklayın.

Xcode proje oluşturma şablonu sayfası

  1. 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.

Xcode proje seçenekleri sayfası

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

  1. 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.

Google Cloud Console proje seçici sayfası

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

Google Cloud Console proje seçici sayfası

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.

  1. İzin ekranını yapılandır'ı seçin.

Google Cloud Console'da, izin ekranını yapılandırma şartıyla OAuth istemcisi oluşturma sayfası

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

Google Cloud Console markalama başlangıç sayfası

  1. 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.

Google Cloud Console istemci markalama yapılandırma sayfası

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

Google Cloud proje istemcileri sayfası

OAuth 2.0 istemcisi oluşturma

  1. Application type (Uygulama türü) için iOS'i seçin.
  2. Müşteriniz için bir ad girin.
  3. Son adımda oluşturulan Bundle Identifier'ı (Paket Tanımlayıcısı) girin.
  4. 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.
  5. Oluştur'u seçin.

OAuth istemcisi ayrıntıları giriş sayfası

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

OAuth istemci kimliği oluşturuldu iletişim kutusu

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

  1. Xcode projenizi açın.
  2. File > Add Package Dependencies'e (Dosya > Paket Bağımlılıkları Ekle) gidin.
  3. Arama çubuğuna Google ile oturum açma deposunun URL'sini girin: https://github.com/google/GoogleSignIn-iOS

Swift Package Manager'da Google ile oturum açma bağımlılığını bulma

  1. Paket Ekle'yi seçin.
  2. GoogleSignIn paketi için ana uygulama hedefini seçin.
  3. 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.
  4. Paket Ekle'yi seçin.

Projenize Google ile oturum açma bağımlılığı ekleme

Uygulamanızın kimlik bilgilerini yapılandırma

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

iOS hedef mülklerine yeni bir hedef anahtarı ekleme

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

GIDClientID'i ana uygulama hedefine ekleyin

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

Google Cloud Console plist dosyası

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

URLSchemes anahtarını ana uygulama hedefine ekleme

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

  1. Xcode Proje Gezgini'nde ContentView.swift dosyasını bulun.
  2. 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()
}

iOS simülatöründe SwiftUI çerçevesiyle Google ile oturum açma düğmesi

UIKit

  1. Xcode Proje Gezgini'nde ViewController.swift dosyasını bulun.
  2. 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 ?? "")")
    }
  }
}

iOS simülatöründe UIKit çerçevesiyle Google ile oturum açma düğmesi

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.

  1. ContentView.swift dosyasını açın.
  2. GoogleSignInButton iç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()

iOS simülatöründe SwiftUI Framework karanlık modunda Google ile oturum açma düğmesi

Ö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.

  1. ViewController.swift dosyasını açın.
  2. viewDidLoad iş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

iOS simülatöründe UIKit çerçevesi karanlık modunda Google ile oturum açma düğmesi

Ö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

  1. App yapı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.
  2. 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

  1. AppDelegate.swift dosyasını açın.
  2. Dosyanın en üstüne aşağıdaki içe aktarma işlemini ekleyin:
import GoogleSignIn
  1. AppDelegate sı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

  1. ContentView.swift dosyanızı açın.
  2. ContentView yapı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. @State değ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?
}
  1. ContentView yapınızın mevcut body değerini aşağıdaki VStack ile değiştirin. Bu işlem, user durum 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()
    }
  }
}
  1. Yeni user değişkeninize signInResult.user değerini atamak için handleSignInButton tamamlama 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 ?? "")")
  }
}
  1. Çıkış yapma düğmeniz tarafından çağrılacak yeni bir signOut işlevini ContentView yapı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.

iOS simülatöründe SwiftUI çerçevesinin oturum açma durumu

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

  1. ViewController.swift dosyasını açın.
  2. 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()
  1. Aşağıdaki işlevi ViewController dosyası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
  }
}
  1. viewDidLoad iş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)
  1. Başarılı bir oturum açma işleminde UpdateUI yöntemini çağırmak için signInButtonTapped iş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)
    }
  }
}
  1. Son olarak, oturumu kapatma işlemini işlemek için ViewController öğesine bir signOutButtonTapped iş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.

iOS simülatöründe UIKit çerçevesinin oturum açma durumu

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

  1. ContentView.swift dosyasını açın.
  2. body değişkenindeki VStack iş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

  1. ViewController.swift dosyasını açın.
  2. viewDidLoad yönteminin sonuna aşağıdaki restorePreviousSignIn ç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

  1. Uygulamanızı başlatın.
  2. Xcode konsolunu açın. Yazdırılmış bir kimlik jetonu görürsünüz. Bu, eyJhbGciOiJSUzI1Ni ... Hecz6Wm4Q gibi görünür.
  3. 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: sub alanı, 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 ancak sub kimlikleri asla değişmez. Bu durum, sub alanı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

  1. Google Cloud projenizle ilişkili istemciler listesine gidin.
  2. iOS uygulamanız için oluşturduğunuz OAuth 2.0 istemci kimliğini seçin.
  3. iOS için Google Kimliği'nin altında Uygulama Kontrolü'nü etkinleştirin.

OAuth istemcisinin düzenleme sayfasında App Check açma/kapatma düğmesi bulunur.

  1. Kaydet'i tıklayın.

API anahtarı oluşturma

  1. Google Cloud projenizin API Kitaplığı sayfasına gidin.
  2. Arama çubuğuna Firebase App Check API yazın.

Google Cloud Console API kitaplığı sayfası

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

Google Cloud Console API kimlik bilgileri sayfası

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

Google Cloud Console API anahtarı oluşturma sayfası

  1. Oluşturulan API anahtarını kopyalayın. Bu bilgiye daha sonraki bir adımda ihtiyacınız olacak.

Firebase'i Google Cloud projenize ekleme

  1. Firebase konsoluna gidin.
  2. Firebase projesi oluşturarak başlayın'ı seçin.
  3. Firebase'i Google Cloud projesine ekle'yi seçin.

Firebase&#39;i mevcut bir Google Cloud projesine ekleme

  1. Açılır listeden bir Google Cloud projesi seçin ve kayıt akışına devam edin.
  2. Firebase ekle'yi seçin.
  3. 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

  1. Ana uygulama dosyasını açın.
  2. İçe aktarma işlemlerinden sonra ve @main özelliğinden önce aşağıdaki AppDelegate sı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
  }
}
  1. Sağlanan kodda "YOUR_API_KEY" kısmını Google Cloud Console'dan kopyaladığınız API anahtarıyla değiştirin.
  2. Aşağıdaki satırı App struct'ınızın içine, body değ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

  1. AppDelegate.swift dosyasını açın.
  2. 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
}
  1. 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

  1. Xcode menü çubuğunda Product (Ürün) > Scheme (Şema) > Edit Scheme (Şemayı Düzenle) seçeneğine gidin.
  2. Gezinme menüsünde Çalıştır'ı seçin.
  3. Arguments (Bağımsız değişkenler) sekmesini seçin.
  4. 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.
  5. Kapat'ı seçin.

Xcode bağımsız değişkenleri düzenleyici sayfası

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

Xcode konsolunda App Check hata ayıklama jetonu

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

Firebase Uygulama Kontrolü ayarları

  1. Hata ayıklama jetonlarını yönetin'i seçin.
  2. Hata ayıklama jetonu ekle'yi seçin.
  3. 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.
  4. Jetonunuzu kaydetmek için Kaydet'i seçin.

Firebase Uygulama Kontrolü hata ayıklama jetonu yönetimi

  1. 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.

Firebase Uygulama Kontrolü metrikleri

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

Google Cloud Console App Check metrikleri

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:

Sık sorulan sorular