iOS开发实战 - 如何更灵活的控制App版本更新

  1. 自从iOS可以在设置中开启App自动更新后,越来越多的App不再弹框提示用户进行版本更新,尤其是强制更新,其实苹果并不建议在App中加入用户更新的提示,如果在应用审核期间被看到,会大大增加被拒的风险;
  2. 但是在项目前期,特别是中小公司的项目,应用内容生态不完整,产品设计也经常变化,bug频出,每次版本更新的改动较大,为了用户更好的体验,不得不进行版本更新的提示,甚至较重要的版本会采用强制更新的提示;
  3. 很多时候需要在应用审核期间做出一些差异来躲避审核策略,比如:改变登录方式,隐藏支付方式等需求,因此最新版本号掌握在自己的手里就显得至关重要;

方法一:通过获取应用在AppStore最新的版本号,并与应用当前版本号做对比

优点:不需要提供额外的API,后续版本更新管理简单

缺点:

  1. 获取版本号会出现延迟或版本号不稳定,会出现与刚刚发布的版本号对不上的情况;
    解决办法:将"https://itunes.apple.com/lookup?id=" 更换为:"https://itunes.apple.com/cn/lookup?id=",后者服务器在国内,延迟低,但偶尔还是会出现版本号对不上的情况。
  2. 从AppStore检查版本更新,审核被拒的风险很大;
  3. 灵活性差,每个版本只能设定一种提示方式,例如需要根据本次更新的内容进行版本更新提示,可能需要经常改动这块代码,比如: 优化体验,变动不大可能需要“本次更新不提示”,增加新功能可能需要“建议更新”,修复重大bug可能需要“强制更新”。

方法二:通过请求自己服务器的App版本更新API获取App最新版本号,同时获取本次更新提示的方式

优点:更灵活,请求回来的版本号可控,提示更新方式掌握在自己手中

缺点:

  1. 需要后台多提供两个API
    获取更新版本号;
    更改最新版本号;
  2. 以后每次发布新版本后需要去更改最新版本号
详细介绍一下第二种方法:
iOS开发实战 - 如何更灵活的控制App版本更新_第1张图片
App版本更新

服务端API:
1.获取最新版本号
2.应用发布后修改最新版本号
建议:
1.检查更新可以放到子线程里面去做,防止线程阻塞;
附加:强制更新
追加一个是否强制更新的参数

主要代码:
下面实例代码不仅控制了版本更新提示方式,还控制了在应用审核期间的用户登录方式,同样你也可以在其中加入控制支付方式的需求

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //默认登录方式为验证码登录
    [UD integerForKey:IS_CHECK_PASS];
    [self getAppStoreVersion];
}

- (void)getAppStoreVersion {
    [YQHttpRequest getData:@{@"commonAppType":@"IOS"} url:@"/common/app/version/getAppVersion" success:^(id responseDic) {
        if ([responseDic[@"status"] isEqualToString:@"0"]) {
            NSString *updateCode = [NSString new];
            if (responseDic[@"appIsUpdate"]) {
                updateCode = responseDic[@"appIsUpdate"];
            }
            unsigned int appStoreVersion = [[responseDic[@"message"] stringByReplacingOccurrencesOfString:@"." withString:@""] unsignedIntValue];
            [self checkAppUpdateWithAppVersion:appStoreVersion appIsUpdate:updateCode];
        } else {
            [UD setInteger:1 forKey:IS_CHECK_PASS];
        }
    } fail:^(NSError *error) {
        [UD setInteger:1 forKey:IS_CHECK_PASS];
        NSLog(@"%@",error);
    }];
}

//检查更新
- (void)checkAppUpdateWithAppVersion:(unsigned int)appStoreVersion appIsUpdate:(NSString *)updateCode {
    //获取当前版本
    unsigned int nowVersion = [[[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"] stringByReplacingOccurrencesOfString:@"." withString:@""] unsignedIntValue];
    //对比版本
    if (appStoreVersion < nowVersion){
        //未审核通过-密码登录
        [UD setInteger:0 forKey:IS_CHECK_PASS];
    }else {
        //审核通过-验证码登录
        [UD setInteger:1 forKey:IS_CHECK_PASS];
        if (appStoreVersion > nowVersion) {
            //需要更新-是否弹出更新
            switch (updateCode.intValue) {
                case 0: //不更新
                    break;
                case 1: //强制更新
                {
                    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"为了提供更卓越的服务,请您更新APP后使用" delegate:self cancelButtonTitle:nil otherButtonTitles:@"立即更新", nil];
                    alert.tag = 88;
                    [alert show];
                }
                    break;
                case 2: //建议更新
                {
                    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"为了提供更卓越的服务,请您更新APP后使用" delegate:self cancelButtonTitle:@"残忍拒绝" otherButtonTitles:@"去更新", nil];
                    alert.tag = 66;
                    [alert show];
                }
                default:
                    break;
            }
        }
    }
}

#prama mark - UIAlertViewDelegate
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    if (alertView.tag == 66) {
        //建议更新
        if (buttonIndex == 1) {
            NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"https://itunes.apple.com/cn/app/xing-dong/id%@?l=zh&ls=1&mt=8", APPLE_ID]];
            [[UIApplication sharedApplication]openURL:url];
        }
    } else if (alertView.tag == 88) {
        //强制更新
        if (buttonIndex == 0) {
            NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"https://itunes.apple.com/cn/app/xing-dong/id%@?l=zh&ls=1&mt=8", APPLE_ID]];
            [[UIApplication sharedApplication] openURL:url];
            //强制退出App
            exit(0)
        }
    }
}

你可能感兴趣的:(iOS开发实战 - 如何更灵活的控制App版本更新)