안녕하세요. 개발하는 정주입니다.
오늘은 앱스토어(App Store)에서 앱 버전 가져오기에 대해 포스팅하려고 합니다.
필요한 이유
많은 앱에서 버전 체크 기능을 구현합니다. 이때 필요한 정보가 현재 앱 버전과 앱 스토어의 앱 최신 버전입니다.
둘이 다르면 업데이트를 권장하는 등의 안내를 할 수 있는 것입니다.
앱 스토어에서 최신 버전 가져오는 방법
앱스토어에 올라가 있는 앱의 최신 버전을 읽어오는 방법에 대해 알아보겠습니다.
Bundle ID와 Apple ID
앱 스토어에 앱 정보를 요청하기 위해서는 앱의 Bundle ID 혹은 Apple ID가 필요합니다.
두 개의 ID는 App Store Connect - 앱 정보에서 볼 수 있습니다.
Bundle ID가 번들 ID이고 Apple ID가 Apple ID입니다. Apple ID는 숫자로만 이루어져 있습니다.
코드
func loadAppStoreVersion() -> String {
let bundleID = "앱의 Bundle ID"
let appStoreUrl = "http://itunes.apple.com/lookup?bundleId=\(bundleID)"
guard let url = URL(string: appStoreUrl),
let data = try? Data(contentsOf: url),
let json = try? JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String: Any],
let results = json["results"] as? [[String: Any]] else {
return ""
}
guard let appStoreVersion = results[0]["version"] as? String else {
return ""
}
return appStoreVersion
}
위 코드에서 results를 출력해보면 bundle ID에 해당하는 앱의 자세한 정보가 나옵니다.
이 내용에는 지원 OS, 버전, 지원 언어 등이 포함됩니다. 저희는 버전 정보인 version을 파싱 해서 사용을 하면 되는 것입니다.
버전을 읽어오지 못할 때
위 기능을 테스트했을 때 두 가지 버그가 발생했습니다.
- 앱의 정보를 가져오지 못한다.
- 이전 버전의 정보가 나온다.
두 가지 경우에 대해 해결 방법을 살펴보도록 합시다.
앱의 정보를 가져오지 못할 때 - 1
앱의 정보를 가져오지 못할 때는 url을 변경해보는 방법이 있습니다.
대한민국으로 올린 앱의 경우 kr 서버에만 등록되었다면 위 코드의 url로 나오지 않는 케이스가 있다고 합니다.
let appStoreUrl = "http://itunes.apple.com/kr/lookup?bundleId=\(bundleID)"
따라서 앱의 url에 kr을 추가해주면 됩니다.
앱의 정보를 가져오지 못할 때 - 2
url을 수정해도 앱의 정보가 나오지 않을 때는 Bundle ID 대신 Apple ID로 url을 수정해 보세요.
let appStoreUrl = "http://itunes.apple.com/lookup?id=\(appleID)"
이전 버전이 나올 때
앱의 버전은 나오는데 최신 버전이 나오지 않고 이전 버전이 나올 때가 있습니다.
앱 스토어에 앱이 올라가더라도 서버 동기화에는 약간의 시간이 소요될 수 있습니다.
따라서 이 문제는 시간이 해결해줍니다. 저의 경우에는 2~3시간 정도가 소요된 것 같습니다.
일단 url을 요청했을 때 response가 제대로 온다면 마음 놓고 기다리시면 될 것 같네요.
버전 체크 팁
앱 스토어에서 버전을 읽는 방법은 동기화가 느리고 가끔 버전이 안 나오는 문제가 있을 수 있습니다.
그렇기 때문에 서버를 사용하는 앱은 위 방법을 사용하지 않고 자체 서버에 버전을 등록해서 사용하는 경우가 많다고 합니다.
저는 서버를 쓰지 않았기 때문에 선택지가 없었지만 서버를 사용하는 앱을 만들 경우 해당 방법도 검토해보시는 것이 좋아 보입니다.
참조
https://developer.apple.com/forums/thread/97122
아직은 초보 개발자입니다.
더 효율적인 코드 훈수 환영합니다!
공감과 댓글 부탁드립니다.