YCIVersion
由于本地持久化存储数据,需要进行版本管理组件或项目。
特性
- 支持链式版本迁移操作管理,灵活添加、移除、修改版本操作
- 可用于引导弹窗、一次性操作等
- 支持针对特定版本操作,每次升级版本都执行
- 默认使用 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