innhyul

Between tomorrow's dream and yesterday's regret is todays opportunity.

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Three20 是一个非常有名的iPhone开发库,采用Objective-C语言。它是从Facebook iPhone app衍生而来的,所以很多Facebook app上使用的UI控件,像:TabBar,Launch view,Photo view等,都能从这个开发库中找到,且它使用的是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 作则修改:

c ommit  8183ae25528bbc575ab41a41227756f06c166240

t ree    2b2fd7b49fc71755d675eb0fd85c82098da563a5
p arent  e8ecb801ca70ba824846928b7ca75faf376aeedb

2009-10-31 uprise78 修改:

c ommit  2c03d2b98ddb287ba68ddb628c4a72588bbee79e

t ree    cc3cbfe0b23468d876166881f028a576f4ddcc7b

p arent  8183ae25528bbc575ab41a41227756f06c166240

 

c ommit  3a1f0a9bea92aed27f12a513e1e70c5412ba0f91

t ree    0da7dba956f71ca57a029dc3a7c88448e76f9942
p arent  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.javaeye.com/blog/542302

http://cenphoenix.javaeye.com/blog/565314

 

 

posted on 2010-12-02 23:05  bufferi  阅读(352)  评论(0编辑  收藏  举报