首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

怎么移除Three20中private API

2012-08-25 
如何移除Three20中private APIThree20是一个非常有名的iPhone开发库,采用Objective-C语言。它是从Facebook

如何移除Three20中private API

Three20是一个非常有名的iPhone开发库,采用Objective-C语言。它是从Facebook iPhoneapp衍生而来的,所以很多Facebook app上使用的UI控件,像:TabBar,Launch view,Photoview等,都能从这个开发库中找到,且它使用的是Apache License(对商业友好),因此很多iPhone开发者都很喜欢使用它。

?

关于Three20的介绍及使用,我打算以后再详细说明,今天要说的是最近一件关于App Store开始拒绝那些使用Three20来开发的app,Apple的说法是:Three20中引用了一些非public的API,违反了iPhone开发者许可。此事详细说明可见Three20邮件列表中的讨论:Heads up: Apple store rejection for apps using three20

?

那些非public的API如下:

firstResponder?
UITouch._locationInWindow?
UITouch._phase?
UITouch._previousLocationInWindow?
UITouch._tapCount?
UITouch._timestamp?
UITouch._touchFlags?
UITouch._view?
UITouch._window?

我想Three20使用这些API主要是为了省事,比如firstResponder,而UITouch的这些属性也主要是在Debug的时候才用到。因此拿掉以上这些private API是比较安全的,关键就是如何找到这些API的位置。

?

因为我的app(购便宜)也用到了Three20,所以在发布新版前,为了不被Apple拒掉,必需解决private API的问题,下面我就描述一下我是如何去除这些API的过程:

?

解决此问题的方法有两个:

?

方法一(适用SDK3.0以上的app)

有一个热心的开发者(uprise78),在爆出此问题后,根据邮件列表中的讨论以及自己的研究,在github上做了一个fork(three20-P31),移除了以上所有的private API,所以只需更新此fork即可。

?

方法二(适用SDK2.x,或自行修改过Three20的app):

因为Three20在今年7月份以后就不再兼容SDK2.x,但是我们的app还希望支持2.x的用户,所以我所用的版本就一直很低,没有向上升级。那为了解决此问题,就必须手动移除上面那些API。

?

在移除之前,我基本扫过了邮件列表中10月底到现在为止所有的文章,发现有两篇文章很重要:

1.发生问题后,作者本人做了一次修改,移除部分private API

2.作者本人并没有完全移除那些private API,uprise78在作者的基础上又做了一次完整修改,

看起来经过这次修改后,基本解决了此问题。

也就是说只要参考作者及uprise78的两次修改,就能完整移除所有的private API使用。于是我上github上寻找Three20的修改历史,发现他们两的修改分别如下:

2009-10-28作则修改:

commit??8183ae25528bbc575ab41a41227756f06c166240

tree????2b2fd7b49fc71755d675eb0fd85c82098da563a5
parent??e8ecb801ca70ba824846928b7ca75faf376aeedb

2009-10-31uprise78修改:

commit??2c03d2b98ddb287ba68ddb628c4a72588bbee79e

tree????cc3cbfe0b23468d876166881f028a576f4ddcc7b

parent??8183ae25528bbc575ab41a41227756f06c166240

?

commit??3a1f0a9bea92aed27f12a513e1e70c5412ba0f91

tree????0da7dba956f71ca57a029dc3a7c88448e76f9942
parent??2c03d2b98ddb287ba68ddb628c4a72588bbee79e

在github上比对以上修改后,就能完整移除private API了。

?

以上所谓移除private API,均是使用#ifdef DEBUG将之包裹,所以要注意以下两点:

1.程序中不能有#define DEBUG

2.在build时,不能在preprocessor marco设置DEBUG

?

目前方法一已经被证明是可行的,见邮件列表中的讨论:***P31 FORK FIXES REJECTIONS***

而我的app还处于送审review中,必须等审核通过后才能证明方法二有用!

?

希望上面的信息能帮助使用Three20的iPhone开发者!

?

from:http://eleda.iteye.com/blog/542302

?

热点排行