iOS检测更新APP

作者: langlangago | 来源:发表于2015-10-16 16:12 被阅读5642次
    iOS APP检查更新有两种方法:

    1、在某特定的服务器上,发布和存储app最新的版本信息,需要的时候向该服务器请求查询。
    post 请求的url
    "http://itunes.apple.com/search?term=你的应用名称&entity=software"

    2、从app store上查询,可以获取到app的作者,连接,版本等。
    post 请求的url
    http://itunes.apple.com/lookup?id=你的应用程序的ID (在苹果iTunes connect上申请的APP ID)

    两个方法,都是拿到APP的详细信息,之后在APP Store上下载,比较常规的方法是第二种,如果使用第一种方法的话,由于苹果需要审核,中间会有时间差,这个时间不好把握。

    APP的详细信息获取下来后是json格式的数据,解析后的数据,大概是这样的:
    {
    resultCount = 1;
    results = [ {
    artistId = 开发者 ID;
    artistName = 开发者名称;
    price = 0;
    isGameCenterEnabled = 0;
    kind = software;
    languageCodesISO2A = (
    EN
    );
    trackCensoredName = 审查名称;
    trackContentRating = 评级;
    trackId = 应用程序 ID;
    trackName = 应用程序名称";
    trackViewUrl = 应用程序介绍网址;
    userRatingCount = 用户评级;
    userRatingCountForCurrentVersion = 1;
    version = 版本号;
    wrapperType = software;
    }
    ]
    }
    我们可以从中获取我们需要的信息。


    这里使用的是第二种方法,app store上获取详细信息,代码如下:(实际上用第一种方法,只是换了url而已)
    - (void)updateApp
    {
      // kAPP_URL : @"http://itunes.apple.com/lookup?id=";
    //    kAppID : 在iTunes connect上申请的APP ID;
        NSString *urlStr = [NSString stringWithFormat:@"%@%@", kAPP_URL, kAppID];
        NSURL *url = [NSURL URLWithString:urlStr];
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
        //网络请求
        NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
        NSURLSessionTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
            NSError *err;
            //NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
            NSDictionary *appInfoDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&err];
        
            if (err) {
                NSLog(@"%@", err.description);
                return;
            }
    
            NSArray *resultArray = [appInfoDict objectForKey:@"results"];
            if (![resultArray count]) {
                NSLog(@"error : resultArray == nil");
                return;
            }
        
            NSDictionary *infoDict = [resultArray objectAtIndex:0];
    
            //获取服务器上应用的最新版本号
            NSString *updateVersion = infoDict[@"version"];
            NSString *trackName = infoDict[@"trackName"];
    
            //_trackViewUrl : 更新的时候用到的地址
            _trackViewUrl = infoDict[@"trackViewUrl"];
    
            //获取当前设备中应用的版本号
            NSDictionary *infoDic = [[NSBundle mainBundle] infoDictionary];
            NSString *currentVersion = [infoDic objectForKey:@"CFBundleShortVersionString"];
        
        //判断两个版本是否相同
            if ([currentVersion doubleValue] < [updateVersion doubleValue]) {
                NSString *titleStr = [NSString stringWithFormat:@"检查更新:%@", trackName];
                NSString *messageStr = [NSString stringWithFormat:@"发现新版本(%@),是否更新", updateVersion];
                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:titleStr message:messageStr delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"升级", nil];
                alert.tag = [kAppID intValue];
                [alert show];
            
            } else {  //版本号和app store上的一致
                NSString *titleStr = [NSString stringWithFormat:@"检查更新:%@", trackName];
                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:titleStr message:@"暂无新版本" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
                alert.tag = [kAppID intValue] + 1;
                [alert show];
          }
       }];
        [task resume];
    }
    //判断用户点击了哪一个按钮
    -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
    {
        if (alertView.tag == [kAppID intValue]) {
            if (buttonIndex == 1) { //点击”升级“按钮,就从打开app store上应用的详情页面
                [[UIApplication sharedApplication] openURL:[NSURL URLWithString:self.trackViewUrl]];
            }
        }
     }

    相关文章

      网友评论

      • cc_Jumper:版本号比较有问题,当1.2.4, 1.2.5 doubleValue 都是1.2
      • char_hu:谢谢!
      • 萧旭:楼主大人,有没有遇到过这个问题?

        提示更新,点击去appstore更新,但是appstore中显示的是“打开”,
        在这里可以确定的是已经有新的版本了!!

        我可以在appstore的自己提醒更新的地方更新app
        langlangago:看官大人,这个问题我自己做得app没有出现过,但是我用过的软件遇到过这个问题(我卸载了之后重新安装搞定了)。

        我个人认为应该是苹果的问题吧!毕竟AppStore是不受你影响的!

        因为没有遇到过类似的问题,我也只是猜测而已!错了不要打我:mask:
      • 携一两本单色书来:为什么有的app请求下来的数据是空的,两个app,也算安这个方法,有一个的text是
        {
        "resultCount":0,
        "results": []
        }
        携一两本单色书来:https://itunes.apple.com/lookup?id=1023256062,

        想了一下,可能是10位的id都不行,9位的就可以。
        ChenJZ:@携一两本单色书来 应该是你的AppID写错了
      • _de_bug_life:为什么我在火狐浏览器里输入http://itunes.apple.com/lookup?id=我的应用程序的ID,结果是下载一个text文档,在项目里运行直接崩了,求问楼主
        _de_bug_life:@langlangago 重新搞了一遍,没有出现崩溃,应该是我上次代码出现了问题吧
        langlangago:@_de_bug_life 我试了一下用过谷歌直接打开也是会下载文件,估计是正常情况,这是为什么我也不造啊! :pensive:
        程序里面运行奔溃了?这就很尴尬了 :disappointed_relieved: ,在这里很难给你提出有价值的建议。如果你解决问题之后,发现我上面写的有错,欢迎指正啊!
      • 多LV信源:NSArray *resultArray = [appInfoDict objectForKey:@"results"]; 是错误的, 对吗?
        [appInfoDict objectForKey:@"results"]不能定义为数组, 要为字典....请回复下, 谢谢
        多LV信源:@langlangago 恩, 仔细研究了下, 你说的是对的, 之前
        {
        resultCount = 1;
        results = [ {
        artistId = 开发者 ID;
        ......
        }
        ]
        }
        result后的[ ] 是( ), 应该是( ) 小括号, 而不是修改后的 [ ] 中括号
        在Xcode的控制台, 序列化后的json数据打印出的 ( ), 为数组, 打印出的{ } 为字典
        也是细节问题吧, 忽略了一个小小的 ( )

        langlangago:@多LV信源 不是的,NSDictionary的value是可以为任何对象的,所以获取出来的数据只要是个对象就没有问题,[appInfoDict objectForKey:@"results"]获取出来是个NSAarry是没有问题的。
      • 多LV信源:你好, 用json转序列化后, 获得是一个字典, 字典如下格式
        NSDictionary *dataDict =
        @{
        @"resultCount" : @1,

        @"results" :@{
        @"artistId" : @"sffds",
        @"artistName" : @"caasd",
        @"trackViewUrl" : @"应用程序介绍网址",
        @"userRatingCountForCurrentVersion" :@1

        }
        };

        self.trackViewUrl = [dataDict valueForKey:@"results"][@"trackViewUrl"]; 才可以获得网址,
        不是所写的 self.trackViewUrl = [[dataDict valueForKey:@"results"] objectAtIndex:0[@"trackViewUrl"];
        不用多加 objectAtIndex:0 , 因为 [dataDict valueForKey:@"results"] 获得是一个字典,而不是数组
        望作者及时回复, 谢谢
        langlangago:@多LV信源 说出来你可能不信 :joy: ,但是我打印出来确实是数组来的……,就像下面:

        {
        "resultCount": 1,
        "results": [
        {
        "ipadScreenshotUrls": [],
        "appletvScreenshotUrls": [],
        "artworkUrl60": "http://is1.mzst…

        ]
        }

        要不你直接在xcode中将它转成字符串打印出来看看!
      • 想养只土狗:CFBundleVersion 指 build 号,通过lookup link 从iTunes Connect 获取的应该是Version即CFBundleShortVersion。用 “ if (currentVersion < updateVersion) {”这个来比较版本有问题吧。
        实在不想取名字:@langlangago 我测了很多次 这方法 currentVersion < updateVersio 进不去
        langlangago:@luckychunxiao 已修改,谢谢提醒!
      • 若锦:现在苹果审核是不是有更新提示就会被拒?那怎么处理更新提示这个问题呢
        langlangago:@若锦 现在具体怎么样我也不是很清楚,不过一般不要在页面上显示有更新等字眼是没有问题的。
        5a7c2642d9ee:@雨汐流若 审核通过之后,改服务器的version

      本文标题:iOS检测更新APP

      本文链接:https://www.haomeiwen.com/subject/dyhacttx.html