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
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

猜你喜欢

转载自blog.csdn.net/LeeCSDN77/article/details/83177476