YCIVersion 0.1.0

YCIVersion 0.1.0

yanchen-ing 维护。



  • yanchen

YCIVersion

Version License Platform

由于本地持久化存储数据,需要进行版本管理组件或项目。

特性

  • 支持链式版本迁移操作管理,灵活添加、移除、修改版本操作
  • 可用于引导弹窗、一次性操作等
  • 支持针对特定版本操作,每次升级版本都执行
  • 默认使用 UserDefaults 存储组件版本,存储策略可自定义
  • 支持一些如 isFirstInstall, currentAppVersion 等便捷查询

示例

迁移

swift

    func migrating() {
        
        let startOperation = V2Migration()
        
        YCIVersion.VersionOperation.start(exampleIdentifer, version: 3, operation: startOperation)
        
    }

objective-c

- (void)migrating{
    
    VersionOperation *startOperation = [[V1Creation alloc] init];
    
    [VersionOperation start:@"OC_example" version:3 operation:startOperation];
    
}

使用需求

安装

source 'http://git.sogou-inc.com/YCIios/YCISpecs.git'
pod "YCIVersion"

使用

1. 继承 VersionOperation,示例:

// 引导弹层
class V2Guide: VersionOperation { 
    
    @objc public var vc: UIViewController?
    
    /// 通过闭包获取信息
    @objc public var vcDescription: (() -> String)?
    
    override init() {
        
        super.init()
        
        name = "v2 引导页"
        toVersion = 300  // 只要版本号小于300,则每次升级都执行操作
        
    }
    
    override func operate() throws {
        
        print("引导弹窗")
        
        let message = vcDescription?() ?? "这是个引导弹窗"
        
        let alert = UIAlertController.init(title: "V2", message: message, preferredStyle: .alert)
        
        alert.addAction(UIAlertAction(title: "取消", style: .cancel, handler: nil))
        
        vc?.present(alert, animated: true, completion: nil)
        
    }
    
//    override func handleError(_ error: Error) -> Bool {
//
//        print("处理异常:error" + error.localizedDescription)
//
//        return true  // 错误无影响,可继续执行
//
//        //        return false // 终止后续执行
//    }
    

}

2. 主应用启动时,启动组件,进行部分初始化操作。若在组件内,则不需要启动,在主应用内启动即可。主要用于记录首次安装版本号。

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        

        YCIVersionManager.update()
        
        return true
    }

3. 在合适的位置启动操作链

YCIVersion.VersionOperation.start(exampleIdentifer, version: 3, operation: V2Migration())

原理

架构图

版本操作流程

解答

升级操作失败,如何处理?

升级失败表示本地持久化文件无法满足当前.ipa 运行条件,因此调用 handleError 由使用方处理,不做回滚或其他操作

存储使用方是否可以自定义?

使用方可以通过继承Storage,并重写来实现,而在启动迁移前更改YCIVersion.Storage.TrueWorkerType可以修改全局唯一的存储方案,但建议不要修改。

如何作为弹窗使用?

一个单独的Operation可以独立使用。根据需要继承并实现VersionOperation,在需要的VC中创建并赋属性,使其在Operate方法中可以访问到VC中的属性。通过闭包的方式,实现一些Operation所需的回调。

本地没有任何记录,如何判断是否执行?

本地没有记录可以分为两种情况:

  • 首次安装

  • 由以前版本升级

首次安装的情况,打开比例极低,如果增加过多的判断,会增加复杂度,同时在启动时会增加不必要的判断。因此,这里如果无本地版本记录,则默认版本为0,需要执行迁移链中所有操作。这对迁移链的操作提出了更高要求,需要在操作前先判断本地条件是否满足。

如何判断首次安装

应用并集成YCIVersion后,首次安装时会记录本地的Build号。之后可以通过检查是否存在Build号来判断是否为首次安装。

如果某项操作每次版本更新都需要执行,应该如何操作

VersionOperation.toVersion表示小于等于该版本都会执行。因此,只需要将toVersion的值设为VersionNumberMAX即可。

如果本地版本小于迁移链最早版本

此时程序已经安装,但本地原数据无法迁移到新版本,必然会导致运行问题。因此,在升级前应检查要升级的版本是否能够迁移,并且迁移链应该包含从0到最新版的创建操作,否则在首次安装时,将无法维护本地持久化所需文件。

是否支持版本回滚操作,版本降级

程序已升级,本地持久化数据如果升级失败,将不利于程序运行。如有需要回退,则意味着需要有备份,并在执行完成后再统一清除备份,当前轻量级中,暂不考虑。

本模块需要

本模块也使用版本链管理,实现 VersionOperation 协议。
使用时,需先执行 YCIVersion.Starter.update() 对本模块进行升级操作

首次执行时,将首次安装时的版本 build 记入 BZV_FirstInstall

作者

YanChen-ing, yanchen