在您的 iOS 或 Mac 应用中处理迁移的一个绝佳方法。提供了一个简单的 API,可以定义运行代码块以将您的应用从旧版本迁移到当前版本。
MFMigrationManager
要求指定版本号,遵循类似于 语义版本控制 的格式(例如:2.0.3
),但不对版本号中的实际组件数(2.0.3.9.6
将是一个有效的版本号)做限制。MFMigrationManager
在子迁移时也有自己的语法来引用版本号(见下文)。
使用 MFMigrationManager
简单易行。首先,获取迁移管理器实例
MFMigrationManager *manager = [MFMigrationManager migrationManager];
然后,指定在迁移应用到指定版本时需要运行的代码
[manager whenMigratingToVersion:@"1.1" run:^
{
// Peform operations to migrate your app from version 1.0 to version 1.1
[self migrateKeyedArchiveToCoreStorage];
}];
[manager whenMigratingToVersion:@"1.2.5" run:^
{
// Perform operations to migrate your app from versions 1.1 and later to 1.2.5
[self deleteCachedData];
}];
[manager whenMigratingToVersion:@"1.4" run:^
{
// Perform operations to migrate your app from versions 1.2.5 and later to 1.4
...
}];
此代码应每次应用启动时运行,以便迁移管理器可以完成其工作。
-whenMigratingToVersion:run:
时立即运行操作(如果适当)。例如,给定上面的迁移,如果用户上次启动的应用版本是 1.1
,而现在是启动版本 1.4
,则 MFMigrationManager
将运行迁移 1.2.5
和 1.4
。迁移 1.1
在这种情况下不会运行,因为它在以版本 1.1
启动应用时已经运行过。
有时运行迁移而不更改应用的版本号可能很有用。子迁移就是为此而设计的。
[manager whenMigratingToVersion:@"1.1" run:^
{
// Peform operations to migrate your app from version 1.0 to version 1.1
[self migrateKeyedArchiveToCoreStorage];
}];
[manager whenMigratingToVersion:@"1.1-1" run:^
{
// Perform operations to migrate your app from version 1.1 to sub-migration 1.1-1
}];
[manager whenMigratingToVersion:@"1.1-2" run:^
{
// Perform operations to migrate your app from sub-migration 1.1-1 to sub-migration 1.1-2
}];
当遇到子迁移时,MFMigrationManager
会运行它尚未遇到的当前应用版本之前或等于该版本的所有子迁移。在上面的例子中,如果应用版本是 1.1
,则将运行所有三个迁移。添加另一个版本号为 1.1-3
的迁移,然后重新启动应用,将运行该迁移,但不会运行其他迁移,因为它们已经被运行过。
如果您希望使用多个迁移管理器来处理应用中的迁移,您必须获取命名的迁移管理器。使用执行迁移的类的名字作为迁移管理器的名字可能是个好主意,但这取决于您自己。
NSString *className = NSStringFromClass([self class]);
MFMigrationManager *manager = [MFMigrationManager migrationManagerWithName:className];
之后,您可以完全独立地使用您的命名字符迁移管理器。定义不同版本号的迁移,运行影响您应用不同方面的代码块等。
如果将 CFBundleShortVersionString 视为当前版本默认行为不符合您的需求,您也可以手动提供当前版本
NSString *version = [self obtainCurrentVersionNumberInSomeWay];
MFMigrationManager *manager = [MFMigrationManager migrationManagerWithCurrentVersion:version];
Michaël Fortin ([email protected])
MFMigrationManager 在 MIT 许可证下可用。有关更多信息,请参阅 LICENSE 文件。