iOS学习博客积累iOS

iOS瞒天过海之----版本更新

2016-09-06  本文已影响1834人  断剑

大家都知道版本更新是每一个app必不可少的功能,但是现在苹果在审核的时候,严格限制明目张胆的设置版本更新功能,要想实现版本更新,就要使用一些小手段了。

版本更新常用方法

此处只介绍通过AppStore来更新版本的方法。毕竟自己动手才能丰衣足食,依赖别人终究是落了下乘。。。(其实是后台不配合我的需要设计接口。。)

通过AppStore进更新步骤
1.获取AppStore信息
appStore返回信息结构

注意:此处返回的信息是在一个数组当中,这个数组中只有一个包含app所有信息的字典,我们只需要根据相对应的key,获取app的版本号与下载链接即可

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

@property (nonatomic, strong) NSDictionary * appDict;

@end
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    self.appDict = [self appStoreInfos];
    
    return YES;
}

/**
 *   获取AppStore信息
 *
 *  @return app相关信息
 */
- (NSDictionary *)appStoreInfos
{
//此处使用的是网易新闻的id
    NSURL * url = [NSURL URLWithString:@"http://itunes.apple.com/cn/lookup?id=425349261"];
    NSString *jsonResponseString =   [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
    
    return [self stringToDict:jsonResponseString];
}

/**
 *  字符串转字典
 *
 *  @param dictStr 字符串
 *
 *  @return 字典
 */
- (NSDictionary *)stringToDict:(NSString *)dictStr
{
    if (dictStr == nil) {
        return nil;
    }
    
    NSData * jsonData = [dictStr dataUsingEncoding:NSUTF8StringEncoding];
    
    NSError * err;
    
    NSDictionary * dict = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&err];
    
    
    if(err) {
        
        NSLog(@"json解析失败:%@",err);
        
        return nil;
        
    }
    
    return dict;
    
}
2.获取本地版本号,进行版本号比较

|审核时|上线后
----------|----------|------------
用户版本号 |1.4.0.12345|1.4.0.12345
Xcode开发版本号|1.4.1.12345|1.4.1.12345
AppStore版本号|1.4.0.12345|1.4.1.12345

  • 注意此处综合考虑各种情况,应该将版本号的每一位分别比较大小

typedef enum : NSUInteger {
    LocolVersionToAppStoreVersionEqual = 0,//本地等于appStore版本号
    LocolVersionToAppStoreVersionLarge = 1,//本地大于appStore版本号
    LocolVersionToAppStoreVersionSmall = 2,//本地小于appStore版本号
} CompareVersionType;

@interface ViewController ()<UITableViewDataSource,UITableViewDelegate>

@property (nonatomic, weak) UITableView * table;

@property (nonatomic, weak) NSArray * dataArray;
/**
 *  appStore版本号
 */
@property (nonatomic, copy) NSString * appStoreVersion;
/**
 *  本地版本号
 */
@property (nonatomic, copy) NSString * localVersion;
/**
 *  appStore下载链接
 */
@property (nonatomic, copy) NSString * urlStr;

/**
 *  本地版本号与appStore版本号的大小关系
 */
@property (nonatomic, assign) CompareVersionType type;
@end

/**
 *  界面是否显示版本更新cell
 *
 *  @return Yes:显示
 */
- (BOOL)isShowUpdate
{
    //获取Appstore中信息
    AppDelegate * app = (AppDelegate *)[UIApplication sharedApplication].delegate;
    
    NSDictionary * dict = app.appDict;
    
    
    NSArray * results = dict[@"results"];
    
    //获取版本号与对应的下载链接
    for (NSDictionary * dict in results) {
        self.appStoreVersion = dict[@"version"];
        
        self.urlStr = dict[@"trackViewUrl"];
        
    }
    
    //获取本地版本号
    self.localVersion = [[NSBundle mainBundle]infoDictionary][@"CFBundleVersion"];
    
    NSLog(@"appVersion %@ localVersion %@ ",self.appStoreVersion ,self.localVersion );
    
//获取本地版本号
    self.localVersion = [[NSBundle mainBundle]infoDictionary][@"CFBundleVersion"];

    
    self.type = [self checkVersion:self.localVersion isNewThanVersion:self.appStoreVersion];
    
    
    return ! (self.type == LocolVersionToAppStoreVersionLarge);
}

/**
 *  比较版本号的大小
 *
 *  @param localVersion 当前版本号
 *  @param appSroreVersion appStore版本号
 *
 *  @return appStore版本号与当前版本号大小关系
 
 *   当前版本号(用户为用户版本号,审核为Xcode开发版本号)
     appStore版本号是 大于或等于 当前版本号 显示更新
 */
- (CompareVersionType)checkVersion:(NSString *)localVersion isNewThanVersion:(NSString *)appSroreVersion{
    NSArray * locol = [localVersion componentsSeparatedByString:@"."];
    NSArray * appStore = [appSroreVersion componentsSeparatedByString:@"."];
    
    for (NSUInteger i = 0; i<locol.count; i++) {
        NSInteger locolV = [[locol objectAtIndex:i] integerValue];
        NSInteger appStoreV = appStore.count > i ? [[appStore objectAtIndex:i] integerValue] : 0;
        if (locolV > appStoreV) {
            return LocolVersionToAppStoreVersionLarge;
        }
        else if (locolV < appStoreV) {
            return LocolVersionToAppStoreVersionSmall;
        }
        
        if(i == locol.count - 1)
        {
            if (locolV == appStoreV) {
                return LocolVersionToAppStoreVersionEqual;
            }
        }
    }
    return NO;
}
3.进行相关处理(更新的隐藏于显示、更新的提醒等)
- (NSArray *)dataArray
{
    if (_dataArray == nil) {
        if([self isShowUpdate])
        {
            _dataArray = [NSArray arrayWithObjects:@"版本更新", @"清理缓存",@"关于我们", nil];
        }
        else
        {
            _dataArray = [NSArray arrayWithObjects: @"清理缓存",@"关于我们", nil];

        }
    }
    return _dataArray;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([self isShowUpdate]) {
        switch (indexPath.section) {
            case 0:
            {
                //版本更新
                NSString * message = nil;
                
                if ( self.type == LocolVersionToAppStoreVersionEqual) {
                    //当前是最新版本
                    NSLog(@"当前是最新版本");
                    message = @"当前是最新版本";
                    
                }
                else if (self.type == LocolVersionToAppStoreVersionSmall)
                {
                    NSLog(@"更新版本");
                    message = [NSString stringWithFormat:@"请点击更新最新版本:%@",self.appStoreVersion];
                    
                }
                
                
                if (![message isEqualToString:@"当前是最新版本"]) {
                    
                    UIAlertController * alert = [UIAlertController alertControllerWithTitle:@"提示" message:message preferredStyle:UIAlertControllerStyleAlert];
                    
                    
                    [alert addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil]];
                    
                    [alert addAction:[UIAlertAction actionWithTitle:@"更新" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
                        
                        
                        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:self.urlStr]];
                        
                    }]];
                    
                    [self presentViewController:alert animated:YES completion:nil];
                    
                }
                else
                {
                    [SVProgressHUD showSuccessWithStatus:message];                }
  
            }
                break;
                     default:
                break;
        }
    }
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    
}
版本更新 最新版本

示例代码地址

上一篇下一篇

猜你喜欢

热点阅读