只需要知道自己的app ID,就可以使用版本检测升级功能。
首先,根据app ID获取app在app store上的相关信息,然后拿到自己本地的版本号,和app store上获取的版本号比较,如果本地版本号较低,则提醒需要更新,展示app store上最新的版本号和最近的更新内容,最后,如果用户点击更新就跳转到app store上app对应界面进行更新。(另,因为当时要封装成静态库,网络请求用的是苹果自带的,可以换成afn)
根据app ID获取app store上app的信息
+(void)checkVersionUpdate:(NSString *)appId {
//定义的app的地址
//country 上架国家(全部国家可不写) id appId。
NSString *urld = [NSString stringWithFormat:@"https://itunes.apple.com/lookup?country=cn&id=%@", appId];
NSURL *url = [NSURL URLWithString:urld];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10];
[request setHTTPMethod:@"GET"];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSMutableDictionary *receiveStatusDic = [[NSMutableDictionary alloc] init];
if (data) {
NSDictionary *receiveDic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves|NSJSONReadingMutableContainers|NSJSONReadingAllowFragments error:nil];
NSArray *array =receiveDic[@"results"];
if (array.count == 0) {
return ;
}
//获取appstore最新版本号
NSString *version = [array[0] objectForKey:@"version"];
//获取更新信息
NSString *note = [array[0] objectForKey:@"releaseNotes"];
if ([version intValue]>0) {
[receiveStatusDic setValue:@"-1" forKey:@"status"];
[receiveStatusDic setValue:version forKey:@"version"];
[receiveStatusDic setValue:note forKey:@"note"];
[receiveStatusDic setValue:appId forKey:@"appId"];
//请求的有数据,进行版本比较
[self performSelectorOnMainThread:@selector(receiveData:) withObject:receiveStatusDic waitUntilDone:YES];
} else {
[receiveStatusDic setValue:@"-1" forKey:@"status"];
}
} else {
[receiveStatusDic setValue:@"-1" forKey:@"status"];
}
}];
[task resume];
}
app store获取的版本号和本地版本号比较
+ (void)receiveData:(id)sender {
//获取APP自身版本号
NSString *localVersion = [[[NSBundle mainBundle]infoDictionary]objectForKey:@"CFBundleShortVersionString"];
NSArray *localArray = [localVersion componentsSeparatedByString:@"."];
NSArray *versionArray = [sender[@"version"] componentsSeparatedByString:@"."];
//比较
NSUInteger count = versionArray.count;
if (versionArray.count > localArray.count) {
count = localArray.count;
}
for (int i = 0; i < count; i++) {
if ([localArray[i] intValue] < [versionArray[i] intValue]) {
[self alertUpdateVersion:sender];
return;
}
//审核时本地大于线上,开发时也有可能
if ([localArray[i] intValue] > [versionArray[i] intValue]) {
NSLog(@"本地版本大于线上");
return;
}
}
//出现了1.2和1.2.3的情况,肯定是长的那个是高版本,因为不存在1.2和1.2.0对比的情况
if (versionArray.count > localArray.count) {
[self alertUpdateVersion:sender];
return;
}
NSLog(@"目前没有新版本");
}
更新提示
+ (void)alertUpdateVersion:(NSMutableDictionary *)dic{
[dic setValue:@"1" forKey:@"status"];
NSString *alertStr = [NSString stringWithFormat:@"检测到较新版本%@。更新内容:\n%@\n\n是否需要进行更新?",dic[@"version"],dic[@"note"]];
UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"版本检测" message:alertStr preferredStyle:(UIAlertControllerStyleAlert)];
UIAlertAction *action = [UIAlertAction actionWithTitle:@"是的" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction * _Nonnull action) {
[self goToUpdate:dic[@"appId"]];
}];
[alertVC addAction:action];
if ([dic[@"updateFlag"] integerValue] == UpdateOptional){
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"不,谢谢" style:(UIAlertActionStyleCancel) handler:^(UIAlertAction * _Nonnull action) {}];
[alertVC addAction:cancelAction];
}
[[self getCurrentViewController] presentViewController:alertVC animated:false completion:nil];
}
获取当前视图的活动页面
+ (UIViewController *)getCurrentViewController {
UIViewController *root = [UIApplication sharedApplication].keyWindow.rootViewController;
UIViewController *currentVC = [self GetNextVC:root];
return currentVC;
}
//使用的递归方法
+ (UIViewController *)GetNextVC:(UIViewController *)rootVC
{
UIViewController *currentVC;
if ([rootVC presentedViewController]) {
rootVC = [rootVC presentedViewController];
}
// UITabBarController
if ([rootVC isKindOfClass:[UITabBarController class]]) {
currentVC = [self GetNextVC:[(UITabBarController *)rootVC selectedViewController]];
}
// UINavigationController
else if ([rootVC isKindOfClass:[UINavigationController class]]){
currentVC = [self GetNextVC:[(UINavigationController *)rootVC visibleViewController]];
}
// 普通的ViewController
else {
currentVC = rootVC;
}
return currentVC;
}
跳转到app store更新
+ (void)goToUpdate:(NSString *)appId {
//跳转地址链接
NSString *str = [NSString stringWithFormat: @"itms-apps://itunes.apple.com/cn/app/id%@?mt=8", appId];
UIApplication *app = [UIApplication sharedApplication];
NSURL *url = [NSURL URLWithString:str];
if ([app canOpenURL:url]) {
if (@available(iOS 10.0,*)) {
[app openURL:url options:@{} completionHandler:nil];
} else {
[app openURL:url];
}
}
}
网友评论