楼主主要接触了俩种更新方式,一种是服务器端配置,app直接获取到服务器返回的version值,同本地的version比较,如果本地的小于返回值,则更新(优点:服务器可自行控制是否为强制更新或者普通更新,缺点:由于App Store审核的不确定性,服务器端不能及时配置version,【楼主用这种方式上传了好几次,都被拒】)第二种是根据app的id来更新,使用苹果的lookup接口来实现,这种可以绕开苹果的审核,同时由于和我们自己的服务器没有多大关系,导致无法配置更新方式(即:强制更新或非强制更新)
首先我们来看第一种更新方式
NSString *softversion = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString *)kCFBundleVersionKey];
softversion = [softversion stringByReplacingOccurrencesOfString:@"." withString:@""];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
NSString *urlstring = [NSString stringWithFormat:APPVERURL,MAINJIYUNURL,REQUESTTYPE,VERSION,APPVERSION];
//对可能出现的英文处理
urlstring = [urlstring stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:urlstring];
NSString *string = [[NSString alloc] initWithData:[NSData dataWithContentsOfURL:url] encoding:NSUTF8StringEncoding];
id data = [string JSONValue];
dispatch_async(dispatch_get_main_queue(), ^{
if (data && [data isKindOfClass:[NSDictionary class]])
{
if(data && [data isKindOfClass:[NSDictionary class]])
{
NSDictionary * dict = (NSDictionary *)data;
NSNumber *numflg = [dict objectForKey:@"flag"];
if (numflg && [numflg intValue] == 1)
{
NSData*data=[dict[@"version_content"] dataUsingEncoding:NSUTF8StringEncoding ];
NSDictionary*dic=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
NSString * curVer = [dic objectForKey:@"IOSnewVersion"];
NSString * minVer = [dic objectForKey:@"ios_forceUpdate"];
NSString * updateurl = [dic objectForKey:@"ios_update_url"];
NSString * updatedesc = [dic objectForKey:@"update_desc"];
NSString * bkcruver;
bkcruver = curVer;
self.update_url = updateurl;//直接到App Store更新
curVer = [curVer stringByReplacingOccurrencesOfString:@"." withString:@""];
minVer = [minVer stringByReplacingOccurrencesOfString:@"." withString:@""];
int softver = [softversion intValue];
int ncurver = [curVer intValue];
newVersion=ncurver;
int nminver = [minVer intValue];
// 先判断是否是有效的版本号
if ( (softver >= 100 && softver <= 999) &&
(ncurver >= 100 && ncurver <= 999))
{
NSString * title = [NSString stringWithFormat:@"发现新版本 v%@",bkcruver];
NSString * message = updatedesc;
// 需要更新
if(ncurver > softver)
{
// 提示该版本已经不能使用,要使用,强制更新
if(nminver == 1)
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:message delegate:self cancelButtonTitle:@"立即更新" otherButtonTitles:nil] ;
alert.tag = 247;
[alert show];
}
// 只是提醒更新
else
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:message delegate:self cancelButtonTitle:@"稍后再说" otherButtonTitles:@"立即更新",nil] ;
alert.tag = 246;
[alert show];
}
}
}
}
else {
}
}
}
});
});
第二种更新方式
//1先获取当前工程项目版本号
NSDictionary *infoDic = [[NSBundle mainBundle] infoDictionary];
NSLog(@"infoDic -- %@",infoDic);
NSString *currentVersion = infoDic[@"CFBundleShortVersionString"];
//2从网络获取appStore版本号
//STOREAPPID为AppStore的应用id
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(@"网络连接失败");
return;
}
NSDictionary *appInfoDic = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&error];
NSLog(@"appInfoDic -- %@",appInfoDic);
NSArray *array = appInfoDic[@"results"];
if (array.count < 1) {
NSLog(@"app未找到");
return;
}
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"];
}
//3当前版本号小于商店版本号,就更新
if([currentVersion floatValue] < [appStoreVersion floatValue])
{
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]; //如果强制更新去掉取消按钮,不是强制更新的时候需要加上取消按钮
[self.window.rootViewController presentViewController:alercConteoller animated:YES completion:nil];
}else{
NSLog(@"版本号大于商店版本号不需要更新");
}
亲测第一种更新方式会被拒,第二种更新方式可以通过审核😂😂😂