티스토리 뷰

이번 포스트는 

https://world-of-larooly.tistory.com/13

 

AppStore에 올라간 앱 정보(json) 보기

최근 앱을 App Store 에 올리느라 정신이 없었는데 막상 올리고 나서 보니 AppStore 에 올린 앱 정보를 가져올 일이 생겼습니다. 그래서 인터넷을 많이 찾아봤는데 보통 http://itunes.apple.com/lookup?bundleId=

world-of-larooly.tistory.com

위 포스트의 연장선에 있음을 알려드립니다. 

 

물론 필수로 보셔야하는 건 아니고 어디까지나 참고 사항입니다. 

 

만약 따라하시는데 잘안된다 하시는 분들은 위 포스트를 참고로 봐주시면 되겠습니다.

 

하시기 전에 알아두셔야하는게 있습니다.

 

해당 방법은 https://itunes.apple.com에서 정보를 가져와 비교하는 방식인데

실제 업데이트를 하는 경우 바로 정보가 바뀌는 것이 아니라 24시간 정도 걸릴수 있다고 합니다. 

-> 즉 실제로 이 코드를 써서 업데이트를 하게 하면 실제 업데이트를 앱스토어에 올려도 이방법을 사용하면 

사용자가 앱스토어에 직접가서 보는게 아닌이상 저정도 시간이 지난 후에야 업데이트 알림을 받을수있다는 의미입니다. 

 

그럼 일단 준비부터 해볼까요?

 

AppStore 에 앱을 올리기 위해 준비하셨다면 

AppStore Connect 에 들어가셔서 앱정보를 볼수있는데  

Apple ID와 번들 ID 이 둘을 알아두시는게 좋습니다. 

 

AppleID 는 업데이트 링크를 위해

번들ID 는 앱 스토어에서 정보를 가져오는데 필요합니다.

 

참고로 업데이트까지 만드실 분들은 Info.plist 에 아래와 같이 추가해주시길 바랍니다. 

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에 제출했더니 리젝당했습니다......

앱 업데이트를 선택하지 않고도 기존 앱을 사용할 수 있게 해야한다고 하더라고요.

다른 분들도 이 점 참고하시는게 좋을 것 같습니다.

댓글