我目前正在测试IOS的私有框架,目前我正在试图弄清楚如何启用Night Shift。作为参考,我正在使用的头文件位于here。
以下是我在下面使用的代码:
if (!(NSClassFromString(@"CCUINightShiftSectionController"))) {
dlopen("System/Library/PrivateFrameworks/ControlCenterUI.framework/ControlCenterUI", RTLD_LOCAL);
}
NSObject *manager = [NSClassFromString(@"CCUINightShiftSectionController") performSelector:NSSelectorFromString(@"_defaultFontTight")];
NSLog(@" ok= %@", manager);
}
从那个文件中,我得到_defaultFontTight
的数据在NSLog中打印就好了,但我正在努力的是如何获得实例函数?更具体地说,下面的所有内容都以-
符号开头。我只能从+
获取信息
符号
如果我用_defaultFontTight
切换enabled
,我会收到以下内容:
2017-07-02 18:09:35.382109-0400 Testing[809:96270] +[CCUINightShiftSectionController enabled]: unrecognized selector sent to class 0x1b7d5e420
非常感谢任何帮助!
修改
我在下面尝试了以下代码:
id myInstance =[NSClassFromString(@"CCUINightShiftSectionController") new];
[myInstance performSelector:NSSelectorFromString(@"enabled")];
对于某些框架,它获取实例变量值成功,而对于大多数框架,它只返回null
或错误,例如[core] "Error returned from daemon: Error Domain=com.apple.accounts Code=9 "(null)""
答案 0 :(得分:1)
如果您希望调用实例方法,请先尝试创建类的实例。例如。类似的东西:
id myInstance = [NSClassFromString(@"CCUINNightShiftSectionController") new];
... [myInstance someInstanceMethod] ...
HTH
答案 1 :(得分:1)
请注意,您使用的是私有框架(未记录),并且您引用它的头文件与iOS 10.2相对应,因此请确保在运行相同iOS版本的真实iPhone上进行测试。
对于您的来电,请尝试将其设为:
id myInstance = [NSClassFromString(@"CCUINightShiftSectionController") new];
if ([myInstance respondsToSelector:@selector(someInstanceMethod)]) {
[myInstance performSelector:@selector(someInstanceMethod)];
}
另外我注意到" CCUINightShiftSectionController"希望成为一个" UIViewController"子类,并且使用" new"它将无法很好地初始化。初始化程序,因此您可能会得到无效或错误的结果。
祝你好运。
答案 2 :(得分:1)
NSClassFromString
将返回nil
。他们有各种各样的方法,但现在dlopen("/System/Library/PrivateFrameworks/ControlCenterUI.framework/ControlCenterUI", RTLD_LAZY)
将是最简单的。通过这种方式,您可以从私有框架中调用任何您想要的内容。但这并不意味着它实际上会起作用。大多数私有API受权利保护,如果没有越狱,则无法运行。找出如何实际使用它们总是存在问题。你不能只是调用随机方法并期望它能够工作。您可能需要进行一些初始化。解决问题的唯一方法是反汇编调用这些方法的方法和应用程序。
答案 3 :(得分:1)
你可以这样做。使用您想要使用的方法声明协议。
@protocol TestPrivateMethods <NSObject>
- (BOOL)enabled;
@end
然后以这种方式做到:
id myInstance = [NSClassFromString(@"CCUINNightShiftSectionController") new];
NSLog(@"enabled %d", [(id<TestPrivateMethods>)myInstance enabled]);