[iOS][Swift3] Chuyển đổi giữa các môi trường phát triển ứng dụng

Hầu hết các ứng dụng đều connect tới 1 hoặc nhiều service. Các service mà bạn kết nối có thể khác nhau trong từng giai đoạn phát triển của dự án. Ví dụ, bạn có thể sử dụng môi trường staging, local trong thời gian phát triển, môi trường thử nghiệm trong thời gian beta test, và khi lên appstore nó lại sử dụng môi trường phân phối. Việc chuyển đổi giữa các môi trường này thì thường khá rườm rà dễ dàng bị lỗi.

Qua nhiều năm, Tôi đã thử nghiệm nhiều chiến lược khác nhau. Cách đơn giản nhất và nhanh nhất đó là sử dụng marco, dựa trên gia trị của nó để chọn môi trường. Một số nhà phát triển tạo thêm các target để cho những trường hợp cụ thể, Nhưng tôi không thích cách tiếp cận này vì các target khác nhau không phải là giải pháp đúng đắn cho vấn đề này. Giải pháp tốt nhất mà tôi tiếp cận đó là sử dụng Configuration. Configurations được định nghĩa theo từng cấp bậc của dự án, Tức là bạn có thể sử dụng chúng cho tất cả các target của dự án, nó là yếu tố mấu chốt để xác định cấu hình cho các trường hợp build cụ thể (staging, local, testing...).

Trong hướng dẫn này tôi sẽ chỉ cho bạn cách thiết lập Configurations. Kết hợp với schemes, configurations giúp bạn dễ dàng chuyển đổi giữa các môi trường chỉ bằng 1 thao tác. Khởi tạo project: Mở Xcode chọn new Project và chọn Single View Application template.

Chọn tiếp như hình bên dưới:

Bổ sung các thiết lập Các dự án Xcode luôn tạo cho bạn 2 thiết lập build đó là Debug và Release. Với 1 số dự án, thì chỉ cần 2 thiết lập build đó là đủ. Tuy nhiên, giả sử bạn đang làm việc với 1 dịch vụ web. Và web service này định nghĩa 2 môi trường, Staging và Production. Configurations này có thể giúp bạn chuyển đổi giữa 2 môi trường cực dễ dàng với chỉ 1 thao tác click chuột. Chọn vào dự án đang được mở ở project navigator bên trái giao diện xcode. Configurations định nghĩa theo từng cấp bậc của dự án. Để kiểm tra danh sách cấu hình build, mở tab infor ở trên cùng, tìm Configurations section. Trong quá trình phát triển, chúng ta có thể phải chuyển đổi giữa các môi trường staging và production. Chúng ta sẽ tạo các thiết lập tương ứng cho từng môi trường. Double-click Debug đổi tên thành Debug (Staging). Click + button icon nằm bên dưới cùng của bảng danh sách build tạo mới bằng cách chọn Duplicate “Debug” Configuration từ menu. Đổi thành tên mới là Debug (Production). Nếu cần nhiều môi trường cho việc release bạn sẽ lặp lại các bước trên với cấu hình build release (có thể release cho nhiều nhà phân phối khác nhau chẳng hạn). Điều này cực kỳ hữu dụng khi sử dụng hệ thông build tự động. Storing the Configuration in Info.plist Để chắc chắn việc thiết lập trên chạy ok, chúng ta sẽ lưu các cài đặt trong Info.plist. Cực kỳ dễ dàng. Trong Project Navigator phần bên trái, chọn Info.plist, chọn chuột phải, click vào Add Row để tạo key-value pair mới. bạn để key là "Configuration" và chọn value là $(CONFIGURATION). Giá trị Configuration that is sẽ được sử dụng trong quá trình build app.

Định nghĩa các Scheme Với Configuration được lưu trong Info.plist, Chúng ta sẽ tạo 1 vài scheme tương ứng với các môi trường khác nhau. Ở phía trên bên trái của xcode, chọn scheme và chọn Manage Schemes. Chọn vào 1 scheme và click vào icon bánh răng. Từ menu xuất hiện, bạn chọn Duplicate. Lặp lại thêm 1 lần bước đó nữa. Bạn nên có 3 scheme tất cả. Double-click vào từng cái và đổi tên thành Configurations Debug (Staging) và Configurations Debug (Production). Nếu bạn làm việc ở 1 team hoặc xậy dựng quá trình build tự động thì check chọn shared với team của bạn.

Chọn Debug (Staging) rồi chọn Edit... Chúng ta cần chỉ định scheme dùng configuration nào để run ứng dụng. Chọn Run trong danh sách bên trái và phải chắc chắn bạn đang chọn tab info. Thiếu lập Build Configuration là Debug (Staging). làm tương tự với Debug (Production) scheme, thiết lập Build Configuration là Debug (Production).

Thiết lập chi tiết Configuration Có nhiều các khác nhau để bạn thiết lập cấu hình cho các môi trường cụ thể. Có thể lưu trong file JSON nhưng nhược điểm của nó là dễ dàng bị người dùng truy cập và thay đổi sau khi app đã lên store. Nếu dữ liệu bao gồm cả những thông tin nhạy cảm như API, token... thì chúng ta cần có giải pháp an toàn hơn. Đây là cách tôi recomment bạn nên dùng: chúng ta hãy tạo 1 file mới tên là Configuration.swift, khai báo enum cho environment như bên dưới:

enum Environment: String {
    case staging
    case production

    var baseURL: String {
        switch self {
        case .staging: return "https://staging-api.myservice.com"
        case .production: return "https://api.myservice.com"
        }
    }

    var token: String {
        switch self {
        case .staging: return "lktopir156dsq16sbi8"
        case .production: return "5zdsegr16ipsbi1lktp"
        }
    }
}

Nếu bạn có thêm môi trường chỉ việc define thêm vào enum trên mà thôi Tiếp theo tạo struct Configuration define dạng lazy (khởi tạo 1 lần duy nhất) cho environment để lấy các thông tin được lưu trữ trong Info.plist

import UIKit
struct Configuration {
    lazy var environment: Environment = {
        if let configuration = NSBundle.mainBundle().objectForInfoDictionaryKey("Configuration") as? String {
            if configuration.range(of: "Staging") != nil {
                return .staging
            }
        }
        return .production
    }()
}

Tesing Copy dòng code dưới đây vào ứng dụng của bạn:

// Initialize Configuration
var configuration = Configuration()

print(configuration.environment.baseURL)
print(configuration.environment.token)

Chọn Debug (Staging) scheme và chạy. Đây là log bạn xem được.

https://staging-api.myservice.com
lktopir156dsq16sbi8

Tương tự hãy chọn Debug (Production) hoặc Release schemes, để xem thành quả Tạo bản đưa lên store Chọn vào scheme rồi chọn Edit Scheme…. Chọn Archive tab bên trái left và thiết lập Build Configuration. Chọn default build là Release.

Vậy là xong tuy hướng dẫn có vẻ dài nhưng nó thực sự đơn giản và khiến cho việc làm code của chúng ra trở nên dễ dàng hơn rất nhiều, mình đã áp dụng cách này vào dự án mới và thấy nó thực sự hữu ích, và đây là source code nguồn, tiện thể mình đã chuyển qua swift 3 cho các bạn tham khảo Nguồn: https://cocoacasts.com/switching-environments-with-configurations/