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)
}

태그:

카테고리:

업데이트:

댓글남기기