iPhone私人API编译

自从几个小时以来,我正在通过整个互联网进行search,而我找不到所需的信息。 我想乱私人apis,看看有什么可能的,等等,但我什至不能编译的东西。

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

  • 我必须转储标题吗? 因为我下载了一个样本,在那里加载了API
char *framework = "/System/Library/PrivateFrameworks/..."; dlopen(...); 

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

  • 如果我导入私有API,如何编译Xcode? 我必须添加其他链接标志吗? (因为我读了两个不同的意见),我添加了一个私人框架,并创build了一个新的文件夹“头”,并把所有的头文件放在那里,所以框架在Xcode中正确显示。 我是否必须导入整个.framework,或者只从我想要使用的框架中导入头文件? 在我导入框架后,我得到了20多个错误,未知的types名称,还有更多。

最后,我已经阅读了权利(这在iOS 7中似乎是新的)。 我如何使用这些权利以及何时使用这些权利?

有人可以请input几行作为例子吗?

背景

为了在任何框架中使用方法,您可以select静态或dynamic引用这些框架。 我在你的问题中没有看到任何暗示你需要使用dynamic链接的东西,所以我要避免这种情况(对于初学者来说,这稍微复杂一点)。 (&ddagger)

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

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

生成头文件

可能更普遍的是,你必须自己生成头。 如果你知道你需要哪个头文件,经常可以在别人的github账号下find它。 如果不是的话,你需要一个像class-dump或者class-dump-z这样的工具 。 在私有框架上运行类转储工具,在Mac上find它:

 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/并find大量倾倒的头文件。 将您需要的标题复制(仅)到您的Xcode iOS项目目录中。 然后,从Xcode内部右键单击Project Navigator视图中的源文件夹,select“将文件添加到<Project Name> …” 。 select需要包含在项目中的转储的头文件。

链接

为了成功链接到API,您还需要将框架添加到您的Xcode构build阶段。 从您的项目目标设置中,select构build阶段,然后链接二进制与库 。 您通常从iOS SDK提供的默认列表中select一个公共框架。 但是,您也可以select浏览您的Mac以获得第三方框架或私有框架。 对于私人框架,你只需要导航到像这样的文件夹位置

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

然后select*.framework目录。

然后,只需使用API​​就可以使用任何公共/私有API。 #import头文件,调用API,实例化类等

这个代码的使用:

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

是试图dynamic地打开一个私人框架。 如果你在编译时知道你想要使用哪个框架,并且让它存在于你的Mac上让Xcode链接,那就没有必要了。

权益

权利对于iOS 7来说并不陌生。它们已经存在了相当长的一段时间,并且是iOS用来防止未经授权使用某些私有API的一种技术。 iOS会检查您的应用程序是否已被授予特定的授权(如果没有),并且如果它没有该授权,则调用受保护的API将会失败(通常是悄无声息 ,尽pipe有时会在控制台日志中看到一条消息)。

在这里看到一个授予你的(越狱)应用权利的例子 。


(&ddagger;)更新: iOS 9.3对私有API,静态链接和dynamic链接进行了一些更改。 请参阅这里堆栈溢出问题在这里更多 。