通常 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
启动,还是从后台进入到前台,都会进行版本检测,只要不是最新版本,都会提示更新,直到更新至最新版本为止。
网友评论