티스토리 뷰
이번 포스트는
https://world-of-larooly.tistory.com/13
위 포스트의 연장선에 있음을 알려드립니다.
물론 필수로 보셔야하는 건 아니고 어디까지나 참고 사항입니다.
만약 따라하시는데 잘안된다 하시는 분들은 위 포스트를 참고로 봐주시면 되겠습니다.
하시기 전에 알아두셔야하는게 있습니다.
해당 방법은 https://itunes.apple.com에서 정보를 가져와 비교하는 방식인데
실제 업데이트를 하는 경우 바로 정보가 바뀌는 것이 아니라 24시간 정도 걸릴수 있다고 합니다.
-> 즉 실제로 이 코드를 써서 업데이트를 하게 하면 실제 업데이트를 앱스토어에 올려도 이방법을 사용하면
사용자가 앱스토어에 직접가서 보는게 아닌이상 저정도 시간이 지난 후에야 업데이트 알림을 받을수있다는 의미입니다.
그럼 일단 준비부터 해볼까요?
AppStore 에 앱을 올리기 위해 준비하셨다면
AppStore Connect 에 들어가셔서 앱정보를 볼수있는데
Apple ID와 번들 ID 이 둘을 알아두시는게 좋습니다.
AppleID 는 업데이트 링크를 위해
번들ID 는 앱 스토어에서 정보를 가져오는데 필요합니다.
참고로 업데이트까지 만드실 분들은 Info.plist 에 아래와 같이 추가해주시길 바랍니다.
특정 버전 이상부터 저게 필요하다고 하더라고요;;;;
(원래 이름이 LSApplicationQueriesSchemes 였던것같은데 표기가 저렇게 바뀌었나봐요- xcode14)
그럼 시작하겠습니다.
먼저 앱스토어 올라간 버전을 가져오는 함수입니다.
func getAppStoreVersion() -> String?{
let appLink = "https://itunes.apple.com/kr/lookup?bundleId=번들ID"
let url = URL(string: appLink)!
let data = try? Data(contentsOf: url)
if(data == nil){return nil}
let json = try? JSONSerialization.jsonObject(with: data!) as? [String : Any]
let results = json?["results"] as? [[String: Any]]
if(results?.count ?? -1 > 0){
return results![0]["version"] as? String
}
return nil
}// 결과가 nil -> 인터넷 연결 문제
해당 "번들ID"라고 적힌 곳에 본인 앱의 BundleID 를 넣어주시면 됩니다.
[2022.10.28 수정]
가끔 BundleID로 했을 때 값이 안나오는 현상이 있다고 합니다.
아래 방법으로 하시는걸 추천 드립니다.
let appLink = "https://itunes.apple.com/kr/lookup?id=AppleID"
다만 해당 함수를 보시면 알듯이
인터넷 연결이 안되면 앱스토어와 연결이 안되서 앱정보를 가져올수 없습니다.
또한 만약 그래도 안들어오시는 분들은 해당 링크에서 "/kr"를 빼고 해보시길 바랍니다.
다음은 현재 우리 실제 기기에 설치된 앱버전을 가져오는 함수입니다.
func getAppVersion() -> String {
return Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "1.0"
}
굉장히 간단하죠?
우린 이제 이 두개를 비교해서 업데이트를 할지 말지 결정하면 됩니다.
만약 사용자가 업데이트를 한다고 하면 그때 앱스토어 링크를 연결해주면 되겠죠?
그럼 저 두 함수를 이용해 비교함수를 만들어 봅시다. (아까와 동일하게 인터넷이 안되면 nil로 결과가 나오게 됩니다.)
func isNeedUpdate()-> Bool?{
let appStoreVersion = getAppStoreVersion()
let appVersion = getAppVersion()
if(appStoreVersion == nil){return nil}
if(appStoreVersion == appVersion){
return false
}else{
return true
}
}
여기까지가 앱을 비교하는 부분이었습니다.
이제 업데이트 부분으로 넘어가 봅시다.
앱에서 앱스토어에 올라간 앱으로 링크를 넘겨주면 되겠죠?
아까 위에서 언급했듯이 이번엔 Apple ID 가 필요합니다.
func goUpdate(){
let url = "itms-apps://itunes.apple.com/app/" + "AppleID";
if let url = URL(string: url), UIApplication.shared.canOpenURL(url) {
if #available(iOS 10.0, *) {
UIApplication.shared.open(url, options: [:], completionHandler: nil)
} else {
UIApplication.shared.openURL(url)
}
}
}
"AppleID"라고 적힌 부분에 본인의 앱 아이디를 넣어주면 됩니다.
그리고 저는 만약 사용자가 앱스토어로 이동하면 기존앱은 종료되게 만들고 싶었기때문에
현재 앱을 끄는 함수를 추가했습니다.
앱종료는 선택사항이기 때문에 원하시는 분들은 참고하시기 바랍니다.
func closeApp(){//앱 종료 함수
UIApplication.shared.perform(#selector(NSXPCConnection.suspend))
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
exit(0)
}
}
자 이제 필요한 함수는 다 만들었으니 힘내서 합치면 끝입니다.
func checkUpdate(){
DispatchQueue.global().async {
if(isNeedUpdate() == nil){//인터넷 연결 안됨->종료
DispatchQueue.main.async {
let alert = UIAlertController(title: "알림", message: "인터넷 연결을 확인해주세요.", preferredStyle: UIAlertController.Style.alert)
let okAction = UIAlertAction(title: "확인", style: .default, handler: {_ in
self.closeApp()// 앱 종료
})
alert.addAction(okAction)
self.present(alert, animated: true, completion: nil)
}
}else if(isNeedUpdate()!){//업데이트 선택 발동
DispatchQueue.main.async {
let alert = UIAlertController(title: "알림", message: "최신버전으로 업데이트가 가능합니다.\n지금 업데이트하시겠습니까?", preferredStyle: UIAlertController.Style.alert)
let okAction = UIAlertAction(title: "확인", style: .default, handler: {_ in
self.goUpdate()//업데이트 이동
self.closeApp()// 앱 종료
})
alert.addAction(okAction)
let cancel = UIAlertAction(title: "취소", style: .cancel)
alert.addAction(cancel)
alert.preferredAction = okAction
self.present(alert, animated: true, completion: nil)
}
}
}
}
저같은 경우에는 이런 식으로 합쳐서 사용중입니다. (DispatchQueue 를 안하니 보라색 에러가 뜨더라고요;;)
개인적으로 좀더 다듬어서 사용하시는 걸 추천드립니다.
여러분들 앱에 알맞는 형태로 바꾸어 사용해보세요.
제가 처음에 업데이트 부분을 만들때는 복잡하다고 생각했는데
함수를 하나하나 따로 나누어 생각하니 비교적 쉽긴 하네요.
제가 한 방법 말고도 다른 방법도 많으니 본인에게 맞는 방법으로 하시는 걸 찾아 해보시는걸 추천드려요.
내용이 도움이 되셨으면 좋겠네요.
오늘도 파이팅입니다.
#여담
원래는 버전이 다르면 강제적으로 업데이트를 하게 하려 했는데
그런 식으로 만들어 AppStore에 제출했더니 리젝당했습니다......
앱 업데이트를 선택하지 않고도 기존 앱을 사용할 수 있게 해야한다고 하더라고요.
다른 분들도 이 점 참고하시는게 좋을 것 같습니다.
'iOS개발 > Swift 기능' 카테고리의 다른 글
Swift 달력(FSCalendar) 만들기 (0) | 2022.12.07 |
---|---|
Swift DropDown 메뉴 만들기 (0) | 2022.12.05 |
Swift Lottie 로 움직이는 사진 넣기 (0) | 2022.12.01 |
Swift Charts 를 이용해 그래프 그리기 (0) | 2022.11.03 |
Swift CoreMotion 걷기 데이터 가져오기 (걸음수) (0) | 2022.09.30 |