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
사슴비행기