从头文件中获取实例函数

时间:2017-07-02 22:16:45

标签: ios objective-c iphone-privateapi

我目前正在测试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)""

4 个答案:

答案 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)

  1. 确保私有标头与您设备的iOS版本匹配。否则,在尝试实例化不存在的类或调用它们未实现的方法时,可能会出错。
  2. 指向您要使用的框架的链接。你不能只分配一个类。您需要将应用程序链接到包含该类的框架。否则NSClassFromString将返回nil。他们有各种各样的方法,但现在dlopen("/System/Library/PrivateFrameworks/ControlCenterUI.framework/ControlCenterUI", RTLD_LAZY)将是最简单的。
  3. 通过这种方式,您可以从私有框架中调用任何您想要的内容。但这并不意味着它实际上会起作用。大多数私有API受权利保护,如果没有越狱,则无法运行。找出如何实际使用它们总是存在问题。你不能只是调用随机方法并期望它能够工作。您可能需要进行一些初始化。解决问题的唯一方法是反汇编调用这些方法的方法和应用程序。

答案 3 :(得分:1)

你可以这样做。使用您想要使用的方法声明协议。

@protocol TestPrivateMethods <NSObject>
- (BOOL)enabled;
@end

然后以这种方式做到:

id myInstance = [NSClassFromString(@"CCUINNightShiftSectionController") new];
NSLog(@"enabled %d", [(id<TestPrivateMethods>)myInstance enabled]);