iOS开发实战 - 如何更灵活的控制App版本更新
2018-08-26 本文已影响50人
ArchLL
- 自从iOS可以在设置中开启App自动更新后,越来越多的App不再弹框提示用户进行版本更新,尤其是强制更新,其实苹果并不建议在App中加入用户更新的提示,如果在应用审核期间被看到,会大大增加被拒的风险;
- 但是在项目前期,特别是中小公司的项目,应用内容生态不完整,产品设计也经常变化,bug频出,每次版本更新的改动较大,为了用户更好的体验,不得不进行版本更新的提示,甚至较重要的版本会采用强制更新的提示;
- 很多时候需要在应用审核期间做出一些差异来躲避审核策略,比如:改变登录方式,隐藏支付方式等需求,因此最新版本号掌握在自己的手里就显得至关重要;
方法一:通过获取应用在AppStore最新的版本号,并与应用当前版本号做对比
优点:不需要提供额外的API,后续版本更新管理简单
缺点:
- 获取版本号会出现延迟或版本号不稳定,会出现与刚刚发布的版本号对不上的情况;
解决办法:将"https://itunes.apple.com/lookup?id=" 更换为:"https://itunes.apple.com/cn/lookup?id=",后者服务器在国内,延迟低,但偶尔还是会出现版本号对不上的情况。 - 从AppStore检查版本更新,审核被拒的风险很大;
- 灵活性差,每个版本只能设定一种提示方式,例如需要根据本次更新的内容进行版本更新提示,可能需要经常改动这块代码,比如: 优化体验,变动不大可能需要“本次更新不提示”,增加新功能可能需要“建议更新”,修复重大bug可能需要“强制更新”。
方法二:通过请求自己服务器的App版本更新API获取App最新版本号,同时获取本次更新提示的方式
优点:更灵活,请求回来的版本号可控,提示更新方式掌握在自己手中
缺点:
- 需要后台多提供两个API
获取更新版本号;
更改最新版本号; - 以后每次发布新版本后需要去更改最新版本号
详细介绍一下第二种方法:
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;
}
}
}
}