关于苹果私有API的查找和使用

本文由2篇文章综合而成,原文地址为:

http://www.cocoachina.com/iphonedev/sdk/2011/0531/2906.html

http://bbs.51cto.com/archiver/tid-846159.html

一、关于苹果API:

1、Published API(公开的API):又称Documented API(文档中记录的API)。是苹果通过Cocoa Touch向全世界第三方开发者公开的所有API。

2、UnPublished API(未公开API):又称Undocumented API(文档中未记录的API),是指虽然放在Frameworks框架中,但是却没有在苹果的官方文档中有使用说明、代码介绍等记录的API。按苹果的说法,未公开的API是还不够成熟,可能还会变动的API,等完全成型了后会变成公开的API,但是目前不对其提供承诺,就是系统版本升级后可能会失效。

3、Private API(私有API):指的是SDK下的PrivateFrameWorks框架下的API,真实存在于Cocoa Touch中。私有API是苹果明确规定不能使用的API,一旦你的作品中有私有API,在上传AppStore的时候会100%被拒绝的。如果当作小范围软件的话就可以尝试一下,比如再Cydia上发布,91上发布,条件不会很苛刻的。

二、查找应用中的Private API

虽然我们能够保证自己的APP中只使用Cocoa Touch公布的API,没有使用私有API。但是我们如何确保这些第三方的代码报里,不存在private API?

苹果提供了几种机器识别方法,比如string命令,比如otool -ov命令,但都不太好用。江湖上有人做了一套解决方案,名叫AppScanner,我老人家决定强烈推荐一下。

怎么用?很简单,你把工程编译好,然后直接将.app文件夹整个拖进AppScanner窗口里。

免费的么?几乎是免费的,虽然收费(也才$2.99),但是头14天免费。

是否有人维护?有,而且只要你愿意出$2.99支持他们维护。他们还会继续开发下去。

这是一个实例的截屏,头两项API可疑度100%,说明它们就是来搞破坏的Private API。

最后插一则八卦,Facebook / Three20如雷贯耳,想必很多开发者都使用过。然而要命的事,在Three20的第一个版本中,就悄悄的藏着一条因为重名导致的假阳性Private API。虽然是假阳性,但那次事故仍然导致了所有使用那个版本Three20的app被惨拒。当然了,后来他们很快就修正了这个问题。

三、使用私有API:

1.导出生成私有API的头文件声明

使用私有或未公开的API,首先需要导出其对应的头文件,在头文件里有相关函数的声明。

工具:

class-dump

class-dump可以从编译后的Objective-C的二进制文件中提取对应的数据结构及函数等声明。

使用方法:

为了能在任意目录下使用class-dump命令,首先建议把class-dump文件拷贝到/user/local/bin/目录下,然后就可以在任意目录下执行以下命令:

class-dump

/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.0.sdk/System/Library/Frameworks/UIKit.framework/

>UIKit.h

以上命令就可以把iPhoneSimulator3.0.Sdk中Frameworks框架里的UIKit.Framework框架的数据结构及函数声明等给提取出来,并且放在UIKit.h这个文件中,之后你就可以在这个头文件中找你需要API的声明及其使用方式。以同样的方法,就可以挨个导出你需要那个框架中的API声明。

也可以用ericasadun写的DumpFrameworks.pl(文件中有部分注释说明)这个文件把私有框架下的API头文件全部提取出来。使用方法也是首先把class-dump文件拷贝到/user/local/bin/目录下,然后在任意一个目录下执行./DumpFrameworks.pl,然后就会在你的家目录下产生一个Headers文件夹,里面罗列了私有框架下的API头文件。

2.使用私有API

导出了私有API的头文件声明后,使用方法就比较简单了,首先在你的工程中包含进头文件,然后导入对应的框架,之后就可以类似提供了静态库的方式在我们的代码中使用这些私有API函数。

gitHub有老外整理:https://github.com/nst/iOS-Runtime-Headers

你可能感兴趣的:(关于苹果私有API的查找和使用)