1. 程式人生 > >Swift 檢查版本更新 itunes

Swift 檢查版本更新 itunes

 

iOS 想要檢查 App 當前版本是否為最新,一般的方案大概都是伺服器自己提供一個介面來獲取 App 最新版本是多少,然後再做出相應提示是否需要更新,但是介面需要手動維護,應用要稽核,還得等稽核通過以後才能更新版本號,其實蘋果提供了一個 iTunes 介面,能夠查到 AppAppStore 上的狀態資訊,既省事又準確,下面記錄一下具體實現方法

返回的資料結構:

{
    "resultCount":1,
    "results":[
        {
            "screenshotUrls":Array[5],
            "ipadScreenshotUrls":Array[0],
            "appletvScreenshotUrls":Array[0],
            "artworkUrl60":"XXXXX",
            "artworkUrl512":"XXXXX",
            "artworkUrl100":"XXXXX",
            "artistViewUrl":"XXXXX",
            "supportedDevices":Array[49],
            "isGameCenterEnabled":false,
            "kind":"software",
            "features":Array[0],
            "advisories":Array[0],
            "trackCensoredName":"XXXXX",
            "languageCodesISO2A":Array[1],
            "fileSizeBytes":"XXXXX",
            "contentAdvisoryRating":"4+",
            "trackViewUrl":"XXXXX",     //下載地址
            "trackContentRating":"4+",
            "releaseNotes":"1.XXXXX。
2.XXXXX!
3.XXXXX!",
            "isVppDeviceBasedLicensingEnabled":true,
            "primaryGenreId":XXXXX,
            "genreIds":Array[2],
            "trackId":XXXXX,
            "trackName":"XXXXX",
            "sellerName":"XXXXX",
            "primaryGenreName":"XXXXX",
            "currency":"CNY",
            "wrapperType":"software",
            "version":"2.5.1",          //線上版本號
            "description":"XXXXX",
            "artistId":"XXXXX",
            "artistName":"XXXXX",
            "genres":Array[2],
            "price":0,
            "bundleId":"XXXXX",
            "releaseDate":"XXXXX",
            "minimumOsVersion":"XXXXX",
            "currentVersionReleaseDate":"2018-09-12T10:33:48Z",
            "formattedPrice":"免費"
        }
    ]
}

        //本地版本資訊
        let infoDict:Dictionary = Bundle.main.infoDictionary!
        let app_Version:String = infoDict["CFBundleShortVersionString"] as! String
        let url = URL(string: "http://itunes.apple.com/cn/lookup?id=XXX")

        SVProgressHUD.show()
        NetworkTools.shared._manger.request(url!, method: .post, parameters: nil, encoding: JSONEncoding.default, headers: nil).validate().responseJSON { [weak self](response) in
            guard let strongSelf = self else { return }
            switch(response.result) {
            case .success(let value):
                SVProgressHUD.dismiss()
                print(value)
                guard let resultDict = value as? [String : Any], resultDict.keys.count > 0 else {
                    print("無資料:\(value)")
                    return
                }
                
                let tempArr = resultDict["results"] as? [[String: Any]]
                if let resultsArr = tempArr {
                    if resultsArr.count < 1 {
                        print("此APPID為未上架的APP或者查詢不到")
                        return
                    }
                    let itunesVersion = resultsArr.first!["version"] as! String
                    //trackViewUrl 為更新地址
                    let trackViewUrl = resultsArr.first!["trackViewUrl"] as! String
                    if strongSelf.compareVersion(str1: app_Version, str2: itunesVersion) {
                        
                        var alertController = UIAlertController()
                        alertController = UIAlertController(title: "版本更新", message: "請下載最新版App否則無法使用!", preferredStyle: .alert)
                        let certainAction = UIAlertAction(title: "確定", style: .default) { (action) in
                            let url = URL(string: trackViewUrl)
                            UIApplication.shared.openURL(url!)
                        }
                        alertController.addAction(certainAction)
                        strongSelf.present(alertController, animated: true, completion: nil)
                    }else {
                        var alertController = UIAlertController()
                        alertController = UIAlertController(title: "版本更新", message: "已是最新版本!", preferredStyle: .alert)
                        let cancelAction = UIAlertAction(title: "確定", style: .cancel, handler: nil)
                        alertController.addAction(cancelAction)
                        strongSelf.present(alertController, animated: true, completion: nil)
                    }
                }
            case .failure(_):
                SVProgressHUD.dismiss()
                SVProgressHUD.showError(withStatus: "檢查更新失敗!")
            }
        }

版本字串的比較方法

iOS 優雅的比較版本號

//版本號比較
    private func compareVersion(str1: String, str2: String) -> Bool {
        let compareResult = str1.compare(str2, options: .numeric, range: nil, locale: nil)
        return (compareResult == .orderedAscending)
    }

也可以寫成擴充套件

extension String
{
    func ck_compare(with version: String) -> ComparisonResult {
        return compare(version, options: .numeric, range: nil, locale: nil)
    }
    
    func isNewer(than aVersionString: String) -> Bool {
        return ck_compare(with: aVersionString) == .orderedDescending
    }
    
    func isOlder(than aVersionString: String) -> Bool {
        return ck_compare(with: aVersionString) == .orderedAscending
    }
    
    func isSame(to aVersionString: String) -> Bool {
        return ck_compare(with: aVersionString) == .orderedSame
    }
}

作者:Cocody
連結:https://www.jianshu.com/p/22d37844df2d
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。