iOS---关于检测App更新的方法卡住主线程的问题

2017-11-13  本文已影响84人  乐逍遥的笔记

在迭代项目的过程中,曾出现过在个人中心里出现莫名其妙的卡顿,很是摸不着头脑,最开始以为后台的接口卡顿,但是试了好多次也不是,因为网络请求毕竟使用的是AFNetworking,网络的请求是放在子线程里面的。最后找到了是检测App的方法卡住了主线程。

/**

app版本检测

*/

+ (void)updateApp:(UIViewController *)VC{

//2先获取当前工程项目版本号

NSDictionary *infoDic=[[NSBundle mainBundle] infoDictionary];

NSString *currentVersion=infoDic[@"CFBundleShortVersionString"];

//3从网络获取appStore版本号

NSError *error;

NSData *response = [NSURLConnection sendSynchronousRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://itunes.apple.com/cn/lookup?id=%@",STOREAPPID]]] returningResponse:nil error:nil];

if (response == nil) {

NSLog(@"你没有连接网络哦");

[Factory alertMes:@"您没有连接网络"];

return;

}

NSDictionary *appInfoDic = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&error];

if (error) {

NSLog(@"hsUpdateAppError:%@",error);

return;

}

//    NSLog(@"%@",appInfoDic);

NSArray *array = appInfoDic[@"results"];

if (array.count == 0 || array == nil) {

NSLog(@"还没上线");

}else{

NSDictionary *dic = array[0];

NSString *appStoreVersion = dic[@"version"];

//打印版本号

NSLog(@"当前版本号:%@\n商店版本号:%@",currentVersion,appStoreVersion);

//设置版本号

currentVersion = [currentVersion stringByReplacingOccurrencesOfString:@"." withString:@""];

if (currentVersion.length==2) {

currentVersion  = [currentVersion stringByAppendingString:@"0"];

}else if (currentVersion.length==1){

currentVersion  = [currentVersion stringByAppendingString:@"00"];

}

appStoreVersion = [appStoreVersion stringByReplacingOccurrencesOfString:@"." withString:@""];

if (appStoreVersion.length==2) {

appStoreVersion  = [appStoreVersion stringByAppendingString:@"0"];

}else if (appStoreVersion.length==1){

appStoreVersion  = [appStoreVersion stringByAppendingString:@"00"];

}

//4当前版本号小于商店版本号,就更新

if([currentVersion floatValue] < [appStoreVersion floatValue])

{

//初始化AlertView

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"版本有更新"

message:[NSString stringWithFormat:@"检测到新版本(%@),是否更新?",dic[@"version"]]

delegate:self

cancelButtonTitle:@"取消"

otherButtonTitles:@"更新",nil];

[alert show];

//        UIAlertController *alercConteoller = [UIAlertController alertControllerWithTitle:@"版本有更新" message:[NSString stringWithFormat:@"检测到新版本(%@),是否更新?",dic[@"version"]] preferredStyle:UIAlertControllerStyleAlert];

//        UIAlertAction *actionYes = [UIAlertAction actionWithTitle:@"更新" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {

//            //此处加入应用在app store的地址,方便用户去更新,一种实现方式如下

//            NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"https://itunes.apple.com/us/app/id%@?ls=1&mt=8", STOREAPPID]];

//            [[UIApplication sharedApplication] openURL:url];

//        }];

//        UIAlertAction *actionNo = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {

//

//        }];

//        [alercConteoller addAction:actionYes];

//        [alercConteoller addAction:actionNo];

//        [VC presentViewController:alercConteoller animated:YES completion:nil];

}else{

NSLog(@"版本号好像比商店大噢!检测到不需要更新");

}

}

}

这个方法是App去App Store调取版本号的相关信息,但是会卡主线程,导致体验极差。

在优化的过程中,我的解决卡顿办法是,让后台控制App的更新,而不是去App Store。在App上架完成之后,告诉后台更改版本号,以提示用户更新。

上一篇 下一篇

猜你喜欢

热点阅读