본문 바로가기

프로그래밍/iOS

[iOS] 앱스토어 업데이트 체크

현재 버전과 앱스토어 버전을 비교해서,

앱스토어 버전이 높으면 앱스토어 화면으로 전환하는 로직을 기술



1. AppStore 버전 체크

AppStoreCheck.swift

enum VersionError: Error {

    case invalidResponse, invalidBundleInfo

}


class AppStoreCheck {

    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://itunes.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

    }

}



만약 bundle ID로 체크가 되지 않는 다면  url을 아래와 같이 변경

let url = URL(string: "http://itunes.apple.com/kr/lookup?id=1492026891") // id뒤에 값은 앱정보에 Apple ID에 써있는 숫자, kr을 붙인 이유는 한국에서만 서비스하는 앱이기 때문



2. 사용법

_ = try? AppStoreCheck.isUpdateAvailable { (update, error) in

   if let error = error {

      print(error)

   } else if let update = update { 

      if update {

         self.appUpdate()

         return

      }

   }

}



func appUpdate() {

   // id뒤에 값은 앱정보에 Apple ID에 써있는 숫자

   if let url = URL(string: "itms-apps://itunes.apple.com/app/id1492026891"), UIApplication.shared.canOpenURL(url) {

      // 앱스토어로 이동

      if #available(iOS 10.0, *) {

         UIApplication.shared.open(url, options: [:], completionHandler: nil)

      } else {

          UIApplication.shared.openURL(url)

      }

   }

}