본문 바로가기
iOS/Swift

[iOS - Swift] 현재 버전과 앱 스토어 버전 체크

by Logan Jung 2021. 8. 25.
반응형

안녕하세요 기린입니다  : ]

이번 글은 현재 개발중인 앱 ( Xcode - General - Identity 의 Version ) 버전과 

앱 스토어에 출시되어 있는 앱 버전을 비교하여

만약 출시되어 있는 버전보다 현재 버전이 낮으면

앱 스토어 화면으로 이동하는 프로그램에 대해 알아보겠습니다

 

첫 번째 현재 개발중인 앱 버전을 불러와야겠죠 ?

먼저 AppVersionCheck.swift 를 생성해줍니다

import Foundation

// 오류 열거형 타입 enum 선언
enum VersionError: Error {
  case invalidResponse, invalidBundleInfo
}

class AppVersionCheck {
    // 코드 작성
}

Xcode 의 현재 앱 버전 과 AppStore 출시 버전을 가져와 비교하는 코드를 작성해볼게요

class AppVersionCheck {
    // 코드작성
    static func isUpdateAvailable(completion: @escaping (Bool?, Error?) -> Void) throws -> URLSessionDataTask {
        guard let info = Bundle.main.infoDictionary,
            let currentVersion = info["CFBundleShortVersionString"] as? String, // 현재 버전 가져오기
            let identifier = info["CFBundleIdentifier"] as? String, // 앱 번들아이디 가져오기
            let url = URL(string: "http://itundes.apple.com/kr/lookup?bundleId=\(identifier)") else {
                throw VersionError.invalidBundleInfo 
            }
        let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
            do {
                if let error = error { throw error }
                guard let data = data else { throw VersionError.invalidResponse }
                let json = try JSONSerialization.jsonObject(with: data, options: [.allowFragments]) as? [String: Any]
                guard let result = (json?["results"] as? [Any])?.first as? [String: Any], let version = result["version"] as? String else {
                    throw VersionError.invalidResponse
                } // 앱스토어 버전 가져오기
                let verFloat = NSString.init(string: version).floatValue
                let currentVerFloat = NSString.init(string: currentVersion).floatValue
                completion(verFloat > currentVerFloat, nil) // 현재 버전이 앱스토어 버전보다 큰지를 Bool 값으로 반환
            } catch {
                completion(nil, error)
            }
        }
        task.resume()
        return task
    }
}

이해가 되실까요?? : )

자 이제 앱 버전이 최신인지 체크하는 함수를 만들었으니 ViewController.swift 에서 사용해보겠습니다


import UIKit

class ViewController: UIViewController {
	
    @IBOutlet weak var hello_label: UILabel!
    
    // 뷰 불러오기 후
    override func viewDidLoad() {
    	super.veiwDidLoad()
        
        // 앱 버전 체크 실행
        checkVersionTask()
    }
    

    func checkVersionTask() {
        _ = try? AppVersionCheck.isUpdateAvailable { (update, error) in
            if let error = error {
                print(error)
            } else if let update = update {
                if update {
                    print("This App is old version")
                    self.appUpdate()
                    return
                } else {
                    print("This App is latest version")
                    return
                }
            }
        }
    }
    
    // AppStore 이동
    func appUpdate() {
        let appleId = "Apple ID"        // 앱 스토어에 일반 정보의 Apple ID 입력
        // UIApplication 은 Main Thread 에서 처리
        DispatchQueue.main.async {
            if let url = URL(string: "itms-apps://itunes.apple.com/app/\(appleId)"), UIApplication.shared.canOpenURL(url) {
                if #available(iOS 10.0, *) {
                    UIApplication.shared.open(url, options: [:], completionHandler: nil)
                } else {
                    UIApplication.shared.openURL(url)
                }
            }
        }
    }
}

앱이 시작될 때

최신 앱버전인지 체크해줌으로써 사용자에게 최적화된 환경을 제공할 수 있겠죠?? : )

뷰 생명주기 중 viewDidLoad 시점이 아니라 다른 시점에서도 

사용할 수 있을 것 같아요 : ]

 

문의: ralla0405@gmail.com

 

반응형