从零开始设计搭建ios App框架(十五)

版本更新检测


现在大部分应用都有版本更新检测,当有新版本时弹出提示用户更新,有时还需要强制更新(很少用,影响体验)。
更新之后,最好清理本地的缓存数据,因为新版本有可能对某些数据对象结构有更改,上一版本缓存的数据结构不能满足。

构造一个版本信息的类

typedef NS_ENUM(NSInteger, PGVersionUpdateType) {
    VERION_UPDATE_TYPE_NONE = 1,//没有更新
    VERION_UPDATE_TYPE_OPTIONAL,//可选更新
    VERION_UPDATE_TYPE_FORCE,//强制更新
};

@interface PGVersionObject : PGBaseObj

/*
 版本号
 */
@property(nonatomic, strong)NSString *szVersion;
/*
 更新地址
 */
@property(nonatomic, strong)NSString *szUrl;
/*
 更新内容简述
 */
@property(nonatomic, strong)NSString *szDesc;
/*
 0:没有更新,1:有更新,2:强制更新
 */
@property(nonatomic, assign)PGVersionUpdateType updateType;

@end

版本检测,弹框提示我都放到个类里面处理了:

@interface PGVersionManager : NSObject

/*
 检测版本更新
 */
+ (void)checkVersion;

@end
#define VERSION_RETRY_COUNT 5

@interface PGVersionManager ()<PGApiDelegate>
/*
 上次检测更新的时间
 */
@property(nonatomic, strong)NSDate *lastCheckDate;
/*
 是否有强制更新
 */
@property(nonatomic, assign)BOOL needUpdate;
/*
 检测版本失败重试次数
 */
@property(nonatomic, assign)NSInteger nRetryCount;

@end

@implementation PGVersionManager

+ (PGVersionManager *)shareInstance
{
    static PGVersionManager *s_versionManager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        s_versionManager = [[PGVersionManager alloc] init];
    });
    return s_versionManager;
}

- (id)init
{
    if(self = [super init])
    {
        self.needUpdate = NO;
        self.lastCheckDate = nil;
        self.nRetryCount = VERSION_RETRY_COUNT;
    }
    return self;
}

+ (void)checkVersion
{
    [PGVersionManager shareInstance].nRetryCount = VERSION_RETRY_COUNT;
    if([PGVersionManager shareInstance].needUpdate ||
       [PGVersionManager shareInstance].lastCheckDate == nil ||
       [NSDate numDayFromDate:[PGVersionManager shareInstance].lastCheckDate toDate:[NSDate date]] >= 1)
    {
        [[PGVersionManager shareInstance] getVersionInfo];
    }
}

- (void)getVersionInfo
{
    NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
    [PGRequestManager startPostClient:API_TYPE_VERSION_CHECK param:@{@"app_version":version} target:self extendParam:nil];
}

#pragma mark - PGApiDelegate
- (void)dataRequestFinish:(PGResultObject *)resultObj apiType:(PGApiType)apiType
{
    if(resultObj.nCode == 0)
    {
        self.lastCheckDate = [NSDate date];
        PGVersionObject *versionObj = (PGVersionObject *)resultObj.dataObject;
        
        if(versionObj.updateType == VERION_UPDATE_TYPE_OPTIONAL)
        {
            [[PGApp appRootController] showAskAlertTitle:[NSString stringWithFormat:@"发现新版本:%@",versionObj.szVersion] message:versionObj.szDesc tag:1000 action:^(NSInteger alertTag, NSInteger actionIndex) {
                if(actionIndex == 0) {
                    dispatch_async(dispatch_get_main_queue(), ^{
                        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:versionObj.szUrl]];
                    });
                }
            } cancelActionTitle:@"更新" otherActionsTitles:@"取消",nil];
        }
        else if(versionObj.updateType == VERION_UPDATE_TYPE_FORCE)
        {
            [[PGApp appRootController] showAskAlertTitle:[NSString stringWithFormat:@"发现新版本:%@",versionObj.szVersion] message:versionObj.szDesc tag:1000 action:^(NSInteger alertTag, NSInteger actionIndex) {
                if(actionIndex == 0) {
                    dispatch_async(dispatch_get_main_queue(), ^{
                        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:versionObj.szUrl]];
                    });
                }
            } cancelActionTitle:@"更新" otherActionsTitles:nil];
        }
    }
    else
    {
        //失败重试
        if(self.nRetryCount > 0)
        {
            self.nRetryCount -= 1;
            [self getVersionInfo];
        }
    }
}

@end

更新完成后最好清理本地缓存,这时只需在PGCacheManager里面添加一函数方法就可以了。

+ (void)clearCacheDataForNewVersion
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    int bClear = [[defaults stringForKey:@"bCacheClear"] intValue];
    NSInteger oldVersion = [defaults integerForKey:@"currentVersion"];
    NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
    NSInteger nVersion = [version integerValue];
    if(bClear == 0 || nVersion > oldVersion)
    {
        [PGCacheManager clearCacheData:nil];
        
        [defaults setObject:@"1" forKey:@"bCacheClear"];
        [defaults setInteger:nVersion forKey:@"currentVersion"];
        [defaults synchronize];
    }
}

在AppDelegate里面调用

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor = [UIColor whiteColor];
    
    //清除缓存
    [PGCacheManager clearCacheDataForNewVersion];
    
    ......
    
    return YES;
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
    /*
     检测版本更新 
     */
    [PGVersionManager checkVersion];
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,139评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,103评论 4 62
  • 是夜拂晓,孟家军发起进攻,好在常年驻扎凉城,习惯这天气变化,比起敌军,孟家军虽少了近一万人马,也是不遑多让,还隐隐...
    newgniq阅读 562评论 0 0
  • 人只会活一次, 但要是活得精彩,一次足矣。 我不想长大,可是必须要面对长大, 一个人更要照顾好自己, 天冷了给自己...
    妮说呢阅读 272评论 0 0
  • 李小姐和张先生都在成都工作,婆婆因为一直不习惯城市的生活所以一个人在农村生活,夫妻俩也经常回去看望,每次回家看...
    百米一舒阅读 356评论 0 1