注意: 蘋果審核時(shí)是不允許app內(nèi)有任何提示版本更新的內(nèi)容, 否則拒絕上架
App由于增加新功能, 優(yōu)化體驗(yàn), 修復(fù)bug等情況需要不斷更新版本, 為了給用戶提供最好的體驗(yàn), 往往希望新版本上架后所有的用戶都可以最快的速度體驗(yàn)到最新的版本, 這就與蘋果禁止App內(nèi)提示版本更新的規(guī)定相沖突, 但是以下方法可以避過(guò)蘋果的審核, 從而達(dá)到版本更新提示, 并引導(dǎo)到App Store更新.
原理: 在App啟動(dòng)的時(shí)候比較App Store中版本的版本號(hào)與本地App的版本號(hào)的大小, 如果App Store中的版本號(hào)大于本地App版本號(hào), 提示版本更新, 否則不提示版本更新; 由于開(kāi)發(fā)完一個(gè)新版本, 會(huì)修改一個(gè)版本號(hào), 提交蘋果審核的時(shí)候, 版本號(hào)一定是大于App Store中的版本號(hào)的, 所以蘋果的審核人員在審核時(shí)是不會(huì)看到版本更新提示的, 而一旦上架成功, 由于App Store中最新的版本號(hào)大于用戶已安裝的版本的版本號(hào), 自然就看得到版本更新提示, 用戶可以直接點(diǎn)擊立即更新, 然后直接跳轉(zhuǎn)到App Store中此App的詳情頁(yè)面, 點(diǎn)擊更新就ok了.
關(guān)于版本號(hào): 關(guān)于版本號(hào)的設(shè)置, 感覺(jué)跟公司和程序員本身的習(xí)慣有很大關(guān)系, 如果領(lǐng)導(dǎo)管這個(gè), 就是什么時(shí)候上什么版本, 領(lǐng)導(dǎo)都設(shè)計(jì)好了, 那你只需要聽(tīng)領(lǐng)導(dǎo)的就好了, 下面我只說(shuō)一般情況: 都是在原來(lái)的基礎(chǔ)上直接增加 1, 不過(guò)分具體情況, 一般如果只是普通的bug修復(fù)或者性能優(yōu)化, 則是小版本號(hào)更新, 例如: 前一個(gè)版本是 1.3.1, 則新版本是 1.3.2; 而如果是增加新功能,UI有重大改變(重構(gòu)), 修復(fù)重大bug等情況, 一般都是增加大版本, 例如: 前一個(gè)版本是 1.3.1, 則新版本可能是 1.4 或者 2.0 .
代碼
注1: 可以單獨(dú)將其抽離成一個(gè)工具類, 這樣其他項(xiàng)目需要的時(shí)候, 只需要將這個(gè)類直接copy過(guò)去, 然后在需要的地方直接使用: AppVersionManager.shareManager.checkAppStoreVersion(), 就可以實(shí)現(xiàn)版本更新提示了, 其余什么都不需要做, 但是如果你對(duì)提示文本有自己的想法, 你就需要自己設(shè)置了)
注2: 下面代碼中的"https://itunes.apple.com/cn/lookup?id=app對(duì)應(yīng)的id"是獲取app上架版本的信息的路徑, "id="中=號(hào)后面則需要填寫對(duì)應(yīng)app的id, 那么如何知道這個(gè)id呢? 請(qǐng)看下圖:
/// 檢查APP版本信息
func checkAppStoreVersion() {
// 路徑
let checkUrlString = "https://itunes.apple.com/cn/lookup?id=app對(duì)應(yīng)的id"
let checkUrl = URL(string: checkUrlString)
var request = URLRequest(url: checkUrl!, cachePolicy: .reloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 15.0)
request.httpMethod = "POST"
URLSession.shared.dataTask(with: request, completionHandler: { [weak self] (data, urlResponse, error) in
if error == nil && data != nil {
do {
let appInfo = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
if appInfo != nil {
let resultAry = appInfo!["results"] as! NSArray
let resultDic = resultAry.firstObject as! NSDictionary
// 版本號(hào)
self?.version = resultDic["version"] as? String
// 應(yīng)用名稱
let appName = resultDic["trackName"] as! String
// 下載地址
self?.trackViewUrlString = resultDic["trackViewUrl"] as? String
if self?.hasNew() == true {
self?.remindUpdateVersion()
}
}
} catch let error as NSError {
print(error)
}
}
})
}
判斷是否存在新版本
fileprivate func hasNew() -> Bool {
if version == nil {
return false
}
// 獲取當(dāng)前版本號(hào)
let infoDic = Bundle.main.infoDictionary
let appVersion = infoDic!["CFBundleShortVersionString"] as! String
/// NSComparisonResult: 升序:OrderedAscending, 降序:OrderedDescending, 相等:OrderedSame
if appVersion.compare(version!, options: .numeric) == .orderedAscending {
// 發(fā)現(xiàn)新版本
return true
} else {
// 未發(fā)現(xiàn)新版本
return false
}
}
如果存在新版本, 彈出提示
/// 提示有新版本
fileprivate func remindUpdateVersion() {
let alertController = UIAlertController.init(title: "版本更新", message: "新版本" + "(v\(version!))" + "已經(jīng)上線了,等你來(lái)體驗(yàn)哦~", preferredStyle: UIAlertControllerStyle.alert)
let alertActionDone = UIAlertAction.init(title: "立即更新", style: UIAlertActionStyle.default) { [weak self] (action) in
let appStoreUrl = URL(string: self?.trackViewUrlString ?? "")
if UIApplication.shared.canOpenURL(appStoreUrl!) {
UIApplication.shared.openURL(appStoreUrl!)
}
}
if alertActionDone.value(forKey: "titleTextColor") == nil {
alertActionDone.setValue(UIColor.red, forKey: "titleTextColor")
}
let alertActionCancle = UIAlertAction.init(title: "以后再說(shuō)", style: .cancel) { (action) in
alertController.dismiss(animated: true, completion: nil)
}
alertController.addAction(alertActionDone)
alertController.addAction(alertActionCancle)
DispatchQueue.main.async {
let appdelegate = UIApplication.shared.delegate as! AppDelegate
appdelegate.window?.rootViewController?.present(alertController, animated: true, completion: nil)
}
}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者