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