반응형
앱 스토어 버전 확인 후 앱 업데이트 하기
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("현재 버전이 최신입니다.")
}
}
}
}
}
반응형
'개발 > SWIFT 아이폰' 카테고리의 다른 글
SwiftUI Slider로 화면 밝기 조절 (0) | 2023.07.25 |
---|---|
SwiftUI 티맵 내비 호출 및 경로 안내 (0) | 2023.07.25 |
SwiftUI Kingfisher 이미지 불러오기 (0) | 2023.07.24 |
SwiftUI Checkbox 생성 (0) | 2023.07.24 |
SwiftUI RadioButton 생성 (0) | 2023.07.24 |