通常 iOS系統(tǒng)默認在WIFI條件下,且網(wǎng)絡狀態(tài)良好的情況下,自動更新應用,但如果用戶設置了關閉自動更新,而我們的app出現(xiàn)了重要版本更新,或者有在有新版本的情況下必須更新的需求,這時候我們就需要對app版本進行檢測、更新。
我們目前的這個項目就有這種需求,當有版本更新時,必須強制用戶更新,否則不允許用戶使用app。下面我們來看看具體的實現(xiàn)方法。
要想實現(xiàn)版本更新,首先需要我們進行版本檢測,也就說,我們需要獲取到當前app的版本號以及目前App Store上的版本號,將兩者進行對比判斷,是否需要更新,如果需要我們在進行下一步操作。
首先我們先來獲取本地版本:
//獲取當前APP的版本號
NSDictionary *infomation = [[NSBundle mainBundle] infoDictionary];
NSString *currentVersion = infomation[@"CFBundleShortVersionString"];
下面我們來看看如何獲取到App Store上的版本號。獲取App Store上的版本號需要我們和App Store進行數(shù)據(jù)通信,App Store給我們提供了相應的接口,我們只需要發(fā)送一個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返回的數(shù)據(jù)
NSDictionary *dict = [responseObject[@"results"] objectAtIndex:0];
//獲取App Store上的版本號
NSString *appStoreVersion = dict[@"version"];
//獲取當前APP的版本號
NSDictionary *infomation = [[NSBundle mainBundle] infoDictionary];
NSString *currentVersion = infomation[@"CFBundleShortVersionString"];
//比較版本號判斷是否更新(這里的比較方法直接用的字符串之間的比較,利用NSNumericSearch屬性,會忽略字符串按位比較字符串中的數(shù)字)
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中的下載地址,有了這個地址我們之間調(diào)用[[UIApplication sharedApplication] openURL:downLoadUrl];方法就可以跳轉(zhuǎn)到App Store中進行下載。
下面我們來看一下如何跳轉(zhuǎn)到App Store中,方法很簡單,直接上demo:
/**
跳轉(zhuǎn)到App Store的方法
@param dict 從App Store獲取到的版本信息字典
*/
- (void)alertUpdateMessage:(NSDictionary *)dict
{
NSString *messageStr = [NSString stringWithFormat:@"發(fā)現(xiàn)新版本%@,需要更新,請前往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];
}
以上我們已經(jīng)實現(xiàn)了主體方法,我們只需要在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中調(diào)用一下- (void)examineSystemUpdate方法即可實現(xiàn),當有新版本時會彈出提示更新,點擊確定會跳轉(zhuǎn)到App Store。但這樣并不會直接進行下載更新,還需要用戶手動點擊下載,如果用戶沒有下載,又直接打開app,這時候app是又可以使用了的。
如果我們想讓他不管什么時候進入app,只要不是最新版本,都彈出更新提示,直到他下載了新版本為止。這個想法有點流氓,但是不排除會有這樣流氓的客戶會提出這種流氓的需求,那我們需要怎么做呢?
其實也很簡單,我們只需要在- (void)applicationWillEnterForeground:(UIApplication *)application;方法中,再調(diào)用一次檢測版本更新的方法- (void)examineSystemUpdate就OK了。這樣不管是app啟動,還是從后臺進入到前臺,都會進行版本檢測,只要不是最新版本,都會提示更新,直到更新至最新版本為止。