我如何使用这个私人 API?
How do I use this private API?
我找到了 class PSCellularDataSettingsDetail
及其方法 +(void)setEnabled:(BOOL)enabled;
,我认为它可以满足我的需求,即访问移动数据设置。
我通过使用class-dump-z
打开编译好的Preferences.framework
找到了这个方法。
现在我找到 this answer 并尝试以这种方式访问 class 和方法,但是 class 也是私有的。我怎样才能打开这个 class 到 Xcode?
你试过调用performSelector吗?这通常是调用私有方法的技巧。请记住,在 Objective-C 中使方法私有的所有原因是它没有在 h 文件中公布。但是,如果您向对象发送消息并且对象可以响应该消息,则无论头文件中的内容如何。
如果它是一个像 +(void)setEnabled
这样的 class 方法,你只需调用 [MyClass performSelector(@selector(myMethod)]
,如果它是一个实例方法,你将在一个变量上调用它,该变量是 class:
MyClass *c = [[MyClass alloc] init];
[c performSelector: @selector(myMethod)]
当您需要传递参数时会变得很棘手,就像在这种情况下一样,因为 performSelector 可以传递参数的唯一方法是它们是对象而不是基元。您也可以考虑使用 objc_msgSend。
网上有大量资料解释这两者的工作原理。无论哪种方式,尝试调用私有方法都很麻烦,而且风险很大。
我找到了 class PSCellularDataSettingsDetail
及其方法 +(void)setEnabled:(BOOL)enabled;
,我认为它可以满足我的需求,即访问移动数据设置。
我通过使用class-dump-z
打开编译好的Preferences.framework
找到了这个方法。
现在我找到 this answer 并尝试以这种方式访问 class 和方法,但是 class 也是私有的。我怎样才能打开这个 class 到 Xcode?
你试过调用performSelector吗?这通常是调用私有方法的技巧。请记住,在 Objective-C 中使方法私有的所有原因是它没有在 h 文件中公布。但是,如果您向对象发送消息并且对象可以响应该消息,则无论头文件中的内容如何。
如果它是一个像 +(void)setEnabled
这样的 class 方法,你只需调用 [MyClass performSelector(@selector(myMethod)]
,如果它是一个实例方法,你将在一个变量上调用它,该变量是 class:
MyClass *c = [[MyClass alloc] init];
[c performSelector: @selector(myMethod)]
当您需要传递参数时会变得很棘手,就像在这种情况下一样,因为 performSelector 可以传递参数的唯一方法是它们是对象而不是基元。您也可以考虑使用 objc_msgSend。
网上有大量资料解释这两者的工作原理。无论哪种方式,尝试调用私有方法都很麻烦,而且风险很大。