iPhone私有API编译

Max*_* Ka 7 xcode objective-c iphone-privateapi ios

我几个小时后在整个互联网上搜索,我找不到我正在寻找的信息.我想搞乱私人api,看看什么可能,等等,但我甚至无法编译.

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

  • 我必须转储标头吗?因为我下载了一个加载API的示例
char *framework = "/System/Library/PrivateFrameworks/...";
dlopen(...);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Nat*_*ate 16

背景

为了在任何框架中使用方法,您可以选择静态或动态地引用这些框架.我没有在你的问题中看到任何暗示你需要使用动态链接的东西,所以我会避免这种情况(初学者稍微复杂一些).(‡)

要静态引用框架中的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
Run Code Online (Sandbox Code Playgroud)

然后,进入~/Headers/7.0/MusicLibrary/并找到许多转储的头文件.将您需要的标题(仅)复制到Xcode iOS项目目录中.然后,从Xcode内部,右键单击Project Navigator视图中的源文件夹,选择"将文件添加到<Project Name> ...".选择您需要包含在项目中的转储头文件.

链接

为了成功链接API,您还需要将框架添加到Xcode构建阶段.从项目目标设置中,选择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/
Run Code Online (Sandbox Code Playgroud)

然后选择*.framework目录.

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

使用此代码:

char *framework = "/System/Library/PrivateFrameworks/...";
dlopen(...);
Run Code Online (Sandbox Code Playgroud)

动态打开私有框架的尝试.如果您在编译时知道要使用哪个框架,并且让它出现在Mac上以让Xcode链接,那就没有必要了.

权益

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

请参阅此处,了解授予您(越狱)应用程序权利的示例.


(‡)更新: iOS 9.3带来了一些私有API和静态与动态链接的变化.有关更多信息,请参阅此Stack Overflow问题.