IOS-swift 강제 업데이트 구현
IOS 최신버전으로 강제 업데이트 alert
앱 구동 시 현재 버전 정보를 가져옴
- AppDelegate.swift 에서 구현
// * 앱의 실행 상태가 활성중 즉, Foreground일때 applicationDidBecome 함수를 호출하여 WebView에 전달 받은 URL로 로딩 시킵니다.
if UIApplication.shared.applicationState == .active {
print("active")
if let topViewController = UIApplication.topViewController() as? ViewController {
topViewController.applicationDidBecome()
}
}
- ViewController.swift 에서 구현
- applicationDidBecome 생명주기를 이용해서 앱이 구동 된 적이 있다면 실행하는 로직을 구현합니다.
// - 등록한 이벤트로 이벤트가 수신될 경우, 실행될 함수 입니다.
@objc
public func applicationDidBecome()
{
// * 앱이 구동 된 적이 있다면 실행하는 로직
if !isFirstLoad {
// 업데이트 alert -> release에서만 작동
#if
!DEBUG
if (checkUpdateAvailable()) {
presentUpdateAlertVC()
}
#endif
}
}
앱스토어에서 최신버전 정보 확인
- 앱스토어에서 현재 앱의 버전 정보를 가져옵니다.
- 앱스토어에서 가져온 버전 정보와 현재 앱의 버전 정보를 비교합니다.
- 앱스토어 버전이 높으면 true를 반환합니다.
func checkUpdateAvailable() -> Bool {
// ✅ CFBundleShortVersionString - 릴리즈 혹은 bundle 의 버전.
guard let currentVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String,
// ✅ CFBundleIdentifier - 앱의 bundle ID.
let bundleID = Bundle.main.infoDictionary?["CFBundleIdentifier"] as? String,
let url = URL(string: "http://itunes.apple.com/kr/lookup?bundleId=" + bundleID),
// ✅ init(contentsOf:) - 주어진 URL 의 데이터로 데이터 객체를 초기화합니다.
/* ✅
- 짧은 파일을 동기적으로 읽는데 사용할 수 있습니다.
- 이 동기적 이니셜라이저를 사용해서 네트워크 기반의 URL 을 요청하지 마세요.
- 느린 네트워크에서 오랜 기간 현재 스레드를 차단해서 사용자 경험을 저하시킬 수 있습니다.
*/
// ✅ 해당 URL 을 주소창에 입력하면 file 을 다운 받을 수 있습니다.(JSON 구조의 파일)
let data = try? Data(contentsOf: url),
// ✅ JSONSerialization - Foundation Object 를 JSON 으로 바꾸기 위해서 사용.(JSON 과 Foundation object 간을 변환할 수 있음.)
// ✅ jsonObject - JSON Data 에서 Foundation object 를 생성. 이때 [String: Any] 타입으로 캐스팅.
// ✅ .fragmentsAllowed - parser 가 배열이나 딕셔너리가 아닌 top-level objects 도 허가한다는 의미.(원래 변환 조건에는 'top level object 는 NSArray 혹은 NSDictionary 가 되어야 한다'가 있다.)
let jsonData = try? JSONSerialization.jsonObject(with: data, options: .fragmentsAllowed) as? [String: Any],
let results = jsonData["results"] as? [[String: Any]],
results.count > 0,
// ✅ 파일에서 results 의 version 키의 값을 알기 위해서 진행.
let appStoreVersion = results[0]["version"] as? String else { return false }
// ✅ 예를들어, 1.0.0 으로 표현되는 버전을 [1,0,0] 으로 처리.
let currentVersionArray = currentVersion.split(separator: ".").map { $0 }
let appStoreVersionArray = appStoreVersion.split(separator: ".").map { $0 }
// ✅ [Major].[Minor].[Patch]
// ✅ 모든 자리를 비교해서 앱스토어 버전이 더 높으면 true -> 업데이트 필요
let updateCheck = currentVersionArray.lexicographicallyPrecedes(appStoreVersionArray)
if(updateCheck) {
print("업데이트가 필요합니다")
} else {
print("최신버전입니다")
}
return updateCheck
}
버전정보 비교 후 alert 띄우기
func presentUpdateAlertVC() {
let alertVC = UIAlertController(title: "업데이트", message: "업데이트가 필요해요.", preferredStyle: .alert)
let alertAtion = UIAlertAction(title: "업데이트", style: .default) { _ in
// ✅ URL Scheme 방식을 이용해서 앱스토어를 연결.
guard let url = URL(string: "itms-apps://itunes.apple.com/app/\([여기에 app id 넣어서 앱스토어 링크 연결])") else { return }
// ✅ canOpenURL(_:) - 앱이 URL Scheme 처리할 수 있는지 여부를 나타내는 Boolean 값을 리턴한다.
if UIApplication.shared.canOpenURL(url) {
UIApplication.shared.open(url)
}
}
alertVC.addAction(alertAtion)
present(alertVC, animated: false)
}
댓글남기기