关于 iOS App 版本控制以及强制更新

8,835 阅读3分钟
原文链接: www.jianshu.com

公司刚开始立项一个项目时候,往往项目方向变化比较大,所以项目框架也会经常变更。所以也就存在App的版本控制以及强制更新这个需求了。

自从苹果从15年开始禁止在App中出现“版本检查”以及“版本更新”这个功能后,App的更新就交给苹果来做了。具体资料可以参考我之前的博客
苹果新政,禁止开发者在App中加入检查更新功能

现在好多人会打开App自动更新,但是也有人因为网络或者内存不够而关闭这个功能,那么提醒用户更新这个操作就需要我们来做了。同时还有一个问题就是如果线上版本有重大Bug或者App已经完全改版了。这时候旧版本App不再能够使用,就需要用户强制更新了。

废话不说,先上个代码 Git地址

主要功能就是提醒用户更新以及强制更新,具体效果图见Git


提示更新


强制更新

核心思想就是在系统后台配置一个白名单,每次打开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不联网,等待那个白名单接口超时后再次进入就可以越过强制更新机制了。
不过可以监听网络变化,变更后再次请求就好了。但是只能检测是否强制更新,如果只是单纯的版本更新不要弹出版本更新提示啦。要不很烦人的。
也还可以对后台白名单进行扩展,只有比较重要的版本更新才去提示用户。
这里只提供一个思路~大家自行扩展吧。

代码质量有点渣~大家见谅