App版本更新(版本检测 & 引导更新)
2018-01-26 本文已影响785人
华子的学习之路
注意: 苹果审核时是不允许app内有任何提示版本更新的内容, 否则拒绝上架
App由于增加新功能, 优化体验, 修复bug等情况需要不断更新版本, 为了给用户提供最好的体验, 往往希望新版本上架后所有的用户都可以最快的速度体验到最新的版本, 这就与苹果禁止App内提示版本更新的规定相冲突, 但是以下方法可以避过苹果的审核, 从而达到版本更新提示, 并引导到App Store更新.
原理: 在App启动的时候比较App Store中版本的版本号与本地App的版本号的大小, 如果App Store中的版本号大于本地App版本号, 提示版本更新, 否则不提示版本更新; 由于开发完一个新版本, 会修改一个版本号, 提交苹果审核的时候, 版本号一定是大于App Store中的版本号的, 所以苹果的审核人员在审核时是不会看到版本更新提示的, 而一旦上架成功, 由于App Store中最新的版本号大于用户已安装的版本的版本号, 自然就看得到版本更新提示, 用户可以直接点击立即更新, 然后直接跳转到App Store中此App的详情页面, 点击更新就ok了.
关于版本号: 关于版本号的设置, 感觉跟公司和程序员本身的习惯有很大关系, 如果领导管这个, 就是什么时候上什么版本, 领导都设计好了, 那你只需要听领导的就好了, 下面我只说一般情况: 都是在原来的基础上直接增加 1, 不过分具体情况, 一般如果只是普通的bug修复或者性能优化, 则是小版本号更新, 例如: 前一个版本是 1.3.1, 则新版本是 1.3.2; 而如果是增加新功能,UI有重大改变(重构), 修复重大bug等情况, 一般都是增加大版本, 例如: 前一个版本是 1.3.1, 则新版本可能是 1.4 或者 2.0 .
代码
注1: 可以单独将其抽离成一个工具类, 这样其他项目需要的时候, 只需要将这个类直接copy过去, 然后在需要的地方直接使用: AppVersionManager.shareManager.checkAppStoreVersion(), 就可以实现版本更新提示了, 其余什么都不需要做, 但是如果你对提示文本有自己的想法, 你就需要自己设置了)
注2: 下面代码中的"https://itunes.apple.com/cn/lookup?id=app对应的id"是获取app上架版本的信息的路径, "id="中=号后面则需要填写对应app的id, 那么如何知道这个id呢? 请看下图:
Apple ID.png/// 检查APP版本信息
func checkAppStoreVersion() {
// 路径
let checkUrlString = "https://itunes.apple.com/cn/lookup?id=app对应的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
// 版本号
self?.version = resultDic["version"] as? String
// 应用名称
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
}
// 获取当前版本号
let infoDic = Bundle.main.infoDictionary
let appVersion = infoDic!["CFBundleShortVersionString"] as! String
/// NSComparisonResult: 升序:OrderedAscending, 降序:OrderedDescending, 相等:OrderedSame
if appVersion.compare(version!, options: .numeric) == .orderedAscending {
// 发现新版本
return true
} else {
// 未发现新版本
return false
}
}
如果存在新版本, 弹出提示
/// 提示有新版本
fileprivate func remindUpdateVersion() {
let alertController = UIAlertController.init(title: "版本更新", message: "新版本" + "(v\(version!))" + "已经上线了,等你来体验哦~", 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: "以后再说", 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)
}
}