【问题标题】:iPhone private API compilingiPhone私有API编译
【发布时间】:2014-02-23 16:01:17
【问题描述】:

我已经在整个互联网上搜索了几个小时,但我找不到我正在寻找的信息。 我想弄乱私有api,看看有什么可能等等,但我什至无法编译。

所以我有几个非常基本的问题:

  • 我必须转储标题吗?因为我下载了一个示例,其中加载了 API
char *framework = "/System/Library/PrivateFrameworks/...";
dlopen(...);

如果有任何机会,我想使用 objc 语法(如果可能)而不是使用 C(如上所述)。

  • 如果我导入私有 API,如何使 Xcode 编译?我必须添加其他链接标志吗? (因为我读到了两种不同的观点) 我添加了一个私有框架并创建了一个新文件夹“Headers”并将所有头文件放在那里,因此该框架在 Xcode 中正确显示。我必须导入整个 .framework,还是只导入我想使用的框架中的标头?导入框架后,我收到 20 多个错误、未知类型名称等等。

最后,我阅读了有关权利的文章(这在 iOS 7 中似乎是新的)。我如何使用这些权利以及何时使用它们?

有人可以输入几行作为示例吗?

【问题讨论】:

  • 私有 API 是什么意思?您是指系统中存在但不公开的 API 吗?还是您的意思是可以下载的第三方 API,例如 Facebook SDK?
  • 我指的是存在但不公开的API,比如Apple80211、MusicLibrary.framework等
  • 对不起,但这无济于事。有人可以说我到底要做什么吗? 1. 导入你想要的头文件 2. 在设置中将XY设置为链接标志 3. etc. ?

标签: ios objective-c xcode iphone-privateapi


【解决方案1】:

背景

为了在 any 框架中使用方法,您可以选择静态或动态引用这些框架。我没有在您的问题中看到任何暗示您需要使用 dynamic 链接的内容,因此我将避免这种情况(对于初学者来说稍微复杂一些)。 (‡)

要在框架中静态引用 API,您需要导入相关的标头,然后配置您的 Xcode 项目以链接到框架。对于 Private API,这两个步骤略有变化

私有 API 通常不向您提供描述 API 的标头 (*.h)。我说“通常”,因为有时,iOS 上的私有 API 实际上在 Mac OS X 上是公开的,所以要使用它,只需将 OS X 版本的标头复制到项目中即可。

生成标题

不过,可能更常见的是您必须自己生成标头。如果你知道你需要哪个标题,通常你可以找到它发布在online under someone's github account。如果没有,您需要像class-dumpclass-dump-z 这样的工具。通过在您的 Mac 上找到它,在私有框架上运行类转储工具:

cd /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/System/Library/PrivateFrameworks/
class-dump -H -o ~/Headers/7.0/MusicLibrary/ MusicLibrary

然后,进入~/Headers/7.0/MusicLibrary/ 并找到大量转储的头文件。将(仅)您需要的标头复制到您的 Xcode iOS 项目目录中。然后,在 Xcode 中,右键单击 Project Navigator 视图中的源文件夹,选择 "Add files to ..."。选择需要包含在项目中的转储头文件。

链接

为了成功链接 API,您还需要将框架添加到 Xcode 构建阶段。从您的项目Target设置中,选择Build Phases,然后选择Link Binary with Libraries。您通常从 iOS SDK 为您提供的默认列表中选择一个公共框架。但是,您也可以选择在 Mac 上浏览第三方框架或私有框架。对于私有框架,您只需要导航到这样的文件夹位置

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/System/Library/PrivateFrameworks/

然后选择*.framework 目录。

然后,只需像使用任何公共/私有 API 一样使用 API。 #import头文件,调用API,实例化类等

这段代码的使用:

char *framework = "/System/Library/PrivateFrameworks/...";
dlopen(...);

试图动态地打开一个私有框架。如果您在编译时知道要使用哪个框架,并且将其显示在您的 Mac 上以让 Xcode 链接,那么这不是必需的。

权利

权利对 iOS 7 来说并不新鲜。它们已经存在了很长一段时间,并且是 iOS 用来防止未经授权使用某些私有 API 的一种技术。 iOS 将检查您的应用是否已被授予特定权利(按名称),如果它没有该权利,调用受保护的 API 将失败(通常静默,尽管有时您会在控制台日志中查看消息)。

See here for an example of granting your (jailbreak) app an entitlement.


(‡) 更新: iOS 9.3 在私有 API 以及静态与动态链接方面带来了一些变化。请see this Stack Overflow question here for more

【讨论】:

  • 很棒的答案,谢谢!我不明白的一点是链接过程。太好了!
  • 对于 iOS 9+,这些有什么改变吗?我实际上没有在 SDK/System/Library 目录中看到“PrivateFrameworks”目录。模拟器的 SDK 包含 PrivateFrameworks,但是当包含它(并在模拟器上运行)时,我仍然收到一个 ld 错误,即找不到框架
  • @Kevin,是的,不幸的是,它在 iOS 9.3 中发生了变化。请看我的response to this recent question here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
  • 2020-05-08
  • 1970-01-01
相关资源
最近更新 更多