iOS App检测版本更新

来源:互联网 发布:新疆移动4g网络什么时候开通 编辑:程序博客网 时间:2024/06/01 08:28

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

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

1、appStore更新

(1)先介绍一下接口

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

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


   跳转进入appStore的接口:此接口可以进入iTunes在iTunes store中获得,步骤如下图:

   <1>搜索应用

<2>右键单击应用

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

    


(2)代码实现

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

- (void)applicationDidBecomeActive:(UIApplication *)application {

   //每次启动应用的时候检查更新

    [selfchectVersionFromAppStore];

}


具体方法:

- (void)chectVersionFromAppStore

{

    NSString *url = [[NSStringalloc]initWithFormat:@"https://itunes.apple.com/lookup?id=16666666"];

    [selfrequestURL:url];

    

}


- (void)requestURL:(NSString *)URL

{

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManagermanager];

    manager.requestSerializer = [AFHTTPRequestSerializerserializer];

    [managerGET:URLparameters:nilsuccess:^(AFHTTPRequestOperation *operation,id responseObject) {

       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实现

             UIAlertController *AlertController = [UIAlertController alertControllerWithTitle:@"发现新版本" 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)];

            textView.editable =NO;

            textView.selectable =NO;

            textView.font = [UIFontsystemFontOfSize:15];

            textView.backgroundColor = [UIColorclearColor];

            textView.text = message;

            // iOS8以上系统,充满整个AlertView,需要调整边距

           if ([selfIOS8])

            {

               UIEdgeInsets e =UIEdgeInsetsMake(0,20,00);

                [textViewsetTextContainerInset:e];

            }

            

            [alertViewsetValue:textViewforKey:@"accessoryView"];

            alertView.message =@"";

            [alertViewshow];

            

        }

    }failure:^(AFHTTPRequestOperation *operation,NSError *error) {

        

    }];

    

    

    

}


- (BOOL)IOS8

{

   BOOL b =false;

    NSString *ver = [[UIDevicecurrentDevice]systemVersion];

    if (NSOrderedAscending != [vercompare:@"8.0"]) {

        b =true;

    }

   return b;

}


/**

 *  比较服务器版本和本地程序版本。

 *

 *  @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 ret;

    }

   if (localVersion ==nil || [localVersion isEqualToString:@""]) {

        NSLog(@"Local version is empty.");

       return ret;

    }

    

   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 > index) {

            numLocal = [[locCompsobjectAtIndex:index]intValue];

        }

       if (numServer > numLocal) {

            ret =YES;

           break;

        }elseif (numServer < numLocal) {

            ret =NO;

           break;

        }

    }

   return ret;

}


- (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文件了

注册成功后,新建空间



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



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


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


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


html的具体配置



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


0 0