美文网首页
版本更新(强制更新)

版本更新(强制更新)

作者: 齐小天_Liu | 来源:发表于2017-05-25 10:38 被阅读150次

    通常 iOS系统默认在WIFI条件下,且网络状态良好的情况下,自动更新应用,但如果用户设置了关闭自动更新,而我们的app出现了重要版本更新,或者有在有新版本的情况下必须更新的需求,这时候我们就需要对app版本进行检测、更新。
    我们目前的这个项目就有这种需求,当有版本更新时,必须强制用户更新,否则不允许用户使用app。下面我们来看看具体的实现方法。
    要想实现版本更新,首先需要我们进行版本检测,也就说,我们需要获取到当前app的版本号以及目前App Store上的版本号,将两者进行对比判断,是否需要更新,如果需要我们在进行下一步操作。

    首先我们先来获取本地版本:

    //获取当前APP的版本号
    NSDictionary *infomation = [[NSBundle mainBundle] infoDictionary];
    NSString *currentVersion = infomation[@"CFBundleShortVersionString"];
    

    下面我们来看看如何获取到App Store上的版本号。获取App Store上的版本号需要我们和App Store进行数据通信,App Store给我们提供了相应的接口,我们只需要发送一个Get请求就能轻松获取到App Store上的版本号。下面我们来看一下demo
    #pragma mark 检测更新
    #define APP_URL [NSString stringWithFormat:@"http://itunes.apple.com/cn/lookup?id=%@",APP_ID]
    - (void)examineSystemUpdate
    {
    AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
    [mgr GET:APP_URL parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {

            NSLog(@"response = %@",responseObject);
            //App Store返回的数据
            NSDictionary *dict = [responseObject[@"results"] objectAtIndex:0];
            //获取App Store上的版本号
            NSString *appStoreVersion = dict[@"version"];
    
            //获取当前APP的版本号
            NSDictionary *infomation = [[NSBundle mainBundle] infoDictionary];
            NSString *currentVersion = infomation[@"CFBundleShortVersionString"];
            //比较版本号判断是否更新(这里的比较方法直接用的字符串之间的比较,利用NSNumericSearch属性,会忽略字符串按位比较字符串中的数字)
            NSComparisonResult result = [currentVersion compare:appStoreVersion options:NSNumericSearch];
            //如果当前版本低,就更新
            if (result == NSOrderedAscending) {
                //更新方法
                [self alertUpdateMessage:dict];
            } 
    
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            NSLog(@"error = %@",error.localizedDescription);
        }];
    }
    

    这里我们讲一下,从App Store上获取到的版本信息有很多,但是对于这个功能来说大部分是没有用的,我们用到的就两个,一个是version当前版本号,返回的是一个字符串,另一个是trackViewUrl应用程序在App Store中的下载地址,有了这个地址我们之间调用[[UIApplication sharedApplication] openURL:downLoadUrl];方法就可以跳转到App Store中进行下载。

    下面我们来看一下如何跳转到App Store中,方法很简单,直接上demo

    /**
     跳转到App Store的方法
    
     @param dict 从App Store获取到的版本信息字典
     */
    - (void)alertUpdateMessage:(NSDictionary *)dict
    {
        NSString *messageStr = [NSString stringWithFormat:@"发现新版本%@,需要更新,请前往App Store更新应用!",dict[@"version"]];
        UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"更新" message:messageStr preferredStyle:UIAlertControllerStyleAlert];
        UIAlertAction *sure = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
    
            NSURL *downLoadUrl = [NSURL URLWithString:dict[@"trackViewUrl"]];
            [[UIApplication sharedApplication] openURL:downLoadUrl];
    
        }];
        [alert addAction:sure];
        [self.window.rootViewController presentViewController:alert animated:YES completion:nil];
    }
    

    以上我们已经实现了主体方法,我们只需要在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中调用一下- (void)examineSystemUpdate方法即可实现,当有新版本时会弹出提示更新,点击确定会跳转到App Store。但这样并不会直接进行下载更新,还需要用户手动点击下载,如果用户没有下载,又直接打开app,这时候app是又可以使用了的。
    如果我们想让他不管什么时候进入app,只要不是最新版本,都弹出更新提示,直到他下载了新版本为止。这个想法有点流氓,但是不排除会有这样流氓的客户会提出这种流氓的需求,那我们需要怎么做呢?
    其实也很简单,我们只需要在- (void)applicationWillEnterForeground:(UIApplication *)application;方法中,再调用一次检测版本更新的方法- (void)examineSystemUpdate就OK了。这样不管是app启动,还是从后台进入到前台,都会进行版本检测,只要不是最新版本,都会提示更新,直到更新至最新版本为止。

    相关文章

      网友评论

          本文标题:版本更新(强制更新)

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