Từng bước triển khai tính năng Kiểm tra ứng dụng Firebase bằng Cấu hình từ xa Firebase

1. Giới thiệu

Bạn có thể sử dụng tính năng Kiểm tra ứng dụng Firebase với tính năng Chứng thực ứng dụng để bảo vệ các dịch vụ phụ trợ của mình và xác minh rằng các yêu cầu đối với dịch vụ Firebase đến từ ứng dụng chính thống của bạn.

Thông thường, bạn nên giới thiệu dần cho người dùng dịch vụ Chứng thực ứng dụng để tránh đạt đến giới hạn của hạn mức. Để biết thêm thông tin, hãy xem "Chuẩn bị sử dụng Dịch vụ chứng thực ứng dụng" của Apple tài liệu.

Khả năng phát hành dần các bản cập nhật ứng dụng bằng tính năng Kết nối trong App Store của Apple, như mô tả trong phần "Phát hành bản cập nhật phiên bản theo giai đoạn", có thể giúp quá trình phát hành tính năng Kiểm tra ứng dụng diễn ra suôn sẻ hơn. Đây là một giải pháp đơn giản và dễ hiểu. Tuy nhiên, việc phát hành bản cập nhật phiên bản ứng dụng theo giai đoạn không cho phép bạn kiểm soát việc phát hành hoặc thay đổi hành vi của các ứng dụng hiện có, đã cập nhật khi chưa phát hành phiên bản ứng dụng mới.

Một cách để có nhiều quyền kiểm soát hơn đối với quá trình phát hành tính năng Kiểm tra ứng dụng bằng quy trình Kiểm thử ứng dụng là sử dụng Cấu hình từ xa Firebase để bật tính năng Kiểm tra ứng dụng cùng với tính năng Xác thực ứng dụng cho một tỷ lệ phần trăm người dùng ứng dụng tại mỗi thời điểm. Việc này có thể giúp tránh tình trạng điều tiết từ các máy chủ chứng thực. Bạn có thể sử dụng Google Analytics để quan sát tác động của việc triển khai đối với người dùng.

Kiến thức bạn sẽ học được

Trong lớp học lập trình nhiều bước này, bạn sẽ tìm hiểu cách sử dụng Cấu hình từ xa Firebase để triển khai tính năng Kiểm tra ứng dụng cho ứng dụng của mình.

Lớp học lập trình này sử dụng dự án Firebase dựa trên ứng dụng khởi động nhanh DatabaseExample và tích hợp với tính năng Kiểm tra ứng dụng Firebase, như mô tả trong lớp học lập trình Kiểm tra ứng dụng Firebase cho nền tảng Apple. Ứng dụng bắt đầu nhanh DatabaseExample cho phép người dùng đăng nhập và thêm bài đăng bằng các tính năng của Cơ sở dữ liệu theo thời gian thực của Firebase.

Bạn cũng có thể điều chỉnh các bước trong lớp học lập trình này để kiểm thử ứng dụng của riêng mình.

Điều kiện tiên quyết

Bạn cần có

  • Xcode 12.5 trở lên
  • Đối với quy trình kiểm thử Chứng thực ứng dụng:
  • Dự án Firebase có:
  • Có quyền truy cập vào dự án Firebase được liên kết với ứng dụng của bạn, với quyền tạo và quản lý Cấu hình từ xa cũng như xem Google Analytics

2. Tạo một nhà cung cấp dịch vụ chứng thực tuỳ chỉnh

Ở bước này, chúng ta sẽ tạo một lớp nhà cung cấp tuỳ chỉnh để chỉ cung cấp mã thông báo khi tính năng Kiểm thử ứng dụng được bật. Cấu hình từ xa dựa vào một phiên bản ứng dụng Firebase đã định cấu hình và nhà cung cấp tuỳ chỉnh mà bạn triển khai trong bước này đóng vai trò là phần giữ chỗ để hoàn tất việc định cấu hình.

Để hoàn tất các bước sau, bạn cần thêm Firebase, FirebaseRemoteConfigFirebaseAnalytics trong phần Khung, Thư viện và Nội dung được nhúng của ứng dụng trong Xcode. Để xem ví dụ về cách thực hiện việc này, hãy tham khảo Lớp học lập trình về tính năng Kiểm tra ứng dụng Firebase dành cho nền tảng của Apple.

  1. Tạo một tệp "MyAppCheckProvider" là một lớp con của NSObject phù hợp với giao thức AppCheckProvider.
  2. Bao gồm một phương thức getToken() trống mà bạn sẽ điền sau.

Hãy xem mã ví dụ sau đây cho lớp nhà cung cấp tuỳ chỉnh có phương thức getToken() trống.

// MyAppCheckProvider.swift

import Firebase
import FirebaseAnalytics
import FirebaseAppCheck
import FirebaseRemoteConfig

class MyAppCheckProvider: NSObject, AppCheckProvider {
  func getToken(completion handler: @escaping (AppCheckToken?, Error?) -> Void) {}
}

Để tạo AppAttestProvider, bạn cần truyền một thực thể của FirebaseApp tương ứng. Tạo thuộc tính được lưu trữ cho thuộc tính đó và chấp nhận thuộc tính làm tham số trình khởi tạo:

// MyAppCheckProvider.swift

import Firebase
import FirebaseAnalytics
import FirebaseAppCheck
import FirebaseRemoteConfig

class MyAppCheckProvider: NSObject, AppCheckProvider {
  // Firebase app instance served by the provider.
  let firebaseApp: FirebaseApp

  // The App Check provider factory should pass the FirebaseApp instance.
  init(app: FirebaseApp) {
    self.firebaseApp = app
    super.init()
  }

  func getToken(completion handler: @escaping (AppCheckToken?, Error?) -> Void) {}
}

Chuyển tiếp yêu cầu mã thông báo đến nhà cung cấp dịch vụ Kiểm thử ứng dụng

Bây giờ, bạn đã có mọi thứ để chuyển tiếp yêu cầu mã thông báo đến nhà cung cấp dịch vụ Kiểm thử ứng dụng trong phương thức getToken().

Lưu ý: Tìm hiểu thêm về phương thức getToken() trong Tài liệu tham khảo về khung FirebaseAppCheck.

Thêm mã sau vào phương thức getToken():

// MyAppCheckProvider.swift

import Firebase
import FirebaseAnalytics
import FirebaseAppCheck
import FirebaseRemoteConfig

class MyAppCheckProvider: NSObject, AppCheckProvider {
  // Firebase app instance served by the provider.
  let firebaseApp: FirebaseApp

  // The App Check provider factory should pass the FirebaseApp instance.
  init(app: FirebaseApp) {
    self.firebaseApp = app
    super.init()
  }

  private lazy var appAttestProvider = AppAttestProvider(app: firebaseApp)

  func getToken(completion handler: @escaping (AppCheckToken?, Error?) -> Void) {
    // Fetch App Attest flag from Remote Config
    let remoteConfig = RemoteConfig.remoteConfig(app: firebaseApp)
    remoteConfig.fetchAndActivate { remoteConfigStatus, error in
      // Get App Attest flag value
      let appAttestEnabled = remoteConfig.configValue(forKey: "AppAttestEnabled").boolValue

      guard appAttestEnabled else {
        // Skip attestation if App Attest is disabled. Another attestation
        // method like DeviceCheck may be used instead of just skipping.
        handler(nil, MyProviderError.appAttestIsDisabled)
        return
      }

      // Try to obtain an App Attest provider instance and fail if cannot
      guard let appAttestProvider = self.appAttestProvider else {
        handler(nil, MyProviderError.appAttestIsUnavailable)
        return
      }

      // If App Attest is enabled for the app instance, then forward the
      // Firebase App Check token request to the App Attest provider
      appAttestProvider.getToken(completion: handler)
    }
  }
}

enum MyProviderError: Error {
  case appAttestIsDisabled
  case appAttestIsUnavailable
  case unexpected(code: Int)
}

Đoạn mã trước sẽ kiểm tra tham số boolean AppAttestEnabled của Cấu hình từ xa (thông số Cấu hình từ xa này sẽ được tạo sau trong lớp học lập trình này). Nếu giá trị này là false, thì mã đó không hoạt động, cho biết tính năng Kiểm tra ứng dụng chưa được triển khai trên thiết bị hiện tại. Nếu giá trị này là true, thì mã này sẽ cố gắng lấy nhà cung cấp Kiểm thử ứng dụng và sẽ không thành công nếu không thể. Nếu các bước kiểm tra lỗi này được vượt qua, mã sẽ chuyển tiếp yêu cầu mã thông báo đến nhà cung cấp Kiểm thử ứng dụng.

Thêm sự kiện Analytics

Bằng cách thêm sự kiện Analytics, bạn sẽ có được thông tin chi tiết hơn về mức độ thành công của việc triển khai tính năng Kiểm tra ứng dụng. Analytics sẽ giúp xác định xem có nên bật tính năng Chứng thực ứng dụng cho nhiều đối tượng hơn hay không.

Ghi lại 2 sự kiện Analytics: AppAttestSuccess khi thành công và AppAttestFailure khi không thành công. Hai sự kiện Analytics này có thể giúp theo dõi mức độ thành công của việc phát hành tính năng Kiểm tra ứng dụng và giúp bạn quyết định xem có nên phát hành trên quy mô lớn hơn hay không.

func getToken(completion handler: @escaping (AppCheckToken?, Error?) -> Void) {
  // Fetch Remote Config.
  let remoteConfig = RemoteConfig.remoteConfig(app: firebaseApp)
  remoteConfig.fetchAndActivate { remoteConfigStatus, error in
    // Get App Attest flag value from Remote Config.
    let appAttestEnabled = remoteConfig.configValue(forKey: "AppAttestEnabled").boolValue

    guard appAttestEnabled else {
      // Skip attestation if App Attest is disabled. Another attestation
      // method like DeviceCheck may be used instead of just skipping.
      handler(nil, MyProviderError.appAttestIsDisabled)
      return
    }

    // Try to obtain an App Attest provider instance and fail otherwise.
    guard let appAttestProvider = self.appAttestProvider else {
      handler(nil, MyProviderError.appAttestIsUnavailable)
      return
    }

    // If App Attest is enabled for the app instance, then forward the
    // Firebase App Check token request to the App Attest provider.
    appAttestProvider.getToken { token, error in
      // Log an Analytics event to track attestation success rate.
      let appAttestEvent: String
      if (token != nil && error == nil) {
        appAttestEvent = "AppAttestSuccess"
      } else {
        appAttestEvent = "AppAttestFailure"
      }
      Analytics.logEvent(appAttestEvent, parameters: nil)

      // Pass the result to the handler
      handler(token, error)
    }
  }
}

3. Cập nhật lớp Provider Factory

Sau khi triển khai logic để chuyển tiếp yêu cầu mã thông báo đến trình cung cấp Kiểm thử ứng dụng và thêm một số sự kiện Analytics, bạn cần cập nhật MyAppCheckProviderFactory.class mà bạn đã tạo trong lớp học lập trình Kiểm tra ứng dụng cho nền tảng Apple. Lớp này sẽ nhắm đến trình cung cấp dịch vụ gỡ lỗi Kiểm tra ứng dụng cho các trình mô phỏng và nhắm đến nhà cung cấp tuỳ chỉnh của bạn.

Chỉnh sửa mã sau trong lớp MyAppCheckProviderFactory mà bạn đã tạo trong lớp học lập trình Kiểm tra ứng dụng Firebase dành cho nền tảng Apple:

// MyAppCheckProviderFactory.swift

import Firebase

class MyAppCheckProviderFactory: NSObject, AppCheckProviderFactory {
  func createProvider(with app: FirebaseApp) -> AppCheckProvider? {
      #if targetEnvironment(simulator)
      // App Attest is not available on simulators.
      // Use a debug provider.
      let provider = AppCheckDebugProvider(app: app)

      // Print only locally generated token to avoid a valid token leak on CI.
      print("Firebase App Check debug token: \(provider?.localDebugToken() ?? "" )")

      return provider
      #else
      if #available(iOS 14.0, *) {
        // Use your custom App Attest provider on real devices.
        return MyAppCheckProvider(app: app)
      } else {
        return DeviceCheckProvider(app: app)
      }
      #endif
  }
}

Xác nhận bạn đã đặt AppCheckProviderFactory trước khi định cấu hình FirebaseApp:

// DatabaseExampleApp.swift

import SwiftUI
import Firebase
import FirebaseAppCheck

@main
struct DatabaseExampleApp: App {
  init() {
    AppCheck.setAppCheckProviderFactory(MyAppCheckProviderFactory())
    FirebaseApp.configure()
  }

  // ...
}

4. Thêm thông số Cấu hình từ xa trong bảng điều khiển của Firebase

Bây giờ, bạn sẽ thêm thông số Cấu hình từ xa AppAttestEnabled vào bảng điều khiển của Firebase . Phương thức getToken của bạn cần có tham số này.

Cách tạo thông số Cấu hình từ xa trong bảng điều khiển của Firebase :

  1. Mở Cấu hình từ xa cho dự án của bạn rồi nhấp vào Thêm thông số. Nếu đây là lần đầu tiên bạn sử dụng Cấu hình từ xa, hãy nhấp vào Tạo cấu hình.
  2. Trong trường Tên thông số (khoá), hãy nhập AppAttestEnabled.
  3. Trong trình đơn thả xuống Loại dữ liệu, hãy chọn Boolean.
  4. Từ trình đơn thả xuống Default value (Giá trị mặc định), hãy chọn false (sai).

Tạo thông số Cấu hình từ xa trong bảng điều khiển của Firebase

Trước khi nhấp vào Lưu, hãy tạo một giá trị có điều kiện cho 10% người dùng:

  1. Nhấp vào Thêm mới > Giá trị có điều kiện > Tạo điều kiện mới.
  2. Trong trường Name (Tên), hãy nhập một tên điều kiện.
  3. Trong mục Áp dụng nếu..., hãy chọn Người dùng trong phân vị ngẫu nhiên, <=, sau đó nhập 10 vào trường %.
  4. Nhấp vào Tạo điều kiện.

Xác định điều kiện Cấu hình từ xa trong bảng điều khiển của Firebase

Đặt giá trị có điều kiện thành true để tính năng Xác thực ứng dụng sẽ ra mắt cho 10% người dùng của bạn.

  1. Đặt giá trị thành true cho điều kiện bạn vừa tạo.
  2. Nhấp vào Lưu.

Xem xét thông số Cấu hình từ xa trong bảng điều khiển của Firebase

Khi hoàn tất, hãy xuất bản các thay đổi về Cấu hình từ xa.

Kiểm thử việc phát hành trên thiết bị của bạn

Để thử nghiệm các giá trị gắn cờ Cấu hình từ xa trên thiết bị của bạn mà không cần sửa đổi mã ứng dụng, hãy định cấu hình một thử nghiệm trên thông số AppAttestEnabled theo hướng dẫn Tạo thử nghiệm cấu hình từ xa Firebase bằng tính năng Thử nghiệm A/B. Phần hướng dẫn "Xác thực thử nghiệm trên thiết bị thử nghiệm" giải thích cách chỉ định các giá trị khác nhau cho thiết bị thử nghiệm.

Bước cuối cùng là sử dụng Google Analytics để theo dõi mức độ thành công của việc phát hành Kiểm thử ứng dụng.

5. Xem xét mức độ thành công của quá trình phát hành AppCheck

Bạn có thể đo lường mức độ thành công của việc triển khai trên trang tổng quan Sự kiện Analytics. Theo dõi các sự kiện AppAttestSuccessAppAttestFailure. Có thể mất đến 24 giờ thì sự kiện mới xuất hiện trên trang tổng quan. Ngoài ra, bạn có thể bật tính năng gỡ lỗi và sử dụng DebugView để xem các sự kiện gỡ lỗi nhanh hơn.

Nếu muốn, bạn có thể theo dõi trang tổng quan Crashlytics để biết mức tăng về tỷ lệ sự cố. Để biết thêm thông tin về cách thêm Crashlytics vào ứng dụng của bạn, hãy xem bài viết Bắt đầu sử dụng Firebase Crashlytics.

Khi bạn thấy chủ yếu là các sự kiện AppAttestSuccess và một số sự kiện AppAttestFailure, thì đó là dấu hiệu tốt cho thấy bạn có thể tăng tỷ lệ phần trăm người dùng đã bật tính năng Kiểm tra ứng dụng bằng cách sửa đổi điều kiện trong thông số Cấu hình từ xa AppAttestEnabled.

Xem xét sự kiện Analytics trong bảng điều khiển của Firebase

Không bắt buộc: Tận dụng đối tượng Google Analytics

Nếu muốn tận dụng thêm sự kiện Analytics AppAttestEnabled, bạn có thể tạo một Đối tượng Analytics để theo dõi người dùng khi AppAttestEnabled được đặt thành true.

App Attest được phát hành cùng với iOS 14.0. Một số người dùng của bạn có thể không sử dụng bản phát hành này và do đó không đủ điều kiện tham gia chương trình Kiểm thử ứng dụng. Bạn có thể ghi lại một sự kiện Analytics khác để theo dõi những người dùng này, sau đó nhắm đến đối tượng đó bằng một phương thức chứng thực khác, chẳng hạn như DeviceCheck.

Không bắt buộc: Sử dụng Crashlytics để theo dõi sự cố

Để hiểu rõ hơn về độ ổn định của ứng dụng trong quá trình phát hành, hãy sử dụng Firebase Crashlytics để theo dõi sự cố và lỗi không nghiêm trọng.

6. Xin chúc mừng!

Bạn đã triển khai thành công tính năng Kiểm tra ứng dụng bằng Cấu hình từ xa 🎉

Tài nguyên khác: