iOS运行时以编程方式获取.xcframework文件路径
获取已加载但无法通过常规方式找到的XCFramework路径
方法1:遍历dyld加载的所有镜像文件
利用dyld提供的API,遍历当前进程中所有已加载的镜像,通过匹配库名称定位路径:
#include <mach-o/dyld.h> NSString *findXCFrameworkPath(NSString *libraryName) { uint32_t imageCount = _dyld_get_image_count(); for (uint32_t i = 0; i < imageCount; i++) { const char *imagePath = _dyld_get_image_name(i); NSString *path = [NSString stringWithUTF8String:imagePath]; if ([path containsString:libraryName]) { return path; } } return nil; } // 调用示例:替换为你的XCFramework核心名称(比如"MySDK.xcframework"中的"MySDK") NSString *targetPath = findXCFrameworkPath(@"MySDK");
方法2:通过框架内的类反向查找路径
如果你知道框架中的某个类,可以通过类的方法实现地址,结合dladdr获取所在库的路径:
#include <dlfcn.h> #include <objc/runtime.h> NSString *pathForFrameworkClass(Class targetClass) { Method sampleMethod = class_getInstanceMethod(targetClass, @selector(init)); if (!sampleMethod) return nil; IMP methodImp = method_getImplementation(sampleMethod); Dl_info info; if (dladdr(methodImp, &info) && info.dli_fname) { return [NSString stringWithUTF8String:info.dli_fname]; } return nil; } // 调用示例:替换为框架内的实际类 NSString *targetPath = pathForFrameworkClass([MySDKCoreClass class]);
原因说明
这种情况通常是因为XCFramework被静态链接,或是作为嵌入式动态库但未被纳入主Bundle的管理列表,导致常规的Bundle、allFrameworks等API无法检测到它。但只要库已被加载,dyld就会在进程中维护它的镜像信息,通过上述底层API就能直接获取路径。
内容的提问来源于stack exchange,提问作者Gil Sand
相关产品推荐
相关产品推荐

