美文网首页集思广益iOS开发移动开发进阶
关于iOS App 版本控制以及强制更新

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

作者: cc412 | 来源:发表于2016-10-13 16:03 被阅读8590次

    公司刚开始立项一个项目时候,往往项目方向变化比较大,所以项目框架也会经常变更。所以也就存在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不联网,等待那个白名单接口超时后再次进入就可以越过强制更新机制了。
    不过可以监听网络变化,变更后再次请求就好了。但是只能检测是否强制更新,如果只是单纯的版本更新不要弹出版本更新提示啦。要不很烦人的。
    也还可以对后台白名单进行扩展,只有比较重要的版本更新才去提示用户。
    这里只提供一个思路~大家自行扩展吧。

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

    Git地址

    相关文章

      网友评论

      • 移动的WIFI:如果最新版本没有上架 在APP内部更新的话 应该怎么做
        移动的WIFI:@iManuQiao 好的 我去看看文档
        iManuQiao:试试jspatch
      • linqiang:最好不要这么做~
        口袋海贼王_:@linqiang 肯定要这么做。。
      • liwb:这样做,审核能通过吗?
        华夜聆芳:@cc412 苹果不允许强制更新,要是检测到会审核不通过的,这样提示苹果会看不到吗
        cc412:@liwb 可以的,每次提交肯定是最新版本,苹果看不到这个提示更新界面的

      本文标题:关于iOS App 版本控制以及强制更新

      本文链接:https://www.haomeiwen.com/subject/qiiwyttx.html