[swift] Swift Moya에서 앱 버전 체크 기능 구현하기

앱의 버전 체크는 사용자에게 새로운 업데이트를 안내하거나 오래된 버전의 앱을 지원하지 않을 수 있도록 도와줍니다. 이번 글에서는 Swift에서 Moya를 사용하여 서버의 최신 버전과 앱의 버전을 비교하여 업데이트가 필요한지 확인하는 기능을 구현하는 방법을 알아보겠습니다.

1. 네트워크 요청 설정하기

Moya는 네트워크 요청을 쉽게 처리할 수 있게 도와주는 라이브러리입니다. 먼저 프로젝트에 Moya를 추가하고, 네트워크 요청 관련 설정을 해야 합니다. 아래는 Moya를 사용하는 방법에 대한 간단한 예시입니다.

import Moya

enum MyAPIService {
    // API 엔드포인트를 정의합니다.
    case checkVersion
}

extension MyAPIService: TargetType {
    var baseURL: URL {
        return URL(string: "https://api.example.com")!
    }
    
    var path: String {
        switch self {
        case .checkVersion:
            return "/version"
        }
    }
    
    var method: Moya.Method {
        return .get
    }
    
    var sampleData: Data {
        return Data()
    }
    
    var task: Task {
        return .requestPlain
    }
    
    var headers: [String: String]? {
        return nil
    }
}

let provider = MoyaProvider<MyAPIService>()

위의 코드는 MoyaProvider를 사용하여 API 요청을 수행하는 예시입니다. 이제 앱의 버전을 서버에서 제공하는 최신 버전과 비교하여 업데이트가 필요한지 확인할 수 있도록 코드를 작성해보겠습니다.

2. 버전 체크 API 호출하기

버전 체크 기능을 구현하기 위해선 서버에 버전 정보를 제공하는 API가 필요합니다. 이 API를 호출하여 서버의 최신 버전을 가져올 수 있습니다.

provider.request(.checkVersion) { result in
    switch result {
    case .success(let response):
        do {
            let json = try JSONSerialization.jsonObject(with: response.data, options: [])
            if let serverVersion = json["version"] as? String,
               let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
                // 서버의 최신 버전과 앱의 버전을 비교하여 업데이트 필요 여부를 확인합니다.
                if serverVersion > appVersion {
                    // 업데이트 필요
                } else {
                    // 최신 버전입니다.
                }
            }
        } catch {
            // JSON 파싱 실패
        }
    
    case .failure(let error):
        // API 호출 실패
    }
}

위의 코드는 MoyaProvider를 사용하여 서버에 버전 체크 API를 호출하는 예시입니다. 응답 데이터는 JSON 형식으로 전달되어야 하며, 서버의 최신 버전은 “version” 키를 통해 얻을 수 있습니다. 앱의 버전은 Bundle을 통해 가져올 수 있습니다.

3. 업데이트 안내 화면 표시하기

만약 업데이트가 필요한 경우, 사용자에게 업데이트 필요 안내 화면을 표시해야 합니다. UIKit을 사용하여 적절한 UI를 구성하고, 앱 스토어 링크를 사용하여 업데이트를 유도할 수 있습니다.

func showUpdateAlert() {
    let alert = UIAlertController(title: "업데이트 필요",
                                  message: "새로운 버전의 앱이 출시되었습니다. 업데이트를 진행해주세요.",
                                  preferredStyle: .alert)
    
    let updateAction = UIAlertAction(title: "업데이트", style: .default) { _ in
        if let url = URL(string: "https://itunes.apple.com/app/앱-아이디") {
            UIApplication.shared.open(url, options: [:], completionHandler: nil)
        }
    }
    
    let cancelAction = UIAlertAction(title: "취소", style: .cancel, handler: nil)
    
    alert.addAction(updateAction)
    alert.addAction(cancelAction)
    
    self.present(alert, animated: true, completion: nil)
}

위의 코드는 UIAlertController를 사용하여 업데이트 안내 화면을 표시하는 예시입니다. 사용자가 “업데이트” 버튼을 누를 경우, 앱 스토어로 이동하여 업데이트를 진행할 수 있도록 구성되어 있습니다.

4. 실행 흐름 제어하기

앱의 실행 흐름을 제어하여 업데이트 안내 화면을 표시하거나, 최신 버전일 경우 메인 화면으로 이동하도록 구현할 수 있습니다.

func checkAppVersion() {
    provider.request(.checkVersion) { result in
        switch result {
        case .success(let response):
            do {
                let json = try JSONSerialization.jsonObject(with: response.data, options: [])
                if let serverVersion = json["version"] as? String,
                   let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
                    if serverVersion > appVersion {
                        // 업데이트 필요
                        self.showUpdateAlert()
                    } else {
                        // 최신 버전입니다. 메인 화면으로 이동
                        self.navigateToMainScreen()
                    }
                }
            } catch {
                // JSON 파싱 실패
            }
        
        case .failure(let error):
            // API 호출 실패
        }
    }
}

위의 코드는 checkAppVersion 함수를 호출하여 앱 버전을 체크하고, 업데이트가 필요한 경우 showUpdateAlert 함수를 호출하여 업데이트 안내 화면을 표시하거나, 최신 버전일 경우 navigateToMainScreen 함수를 호출하여 메인 화면으로 이동하는 예시입니다.

결론

이처럼 Swift에서 Moya를 사용하여 서버의 최신 버전과 앱의 버전을 비교하여 업데이트 필요 여부를 확인하는 기능을 구현할 수 있습니다. 앱의 버전 체크는 사용자 경험을 개선하고, 안정적인 앱 서비스를 제공하기 위해 중요한 기능입니다.