公司刚开始立项一个项目时候,往往项目方向变化比较大,所以项目框架也会经常变更。所以也就存在App的版本控制以及强制更新这个需求了。
自从苹果从15年开始禁止在App中出现“版本检查”以及“版本更新”这个功能后,App的更新就交给苹果来做了。具体资料可以参考我之前的博客
苹果新政,禁止开发者在App中加入检查更新功能
现在好多人会打开App自动更新,但是也有人因为网络或者内存不够而关闭这个功能,那么提醒用户更新这个操作就需要我们来做了。同时还有一个问题就是如果线上版本有重大Bug或者App已经完全改版了。这时候旧版本App不再能够使用,就需要用户强制更新了。
废话不说,先上个代码 Git地址
主要功能就是提醒用户更新以及强制更新,具体效果图见Git
![强制更新](http:https://img.haomeiwen.com/i525360/5632c3e34e074abb.png?
imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
核心思想就是在系统后台配置一个白名单,每次打开App都会请求这个白名单,如果当前App版本号不在这个白名单里面就提示用户强制更新。如果存在就对比Appstore的版本号然后决定要不要提示用户升级。
所以代码不存在什么难度。我在每个项目中都会创建很多管理类,所以这个检测放在了AppManager类里面了。具体的细节看代码吧,写的有注释。
强制更新机制:
如果当前版本不再支持,需要强制更新,就会把window的rootViewcontroller设置一个单独的ViewController,里面显示一张启动图~然后弹出提示框。
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationController.navigationBar.hidden = YES;
UIImageView *imageV = [[UIImageView alloc] initWithFrame:self.view.bounds];
imageV.image = [UIImage imageNamed:@"Launch"];
[self.view addSubview:imageV];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(popUpAlert)
name:UIApplicationWillEnterForegroundNotification
object:nil];
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[self popUpAlert];
}
- (void)popUpAlert {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"提示" message:@"发现需要升级的版本,现在去更新?" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
[alertView show];
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
[self gotoUpdate:nil];
}
- (void)gotoUpdate:(id)sender {
///当然这里的url也可以写死,我是从上个界面传递过来的
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:self.urlStr]];
}
这样用户就算点击了提示框,如果他不更新再次返回App还是会继续提示更新的。
Feature:
现在这个版本存在漏洞,如果用户打开App不联网,等待那个白名单接口超时后再次进入就可以越过强制更新机制了。
不过可以监听网络变化,变更后再次请求就好了。但是只能检测是否强制更新,如果只是单纯的版本更新不要弹出版本更新提示啦。要不很烦人的。
也还可以对后台白名单进行扩展,只有比较重要的版本更新才去提示用户。
这里只提供一个思路~大家自行扩展吧。
代码质量有点渣~大家见谅
网友评论