티스토리 뷰
내용
심각한 버그를 릴리즈한 후 발견했다거나!
핵심 기능의 변경이 있다던가!
서버 url 이 변경이 있다던지!
마지막 사례를 지인에게 듣고 아찔해졌던 경험이 있었다.. 그리고 필수로 업데이트를 권장해야 할 순간이 올 수 있다고 생각했습니다. 그래서 본 내용에 대해서 찾아보았습니다.
강제 업데이트 혹은 최신버전을 확인 후 업데이트 하는 기능은 팀에게는 편한 기능이지만, 사용자에게는 업데이트를 하지 않게되면 지속적으로 괴롭힐 수 있고, 이 부분이 오히려 이탈로 이어질 수도 있다는 생각도 들었습니다.
그래도 그정도로 리스크를 가지고도 필요한 순간이 올 때는 오히려 있으면 다행인 기능이 될거라는 생각이 들었습니다.
원리
http://itunes.apple.com/lookup?bundleId=(bundle ID)
를 통해서 다운받은 file 의 JSON 형태 중results
의version
을 현재 앱의 버전과 비교해서 업데이트 alert 창을 띄우도록 했습니다.
앱이 출시된 후, 해당 주소를 통해서 다운받은 file 에서 version 정보를 얻을 수 있었습니다!
URL Scheme
(itms-apps://itunes.apple.com/app/(앱 정보의 Apple ID)
)를 사용해서 앱스토어를 열었습니다.
private 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/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]
// ✅ 앞자리(Major)가 낮으면 업데이트
if currentVersionArray[0] < appStoreVersionArray[0] {
return true
} else {
// ✅ 중간자리(Minor) 역시 낮으면 업데이트
return currentVersionArray[1] < appStoreVersionArray[1] ? true : false
}
}
private func presentUpdateAlertVC() {
let alertVC = UIAlertController(title: "업데이트", message: "업데이트가 필요합니다.", preferredStyle: .alert)
let alertAtion = UIAlertAction(title: "업데이트", style: .default) { _ in
// ✅ App store connet 앱의 일반 정보의 Apple ID 입력.
let appleID = "..."
// ✅ URL Scheme 방식을 이용해서 앱스토어를 연결.
guard let url = URL(string: "itms-apps://itunes.apple.com/app/\(appleID)") else { return }
// ✅ canOpenURL(_:) - 앱이 URL Scheme 처리할 수 있는지 여부를 나타내는 Boolean 값을 리턴한다.
if UIApplication.shared.canOpenURL(url) {
UIApplication.shared.open(url)
}
}
alertVC.addAction(alertAtion)
present(alertVC, animated: true)
}
CFBundleShortVersionString
개발자문서를 확인하면서 key 의 값들의 포맷에 대해서 확인할 수 있었습니다.
[Major].[Minor].[Patch]:
Major
: A major revision number.Minor
: A minor revision number.Patch
: A maintenance release number.
참고:
여러 글들에서 http~ 주소를 사용하게 되면 어떨때는 뜨고 어떨때는 안된다는 내용이 있었고, 최신화가 되지 않는 이유로 https~ 로 변경해주면 반영이 된다고 했다.(앱스토어에 완전히 반영이 되려면 24시간정도 걸린다고 하고.. http~ 의 경우는 https~ 보다 늦다고 한다.)
그런데..! https 로 설정해두니 웹 페이지에서 파일은 다운로드 되는데 해당 코드에서 프린트 해보니 다른 파일(출시 이전처럼 내용들이 비어있는 파일)을 다운로드하고 있었다..(이건 참 이상하다..)
그래서 http 로 변경했더니 잘됐다..!(...어째서...?) 그래서 이것도 참고해두면 좋을 것 같다.
---- 24시간 후
24시간이 지난 후에 https~ 확인해보니까! 정상적으로 동작하였다...! 참고해두면 좋을 것 같다.🙂
출처:
'iOS' 카테고리의 다른 글
Swift) Monard (0) | 2022.05.05 |
---|---|
iOS) 앱 심사 리젝 해결(Guideline 5.1.1 / 5.1.2) (0) | 2022.05.05 |
iOS) Shadowing 에 대해서 생각해보자 (0) | 2022.04.21 |
iOS) 이모지 키보드 높이 대응하기 (2) | 2022.04.17 |
iOS) Firebase 에서 동적링크 만들기 (0) | 2022.04.14 |
- WWDC
- IOS
- WWDC22
- YPImagePicker
- Swift
- WidgetKit
- watchOS
- containerBackground
- RxCocoa
- SwiftUI
- rxswift
- urlsession
- Firebase
- async/await
- APNS
- 서버통신
- MOYA
- github
- Notification
- Objective-C
- Widget
- OpenSourceLibrary
- configurable widget
- Algorithm
- Protocol
- CloneCoding
- projectsetting
- MVVM
- UserDefaults
- 2022 KAKAO TECH INTERNSHIP
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Total
- Today
- Yesterday