【转】查找应用中的Private 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 列表

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

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

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

  • 怎么用?很简单,你把工程编译好,然后直接将 .app 文件夹整个拖进 AppScanner 窗口里。
  • 免费的么?几乎是免费的,虽然收费(也才 $2.99 ),但是头 14 天免费。
  • 是否有人维护?有,而且只要你愿意出 $2.99 支持他们维护。他们还会继续开发下去。

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

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

时间: 2024-10-31 16:40:51

【转】查找应用中的Private API的相关文章

在VBA中使用Windows API

VBA是一种强大的编程语言,可用于自定义Microsoft Office解决方案.通过使用VBA处理一个或多个Office应用程序对象模型,可以容易地修改Office应用程序的功能或者能够使两个或多个Office应用程序协同工作以完成单个应用程序无法完成的任务.然而,使用VBA仅能控制操作系统的一小部分.Windows API提供了控制操作系统绝大多数方面的功能.下面,介绍在VBA中使用Windows API的一些知识. 理解APIs API只是一组函数,可用于处理组件.应用程序或操作系统.通常

Python 查找Twitter中最流行(转载最多)的10个Tweet

CODE: #!/usr/bin/python # -*- coding: utf-8 -*- ''' Created on 2014-7-4 @author: guaguastd @name: find_popular_retweets.py ''' # Finding the most popular retweets def popular_retweets(statuses): retweets = [ # Store out a tuple of these three values.

c++中的private/protect/public & virtual

private: 私有控制符.这类成员只能被本类中的成员函数和类的友元函数访问. protected: 受保护控制符.这类成员可以被本类中的成员函数和类的友元函数访问,也可以被派生类的成员函数和类的友元函数访问. public: 共有控制符.这类成员可以被本类中的成员函数和类的友元函数访问,也可以被类作用域内的其他函数引用. virtual: C++通过虚函数实现多态."无论发送消息的对象属于什么类,它们均发送具有同一形式的消息,对消息的处理方式可能随接手消息的对象而变"的处理方式被称

C#中调用Outlook API 发起会议

原文:C#中调用Outlook API 发起会议 在我上一篇博文中曾提到了 SharePoint 中调用传出电子邮件中的邮件服务器及地址发送邮件 但是,里面的方法只能用于发送普通电子邮件.如果要发起会议之类的特殊邮件的话,可以使用Outlook 自身的API. 创建项目后,为它添加.NET引用:“Microsoft.Office.Interop.Outlook"的引用,即可调用,需要注意的是,在添加的时候,注意一下OFFICE版本号. 在调用其API发起会议的过程中,遇到了一个问题: 创建完一个

Native Application 开发详解(直接在程序中调用 ntdll.dll 中的 Native API,有内存小、速度快、安全、API丰富等8大优点)

文章目录:                   1. 引子: 2. Native Application Demo 展示: 3. Native Application 简介: 4. Native Application 有何妙用: 5. MJ0011 关于 Native Application 的文章整理: 6. 互联网上其他关于 Native Application 的文章整理: 7. 小结: 1. 引子: 其实在好久以前就看了 MJ0011 翻译的那个<Native 应用程序详细>系列的文

解析、查找数组中重复出现的元素(Java)

 解析.查找数组中重复出现的元素,Java实现. <数据结构与算法分析:解析.查找数组中重复出现的元素> 问题描述:一个结构化数据,假设事先按照某种顺序排好序(比如升序)的一个数组中,无规则.重复出现若干次某个相同元素,形如有序数组data: data = {  "A", "A", "B", "C", "C", "D", "D" , "D&q

在Ubuntu手机平台中使用Camera API来录像

在前面的文章"如何在QML中使用camera API来拍照"中,我们介绍了如何使用Camera API来进行拍照.今天我们在这篇文章中来介绍如何使用Camera API来进行录像. 首先,还是和以前一样,我直接把自己的代码贴出来: main.qml import QtQuick 2.0 import Ubuntu.Components 1.1 import QtMultimedia 5.0 /*! \brief MainView with a Label and Button elem

如何在QML中使用camera API来拍照

在先前的例程中"如何使用Ubuntu手机平台中的照相机API来存储照片",我们已经展示了如何使用Item的属性来存储我们的照片.在这篇文章中,我们将使用Camera API来完成同样的功能. 我们来直接贴自己的代码: main.qml import QtQuick 2.0 import Ubuntu.Components 1.1 import QtMultimedia 5.0 /*! \brief MainView with a Label and Button elements. *

UWP中使用Composition API实现吸顶(2)

原文:UWP中使用Composition API实现吸顶(2) 在上一篇中我们讨论了不涉及Pivot的吸顶操作,但是一般来说,吸顶的部分都是Pivot的Header,所以在此我们将讨论关于Pivot多个Item关联同一个Header的情况. 老样子,先做一个简单的页面,页面有一个Grid当Header,一个去掉了头部的Pivot,Pivot内有三个ListView,ListView设置了和页面Header高度一致的空白Header. <Page x:Class="TestListViewH