iOS
想要检查App
当前版本是否为最新,一般的方案大概都是服务器自己提供一个接口来获取App
最新版本是多少,然后再做出相应提示是否需要更新,但是接口需要手动维护,应用要审核,还得等审核通过以后才能更新版本号,其实苹果提供了一个iTunes
接口,能够查到App
在AppStore
上的状态信息,既省事又准确,下面记录一下具体实现方法
返回的数据结构:
{
"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: "检查更新失败!")
}
}
版本字符串的比较方法
//版本号比较
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
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。