在前一段时间,苹果的审核标准有所变化:在程序中不能出现检测版本更新的入口。看到这个信息的时候以为在app中不能有检测更新或强制更新的功能,最后发现自己还是犯了望文生义的大错误。苹果建议采用系统的自动更新,但在系统的设置里可以把自动更新关掉。这就导致app有新版本,不能及时被用户更新,所以检测版本和版本更新的功能还是必不可少的。但是一定不要有检测更新的入口呦,如button之类的。否则被苹果给拒了就自能怪自己了。

开发人员都知道,apple的App有两种类型:企业版和store版。所以采用的更新方式自然也就有所不同。

1、appStore更新

(1)先介绍一下接口

检查app应用信息的接口:https://itunes.apple.com/lookup?id=1234567890(id为自己应用的Apple ID)

返回数据:其中version是最新的版本号,releaseNotes为新版本的更新内容;

iOS 检测应用更新 苹果手机检查应用更新_App

<2>右键单击应用

<3>拷贝链接,粘贴就得到了 https://itunes.apple.com/cn/app/xin-dong-hui-yi-qing-se-zhi/id655913723?mt=8

iOS 检测应用更新 苹果手机检查应用更新_检测版本_02



(2)代码实现

在- (void)applicationDidBecomeActive:(UIApplication *)application方法里写更新,便于每次程序运行都提示,当然这个也是根据需求来的;

- (void)applicationDidBecomeActive:(UIApplication
   //每次启动应用的时候检查更新
    [selfchectVersionFromAppStore];
}


具体方法:

- (void)chectVersionFromAppStore
    NSString *url = [[NSStringalloc]initWithFormat:@"https://itunes.apple.com/lookup?id=16666666"];
selfrequestURL:url];
- (void)requestURL:(NSString
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManagermanager];
    manager.requestSerializer = [AFHTTPRequestSerializerserializer];
GET:URLparameters:nilsuccess:^(AFHTTPRequestOperation *operation,id
NSDictionary *infoDic = [[NSBundlemainBundle]infoDictionary];
NSString *localVersion = [infoDicobjectForKey:@"CFBundleShortVersionString"];
NSDictionary *versionInfo = [[responseObjectobjectForKey:@"results"]firstObject];
NSString *serverVersion = [versionInfoobjectForKey:@"version"];
NSString *message = [versionInfoobjectForKey:@"releaseNotes"];
if ([selfcompareServerVersion:serverVersion withLocalVersion:localVersion])
            /* UIAlertController实现
发现新版本" message:message preferredStyle:UIAlertControllerStyleAlert];
             AppDelegate *delegate =  [UIApplication sharedApplication].delegate;
             [delegate.window.rootViewController presentViewController:AlertController animated:YES completion:nil];
            UIAlertView *alertView = [[UIAlertViewalloc]initWithTitle:@"发现新版本"message:nildelegate:selfcancelButtonTitle:@"下载"otherButtonTitles:@"取消",nil];
            NSDictionary *attrs =@{NSFontAttributeName : [UIFontsystemFontOfSize:17]};
            CGSize size = [messageboundingRectWithSize:CGSizeMake(230,400)options:NSStringDrawingUsesLineFragmentOriginattributes:attrscontext:nil].size;
UITextView *textView = [[UITextViewalloc]initWithFrame:CGRectMake(0,0,200, size.height +10)];
editable =NO;
selectable =NO;
font = [UIFontsystemFontOfSize:15];
backgroundColor = [UIColorclearColor];
            // iOS8以上系统,充满整个AlertView,需要调整边距
if ([selfIOS8])
UIEdgeInsets e =UIEdgeInsetsMake(0,20,0, 0);
setTextContainerInset:e];
setValue:textViewforKey:@"accessoryView"];
message =@"";
show];
failure:^(AFHTTPRequestOperation *operation,NSError
- (BOOL)IOS8
BOOL b =false;
    NSString *ver = [[UIDevicecurrentDevice]systemVersion];
    if (NSOrderedAscending != [vercompare:@"8.0"]) {
true;
return
 *  比较服务器版本和本地程序版本。
@param sv  服务器版本
@param lv  本地版本
@return YES:更新(server version > local version), NO:不更新(数据异常或者server version <= local version)
- (BOOL)compareServerVersion:(NSString*)serverVersion withLocalVersion:(NSString*)localVersion
BOOL ret =NO;
if (serverVersion ==nil || [serverVersion isEqualToString:@""]) {
        NSLog(@"Server version is empty.");
return
if (localVersion ==nil || [localVersion isEqualToString:@""]) {
        NSLog(@"Local version is empty.");
return
NSArray *serComps = [serverVersioncomponentsSeparatedByString:@"."];
NSArray *locComps = [localVersioncomponentsSeparatedByString:@"."];
for (int index =0; index < serComps.count; index++) {
int numServer = [[serCompsobjectAtIndex:index] intValue];
int numLocal = -1;
if (locComps.count
objectAtIndex:index]intValue];
break;
elseif
break;
return
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
if (buttonIndex == alertView.cancelButtonIndex) {
        [[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"https://itunes.apple.com/cn/app/zhi-dong-sheng-huo/id=853522946?mt=8"]];
}




2、服务器版本下载和更新

用此功能必须具备以下条件:

<1>苹果企业开发者账号和企业证书

<2>支持https的服务器,当然没有也可以(利用第三方的)

<3>下载页面(负责找到plist文件,并提供给用户良好的页面展示)

<4>plist文件(负责下载ipa包)


如果没有支持https的服务器,七牛云存储是个很好的代理,下来看看它的真面目吧。

进入七牛官网:http://www.qiniu.com,然后注册成为标准用户,就可以上传plist文件了

注册成功后,新建空间

iOS 检测应用更新 苹果手机检查应用更新_版本更新_03


点击存在的空间,进入空间,再点击内容管理,然后上传plist文件

iOS 检测应用更新 苹果手机检查应用更新_检测版本_04


查看自己空间的URL,配置在自己的html页面里:

iOS 检测应用更新 苹果手机检查应用更新_ios_05

到此,路已经走通,下面来看一下plist文件的结构

iOS 检测应用更新 苹果手机检查应用更新_App_06

注意: bundle-identifier的Value中在bundleId后增加.fixios8是为了解决ios8刚出现的时候会安装成两个app的问题,后来问题没有了,所以以后直接写bundleId就ok了。


html的具体配置

iOS 检测应用更新 苹果手机检查应用更新_ios_07


代码的具体实现和appStore的实现类似,只不过版本信息是通过后台接口传过来。so,这里就不写了,参照上面的代码。