gpt4 book ai didi

ios - 如何从包中获取类

转载 作者:可可西里 更新时间:2023-11-01 06:23:29 29 4
gpt4 key购买 nike

按照这里的解释:

https://github.com/nst/iOS-Runtime-Headers

我正在尝试获取 bundle TelephonyUtilities.framework 中的 TUPhoneLogger 类。但是,调试器总是显示“错误:未知类”

我有两种不同的方法:

第一种方法:

NSBundle* b = [NSBundle bundleWithPath:@"/System/Library/PrivateFrameworks/TelephonyUtilities.framework"];
BOOL success = [b load];
NSLog(@"%@", [b definedClasses_dd]);

注意:我创建了一个@interface NSBundle (DDAdditions) 扩展名:

- (NSArray *)definedClasses_dd {
NSMutableArray *array = [NSMutableArray array];
int numberOfClasses = objc_getClassList(NULL, 0);
Class *classes = calloc(sizeof(Class), numberOfClasses);
numberOfClasses = objc_getClassList(classes, numberOfClasses);
for (int i = 0; i < numberOfClasses; ++i) {
Class c = classes[i];
if ([NSBundle bundleForClass:c] == self) {
[array addObject:c];
const char* nameOfClass = class_getName(c);
NSString* classString = [NSString stringWithUTF8String:nameOfClass];
if([classString isEqualToString:@"TUPhoneLogger"]) {
NSLog(@"Found it! TUPhoneLogger");
id test= [[c alloc] init];
NSLog(@"test: %@", test);
}
}
}
free(classes);

第二种方法:

NSBundle* b = [NSBundle bundleWithPath:@"/System/Library/PrivateFrameworks/TelephonyUtilities.framework"];
Class telephonyClass = [b classNamed:@"TUPhoneLogger"];
id test= [[telephonyClass alloc] init];
NSLog(@"%@", test);

在调试器中:

enter image description here

最佳答案

+1 给 Victor,因为我认为将框架作为 Build Phase 库包含在您的项目中会更简单。私有(private)框架位于 PrivateFrameworks SDK 子目录下,但除此之外,它的工作方式与公共(public)框架类似(Victor 的回答中描述了差异)。

我将提供另一种有效的技术,如果您确实需要动态加载:

#include <dlfcn.h>
#import <objc/runtime.h>

然后

void* handle = dlopen("/System/Library/PrivateFrameworks/TelephonyUtilities.framework/TelephonyUtilities", RTLD_NOW);
Class c = NSClassFromString(@"TUPhoneLogger");
id instance = [[c alloc] init];
dlclose(handle);

我想 dlopen() 的一个好处是您不必记住调用 load,这让您进入了第二个示例。一个缺点是你应该在之后调用 dlclose()

注意 dlopen()NSBundle bundleWithPath: 的路径略有不同:(文件与目录)

注意++:此代码无法在模拟器中运行,因为模拟器可能缺少该框架(没有真正的手机功能)


更新

在 iOS 9.3 中,Apple 从 SDK 中删除了私有(private)框架。因此,从那时起,如果框架不是公共(public) iOS 框架之一,实际上通常情况下您需要使用这种动态技术。 See this answer for more

关于ios - 如何从包中获取类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15379397/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com