IOS Private API

一.基本知识

iPhone中的API除了公开的 API:Published API外(或者叫文档中记录的API:Documented API),还有两类API:私有API:Private API和未公开的API:UnPublished API(或者叫文档中未记录的API:Undocumented API)。其中私有API是指放在PrivateFrameworks框架中的API,未公开的API是指虽然放在Frameworks框架中,但是却没有在苹果的官方文档中有使用说明、代码介绍等记录的API。后两种API是有区别的,按苹果的说法,未公开的API是还不够成熟,可能还会变动的API,等完全成型了后会变成公开的API,但是目前不对其提供承诺,就是系统版本升级后可能会失效。而私有API是苹果明确不能使用的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函数。


三.附加说明

iPhone编程中一些非常精致好玩的API都包含在私有API或未公开的API中,虽然我们可以以这种方式使用这些非常好的API,但是这样做是存在一定风险的,首先为公开的API有变更的可能,这样在每个固件版本中,你的代码都有可能中断。同时,最大的问题是使用了私有API的程序是不能放在App Store上销售的。因此如果我们只是为了好玩体验iPhone中这些精彩的API,那没关系。如果是为了做出程序放在App Store上销售的,那就不要动私有API的主意了。

=====================================================================


class-dump-x 提取私有库里面的隐藏文件

class-dump

This is a command-line utility for examining the Objective-C runtime information stored in Mach-O files. It generates declarations for the classes, categories and protocols. This is the same information provided by using 'otool -ov', but presented as normal Objective-C declarations, so it is much more compact and readable.

Why use class-dump?

It's a great tool for the curious. You can look at the design of closed source applications, frameworks, and bundles. Watch the interfaces evolve between releases. Experiment with private frameworks, or see what private goodies are hiding in the AppKit. Learn about the plugin API lurking in Mail.app.

If you find class-dump useful, you can donate to help support its development. Thanks!

Download

Current version: 3.3.3 (Universal, 64 and 32 bit)
Requires Mac OS X 10.5 or later.

  • class-dump-3.3.3.dmg

  • class-dump-3.3.3.tar.gz

  • class-dump-3.3.3.tar.bz2

Changes - News

Contact

You can email questions and bug reports to me at [email protected], or nygard at gmail.com.

Usage

class-dump 3.3.3 (64 bit)
Usage: class-dump [options] <mach-o-file>

  where options are:
        -a             show instance variable offsets
        -A             show implementation addresses
        --arch <arch>  choose a specific architecture from a universal binary (ppc, ppc7400, ppc64, i386, x86_64, etc.)
        -C <regex>     only display classes matching regular expression
        -f <str>       find string in method name
        -H             generate header files in current directory, or directory specified with -o
        -I             sort classes, categories, and protocols by inheritance (overrides -s)
        -o <dir>       output directory used for -H
        -r             recursively expand frameworks and fixed VM shared libraries
        -s             sort classes and categories by name
        -S             sort methods by name
        -t             suppress header in output, for testing
        --list-arches  list the arches in the file, then exit
        --sdk-root     specify the SDK root path (full path, or 4.1, 4.0, 3.2, 10.6, 10.5, 3.1.3, 3.1.2, 3.1)

License

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

 

 

 class-dump -H  /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator2.1.sdk/System/Library/CoreServices/SpringBoard.app/SpringBoard 

     -o 

~/Desktop/SpringBoard

 

 

 

 

 

 

 

 

 

 

 

下载:http://ericasadun.com/HeaderDumpKit/

使用:

1 将下载好的 class-dump 放入usr/local/bin 下. 

   如果 ‘/usr/local/bin’ 不知道在哪里,可以在terminal 下输入 ‘open -a Finder /usr/local/bin’ 以便打开目录.

   记着 class-dump 要 使用 chmod 修改下执行权限.   例如:在usr/local/bin 对 class-dump 修改,可以这    样在terminal 切换到 usr/local/bin 目录下: chmod 777 class-dump .

2 将DumpFrameworks.pl 放入任意目录下.同样需要修改执行权限.

3. OK..现在所有的准备工作作好了. 我们在 terminal 的任意目录下 输入 : ./DumpFrameworks.pl

   等待...

   会有一个Heards 文件夹在你的主目录下. 里面包含了 Frmeworks 和 privateFrameworks 下所有的私有        API,尽情享用吧.!



================================================

 作为 Objective-C / Cocoa Touch 开发者,在经历了呕心沥血十月怀胎终于孕育出了一个代码包,然后踌躇满志准备提交给天杀的 Apple App Review Team  审核之时,别急,我们仍然需要诚惶诚恐的考虑一个问题,我们的代码里是否用到了 Private API ?

 

    什么是 Private API ?简而言之,就是这个 API 真实存在于 Cocoa Touch 中,但它又不是 Public API (有点绕吧…)。那什么是 Public API 呢?Public API 就是苹果通过 Cocoa Touch 向全世界第三方开发者公开的所有 API 。在哪可以查到 Public API ?在你的 Xcode 工程中就能查到。如这幅截图所示, Xcode 中所有 framework 的头文件都是我们可用肉眼查询的 Public API 列表。

 

    同此同时,民间也流传着一个非官方的 Private API 列表。(iphone-private-frameworks)

    于是你说,那问题不就解决了呗,只要我们洁身自好,保证自己的代码里只使用 Cocoa Touch 公布的 API ,我们就肯定不会惹上 Private API 啦。

    然而实际情况往往不是这样,当今世界,嗯嗯当今世界,App Store 的竞争越发激烈,每位开发者都希望自己的代码能站在前辈优秀开源代码的基础上高屋建瓴,而不是每新建一个工程就得自己花十天半个月一遍遍 reinvent the wheel 重造车轮。 随手举几个例子, ASIHTTPRequest 、JSON 、Facebook / Three20 、 SFHFKeychainUtils ,这几套知名开源代码包存在于许许多多优秀的 iOS 应用之中。其他名气稍小但是同样流传广泛的开源或者闭源代码包就更数不胜数了。作为开发者,我们不得不频繁面对这样一个问题,我们如何确保这些第三方的代 码报里,不存在 private API ?

    苹果提供了几种机器识别方法,比如 string 命令,比如 otool -ov 命令,但都不太好用。江湖上有人做了一套解决方案,名叫 AppScanner ,我老人家决定强烈推荐一下。( 貌似现在用xcode提交项目时会检测一遍是否有私有函数 )

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

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

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

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

 

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


你可能感兴趣的:(ios)