Lined Notebook

swift 앱 스토어에서 앱 버전 가져오기

by 사슴비행기

앱스토어에서 뭔가 필요한 작업을 할 때는

import StoreKit

StoreKit 라이브러리를 추가해야 한다. 이 라이브러리는 애플에서 지원되는 것이라서 따로 cocoaPod로 추가하는 작업이 필요 없다.

 

그리고 앱 버전을 가져오기 위한 선 작업으로 클래스에 해당 클래스를 상속시켜준다.

SKStoreProductViewControllerDelegate

그리고 SKStoreProductViewController를 사용하기 위해서 객체를 만들어준다.

let storeMove = SKStoreProductViewController()

그 다음 viewDidLoad에서 SKStoreKit의 delegate를 위임하는 코드를 넣어준다.

storeMove.delegate = self

 

나는 현재버전과 최신버전을 비교하기 위해서 이 작업을 하는 것이라서 현재버전을 가져오는 코드를 추가시켜준다.

        versionString = (Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! NSString) as String
        if versionString == nil {
            versionString = "정보를 찾을 수 없습니다."
            self.lblNowVersion.text = "현재버전 \(versionString)"
        } else{
            self.lblNowVersion.text = "현재버전 \(versionString)"
        }

 

그 다음, 앱스토어에서 최신버전을 가져오는 코드를 추가한다.

파싱을 하는 이유는 아래에 url을 인터넷 주소창에 쳐보면 JSON 파일이 다운로드 되는데,

그 중에서 최신 version에 해당하는 부분만 가져오기 위해서 이다.

그리고 이 때 url의 끝 부분에서 ?id=393499958 이 부분의 숫자는 앱 고유의 번들 아이디이다.

만약 다른 앱의 정보를 가져오려면 이 번들 아이디 부분만 수정하면 된다.

//TEST - 네이버 최신버전 가져오기
        let url = "https://itunes.apple.com/lookup?id=393499958"
        let apiURI : URL! = URL(string: url)
        let apidata = try! Data(contentsOf: apiURI)
        
        do{
            let apiDict =
                try JSONSerialization.jsonObject(with: apidata, options: []) as! NSDictionary
            let results = apiDict["results"] as! NSArray
            for row in results{
                let imsi = row as! NSDictionary
                resultVersion = (imsi["version"] as? String)!
            }
            self.versionView.reloadInputViews()
        }catch{
            print("파싱 예외 발생")
        }
        self.lblNewVersion.text = "(최신버전 \(resultVersion))"

그리고 현재버전과 최신버전을 비교하여 현재버전과 최신버전이 같을 때는 버튼(이전에 만들어 두었다.)을 비활성화 하고

현재버전이 최신버전 보다 낮다면 버튼을 활성화 한다.

        //버전 비교를 위해 .를 기준으로 split
        var splitNowVersion = versionString.components(separatedBy: ".")
        var splitNewVersion = resultVersion.components(separatedBy: ".")
        
        //버전 비교를 위해 배열 크기 동일하게 맞춤
        if splitNowVersion.count != splitNewVersion.count {
            if splitNowVersion.count < splitNewVersion.count {
                let imsi = splitNewVersion.count - splitNowVersion.count
                for _ in 0...(imsi - 1)  {
                    splitNowVersion.append("0")
                }
                print(splitNowVersion.description)
            } else {
                let imsi = splitNowVersion.count - splitNewVersion.count
                for _ in 0...imsi  {
                    splitNewVersion.append("0")
                }
                print(splitNewVersion.description)
            }
        }
        
        //현재버전이 최신버전을 비교해서 버튼 변경(활성/비활성)
        if splitNewVersion.count < 0 {
        for i in 0...(splitNewVersion.count - 1){
            if splitNowVersion[i] > splitNewVersion[i] {
                //현재버전이 더 높을 수 없음.
            } else if splitNowVersion[i] == splitNewVersion[i] {
                //현재버전과 최신버전이 같은 경우
                self.designBtnUpdate.setTitleColor(#colorLiteral(red: 0.7764705882, green: 0.7764705882, blue: 0.7764705882, alpha: 1), for: .normal)
                designBtnUpdate.isEnabled = false
            } else {
                //최신버전이 더 높은 경우
                self.designBtnUpdate.setTitleColor(#colorLiteral(red: 0.1333333333, green: 0.1333333333, blue: 0.1333333333, alpha: 1), for: .normal)
                designBtnUpdate.isEnabled = true
                break
            }
        }
        } else {
            designBtnUpdate.isEnabled = false
        }

만약 버튼이 활성화가 되었다면, 버튼을 클릭했을 때 앱스토어의 어플 업데이트하는 화면으로 이동하는 코드를 작성한다.

이때 parameters에서 넣는 숫자는 앱 고유의 번들 아이디이다.

다른 앱을 업데이트하는 화면으로 가려면 번들 아이디 부분을 수정한다.

참고로 이렇게 이동하면 in-app에서 띄워지는데, 아얘 app store 어플을 열어서 보여주려면 다른 방법을 써야 한다.

다른 방법 : https://doorganizedcoding.tistory.com/8

    //업데이트 버튼 이벤트//
    @IBAction func btnUpdate(_ sender: Any) {
        
        if #available(iOS 11.0, *) {
            let parameters = [SKStoreProductParameterITunesItemIdentifier:"393499958"]
            storeMove.loadProduct(withParameters: parameters, completionBlock: nil)
        } else {
            // Fallback on earlier versions
        }
        
        self.present(storeMove, animated: true)
    }

그리고 앱스토어로 이동했을 때 닫기 버튼을 눌렀을 때 이전 화면으로 돌아가게 하려면 아래 코드를 추가해야 한다.

    func productViewControllerDidFinish(_ viewController: SKStoreProductViewController) {
        storeMove.dismiss(animated: true)
    }

두번 연속으로 버튼을 클릭 했을 때, 두번째에서 화면이 조금 이상하게 띄워지는 오류를 발견했다.

어떻게 해결해야하는지는 아직 못 찾았다.

'swift > code trim' 카테고리의 다른 글

Swift storyboard 객체 만들기 and 뷰 객체 만들기  (0) 2019.06.27
swift 변수 타입 확인하는 방법  (0) 2019.06.26
Swift @escaping 을 써보자  (0) 2019.06.25
Swift AppStore 띄우기  (0) 2019.06.25
Scroll view (작성중)  (0) 2019.05.26

블로그의 정보

Beautiful Coding

사슴비행기

활동하기