개발/SWIFT 아이폰 / / 2023. 8. 2. 14:42

SwiftUI 앱 스토어 버전 확인 후 업데이트

반응형

앱 스토어 버전 확인 후 앱 업데이트 하기

class AppStore {
    // 업데이트 확인 로직을 비동기적으로 수행합니다.
    func checkUpdateAvailable(completion: @escaping (Bool) -> Void) {
        DispatchQueue.global().async {
            guard let currentVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String,
                  let bundleID = Bundle.main.infoDictionary?["CFBundleIdentifier"] as? String,
                  let url = URL(string: "http://itunes.apple.com/lookup?bundleId=" + bundleID) else {
                      // 네트워크 요청에 문제가 있을 경우 false로 처리합니다.
                      completion(false)
                      return
            }

            do {
                let data = try Data(contentsOf: url)
                let jsonData = try JSONSerialization.jsonObject(with: data, options: .fragmentsAllowed) as? [String: Any]
                if let results = jsonData?["results"] as? [[String: Any]], !results.isEmpty,
                   let appStoreVersion = results[0]["version"] as? String {
                    // 업데이트 여부를 비교 로직에 따라 결정합니다.
                    let updateNeeded = self.isUpdateNeeded(currentVersion: currentVersion, appStoreVersion: appStoreVersion)
                    // 결과를 비동기적으로 완료 클로저에 전달합니다.
                    completion(updateNeeded)
                } else {
                    // 결과를 비동기적으로 완료 클로저에 전달합니다.
                    completion(false)
                }
            } catch {
                // 네트워크 요청에 문제가 있을 경우 false로 처리합니다.
                completion(false)
            }
        }
    }

    // 업데이트 여부를 비교하는 로직을 수행합니다.
    private func isUpdateNeeded(currentVersion: String, appStoreVersion: String) -> Bool {
        // 예를 들어, 1.0.0으로 표현되는 버전을 [1, 0, 0]으로 처리합니다.
        let currentVersionArray = currentVersion.split(separator: ".").map { Int($0) ?? 0 }
        let appStoreVersionArray = appStoreVersion.split(separator: ".").map { Int($0) ?? 0 }

        // [Major].[Minor].[Patch]
        // 주요 버전(Major)가 다르거나, 작은 기능 업데이트(Minor)가 다르거나, 버그 수정(Patch)이 다른 경우에도 업데이트가 필요합니다.
        if currentVersionArray[0] < appStoreVersionArray[0]
            || currentVersionArray[0] == appStoreVersionArray[0] && currentVersionArray[1] < appStoreVersionArray[1]
            || currentVersionArray[0] == appStoreVersionArray[0] && currentVersionArray[1] == appStoreVersionArray[1] && currentVersionArray[2] < appStoreVersionArray[2] {
            return true
        }

        // 업데이트가 필요하지 않은 경우에는 false를 반환합니다.
        return false
    }

    // 업데이트 알림을 표시하는 로직을 수행합니다.
    func presentUpdateAlertVC() {
        let alertVC = UIAlertController(title: "업데이트", message: "업데이트가 필요합니다.", preferredStyle: .alert)
        let updateAction = UIAlertAction(title: "업데이트", style: .default) { _ in
            // App Store Connect에서 받은 앱의 Apple ID로 대체해주세요.
            let appleID = "YOUR_APPLE_ID"
            guard let url = URL(string: "itms-apps://itunes.apple.com/app/\(appleID)") else { return }

            // App Store URL을 열 수 있는지 확인한 후 가능하면 App Store로 연결합니다.
            if UIApplication.shared.canOpenURL(url) {
                UIApplication.shared.open(url)
            }
        }
        alertVC.addAction(updateAction)

        // 업데이트 알림을 보여줍니다.
        // 현재 ViewController의 context에 업데이트 알림을 띄웁니다.
        // SwiftUI를 사용하고 있다면, SwiftUI의 네이티브한 alert를 사용하거나 SwiftUI 패키지를 활용하여 사용자 정의 업데이트 프롬프트를 만들 수 있습니다.
        // SwiftUI를 사용하는 경우에는 alert의 표시 여부를 제어하기 위해 binding을 전달하여도 됩니다.
        if let topViewController = UIApplication.shared.windows.first?.rootViewController {
            topViewController.present(alertVC, animated: true, completion: nil)
        }
    }
}

 

버튼 생성 후 적용

struct AppUpdateButton: View {
    let appStore = AppStore()
    
    var body: some View {
        Button("업데이트 확인") {
            // 버튼이 눌렸을 때 업데이트 확인을 비동기적으로 수행합니다.
            appStore.checkUpdateAvailable { updateNeeded in
                 if updateNeeded {
                     // 업데이트가 필요한 경우, 업데이트 알림을 표시합니다.
                     appStore.presentUpdateAlertVC()
                 } else {
                     // 업데이트가 필요하지 않은 경우, 다른 처리를 수행할 수 있습니다.
                     print("현재 버전이 최신입니다.")
                 }
             }
        }
    }
}

 

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유