在开发 Framework/Library 时,我们可能需要在 Demo 中测试不同版本的兼容性。如果每次都在 DemoBuild Phase 中切换 Framework/Library 的不同版本,是件很麻烦的事。这种情况下,我们就可以考虑在运行时动态加载 Framework/Library。方法很简单,就是使用 "dlfcn.h" 中的 dlopen 函数:

void *framework1Handle = dlopen("DynamicFramework1.framework/DynamicFramework1", RTLD_LAZY);

dlopen 有一个对应的方法 dlclose 用于卸载库,不过在 iOS 上,这个方法似乎不起作用。因此在同一次运行时,没有办法直接切换 Framework/Library 的不同版本,否则会出现如图的提示。实际使用哪个版本的代码无法确定。

objc[10662]: Class CASHello is implemented in both /private/var/containers/Bundle/Application/73362515-9CCA-47E0-B709-49BA437935DC/ios-dynamic-loading-framework.app/Frameworks/DynamicFramework1.framework/DynamicFramework1 (0x105680178) and /private/var/containers/Bundle/Application/73362515-9CCA-47E0-B709-49BA437935DC/ios-dynamic-loading-framework.app/Frameworks/DynamicFramework2.framework/DynamicFramework2 (0x105694178). One of the two will be used. Which one is undefined.

变通的方案是在启动时提供一个选择页面,选择在运行 App 时,使用哪个版本的 Framework/Library。如果要切换版本,再重新启动 App

dlopen 仅限于开发阶段使用。