iOS进阶之路iOS开发资料收集IOS专辑

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

2018-08-26  本文已影响50人  ArchLL
  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. 以后每次发布新版本后需要去更改最新版本号
详细介绍一下第二种方法:
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;
            }
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读