iPhone 私有 API 编译

7

我已经搜索了整个互联网几个小时,但是我找不到我要的信息。我想要尝试玩弄私有API,看看有什么可能性等等,但我甚至连编译都做不到。

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

  • 我需要转储头文件吗?因为我下载了一个示例,其中API是用这种方式加载的
char *framework = "/System/Library/PrivateFrameworks/...";
dlopen(...);

我希望尽可能使用objc-syntax而不是使用C(如上所述),如果有机会的话。
  • 如果我导入私有API,如何使Xcode编译?我需要添加其他链接标志吗? (因为我读到了两种不同的意见)
  • 我添加了一个私有框架并创建了一个新文件夹“ Headers”,并将所有头文件放在其中,这样框架就能在Xcode中正确显示。 我需要导入整个.framework还是只需要从我想要使用的框架中导入头文件?导入框架后,我收到20多个错误,未知类型名称等。

最后,我已经阅读关于entitlements的信息(似乎是iOS 7中的新功能)。 如何使用这些entitlements,何时使用它们?

请问可以提供一些示例代码吗?


什么是私有API?你是指存在于系统中但不公开的API吗?还是指像Facebook SDK这样可以下载的第三方API? - Jason
1
我的意思是存在但不公开的API,例如Apple80211、MusicLibrary.framework等。 - Max Ka
http://stackoverflow.com/questions/12986849/accessing-private-ios-apis-how-to?rq=1 - Jason
抱歉,但这并没有帮助。 有人能否明确告诉我需要做什么?
  1. 导入所需的头文件
  2. 在设置中将XY设置为链接标志
  3. 等等。
- Max Ka
1个回答

17

背景

为了在任何框架中使用方法,您可以选择静态或动态引用这些框架。根据您的问题,我没有看到任何需要使用动态链接的迹象,因此我将避免这样做(对于初学者来说稍微复杂一些)。(‡)

要在框架中静态引用API,请导入相关标题,然后配置Xcode项目以链接到该框架。这两个步骤对于私有 API 仅有轻微变化。

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

生成头文件

但更常见的情况是,您必须自己生成头文件。 如果您知道所需的标题,通常可以在某人的GitHub帐户下在线找到它们。如果没有,您需要像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 Name> …”。选择需要包含在项目中的已转储头文件。
链接
为了成功地针对API进行链接,您还需要将框架添加到Xcode构建阶段。从您的项目“目标”设置中,选择“构建阶段”,然后选择“链接二进制文件库”。通常,您可以从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将失败(通常情况下是静默地,但有时您会在Console日志中看到一条消息)。

在此处查看授予您(越狱)应用程序授权的示例


(‡) 更新:iOS 9.3在私有API和静态与动态链接方面带来了一些变化。请在此处查看此Stack Overflow问题以获取更多信息


太棒了,谢谢你的回答!我之前没有理解的地方就是链接过程。太好了! - Max Ka
这对iOS 9+有任何改变吗?实际上,我在SDK/System/Library目录中看不到“PrivateFrameworks”目录。模拟器的SDK包含PrivateFrameworks,但是当包含它(并在模拟器上运行)时,我仍然会收到一个“ld”错误,指出找不到该框架。 - Kevin
@Kevin,是的,不幸的是,在iOS 9.3中发生了变化。请参见我在这里对最近问题的回答:https://dev59.com/PFoU5IYBdhLWcg3w35vN#37001091。 - Nate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接