현재 버전과 앱스토어 버전을 비교해서,
앱스토어 버전이 높으면 앱스토어 화면으로 전환하는 로직을 기술
1. AppStore 버전 체크
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)
}
}
}
'프로그래밍 > iOS' 카테고리의 다른 글
[iOS] raw data읽어오기 (0) | 2020.03.30 |
---|---|
[iOS] application: supportedInterfaceOrientationsForWindow: not called (0) | 2020.03.26 |
[XCode] sceneDelegate 삭제하기 (0) | 2019.11.16 |
[swift] string으로 함수 호출하기 (0) | 2019.08.27 |
[iOS] http통신 허용하기 (0) | 2019.08.27 |