【问题标题】:How do I use this private API?如何使用这个私有 API?
【发布时间】:2015-04-23 05:06:08
【问题描述】:

我找到了 PSCellularDataSettingsDetail 类及其方法 +(void)setEnabled:(BOOL)enabled;,我认为这将满足我的需求,即访问移动数据设置。

我通过使用class-dump-z打开编译后的Preferences.framework找到了这个方法。

现在我找到了this answer 并尝试以这种方式访问​​类和方法,但该类也是私有的。我怎样才能在 Xcode 上打开这个类?

【问题讨论】:

  • “类是私有的”——你的意思是它没有通过 Preferences.framework 的二进制符号表(即static)公开吗?因为那样你就无能为力了……
  • @TheParamagneticCroissant 当我尝试在我的 Xcode 项目中使用它时,它是不可见的,所以我猜这个类定义不在我项目中导入的任何框架中。如何在我的项目中导入这个私有框架?抱歉,我是新手。

标签: ios iphone-privateapi


【解决方案1】:

您是否尝试过调用 performSelector?这通常是调用私有方法的技巧。请记住,Objective-C 中使方法私有的所有原因是它没有在 h 文件中公布。但是,如果您向对象发送消息并且对象可以响应该消息,则无论头文件中的内容如何,​​它都会响应。

【讨论】:

  • 如何从名称中获取类以执行选择器呢?对不起,我是新手。
  • @vrwim NSClassFromString()objc_getClass() 等……
  • 如果它是一个像 +(void)setEnabled 这样的类方法,你只需调用 [MyClass performSelector(@selector(myMethod)] ,如果它是一个实例方法,你可以在一个变量上调用它类的实例
  • @TheParamagneticCroissant 如果我的班级不在任何可见的框架中?那我该怎么办?
  • @TheParamagneticCroissant 我从带有class-dump-z 的转储标头中获得了方法定义。现在我想用它,但我不知道怎么用。我尝试使用NSClassFromStringperformSelector,但这并没有做任何事情(字面意思)。然后我想看看这个类有没有方法,我用了this method。那是空的。那么有没有办法使用这种方法,还是受 iOS 保护?
【解决方案2】:

如果它是像+(void)setEnabled 这样的类方法,您只需调用[MyClass performSelector(@selector(myMethod)],如果它是实例方法,您可以在作为类实例的变量上调用它: MyClass *c = [[MyClass alloc] init];

[c performSelector: @selector(myMethod)]

当你需要传递参数时会变得很棘手,因为在这种情况下,因为 performSelector 可以传递参数的唯一方法是它们是对象而不是基元。您还可以考虑使用 objc_msgSend。

网上有很多东西解释了这两个是如何工作的。无论哪种方式,尝试调用私有方法都很麻烦,而且风险很大。

【讨论】:

  • 如果我的班级不在任何可见的框架中?那我该怎么办?
  • 在 Objective C 中所有私有的意思是标题是不可见的。如果没有标头,程序员将不知道实现中的内容,除非他们知道、猜测或使用反编译器来找出隐藏的魔法。如何找出隐藏部分内部的内容取决于您。一旦您知道其中有一个您想要调用的方法,您就可以使用 performSelector 或 objc_msgSend 来完成它。网上有很多关于如何做到这一点的资料。
猜你喜欢
  • 1970-01-01
  • 2011-02-19
  • 2011-12-27
  • 1970-01-01
  • 2015-02-13
  • 2023-03-08
相关资源
最近更新 更多