这可能算是今天最大的消息了: Cydia的作者Saurik发表了如何将toolchain 1.x的应用程序移植到2.x的方法。这个方法有点复杂,下面先介绍一下toolchain从1.x到2.x转变时API的一些变化。
LayerKit -> CoreAnimation
基本上LayerKit的所有内容都被搬到QuartzCore里了。LayerKit在1.x中就是CoreAinmation, 现在基本上所有LK*都已经变成了CA*。不过名字也不是都完全一样,比如LKCurrentTime编程了CACurrentMediaTime。
(cocoachina.com注:通过这点可以看出,open toolchain和官方的SDK也是越来越像了)
CG/GS*Ref到UIFont / UIColor的转变
字体和颜色分别由GraphicsServices和CoreGraphics各自处理。在1.x中曾经直接在UIKit中可以直接使用。(比如setColor:方法,从前直接跟CGColorRef参数)。不过新的UIKit直接将这两个打包进了UIFont和UIColor。它们之间的互相转换明显很容易。
使用PrivateFrameworks
为了防止开发者在他们的应用程序中使用后端API(比如经常可能修改的API或者会将系统变得不正常的API),苹果将这些API移到了/System/Library/PrivateFrameworks里,并不包含在链接路径中。要使用这些API,你需要直接将这些Framework用gcc -F参数添加。
使用未公开的UIKit
首先要了解的是UIKit是苹果几乎完全没有修改的API。由于一些未知的向下兼容性,他们保留了大部分1.x的类,这意味着使用UIKit的大部分1.x代码只需经过微小的命名改动就可以支持新的平台。(感谢大拿Jonathan Zdziarski指出这个问题)
命名的改动如下:
UIAlertSheet - UIActionSheet
UIButtonBar - UIToolbar
UISliderControl - UIOldSliderControl
UISwitchControl - _UISwitchSlider
UIWebView - UIWebDocumentView
警告对话框/动作对话框的关闭
基本上所有关于对话框的使用都和在一个buttonClicked:事件之后关闭有关系。苹果把这个事件命名为didDismissWithButtonIndex: 使用-(void)dismiss方法就可以关闭对话框。
双字与单字
虽然大部分情况下,苹果都会使用浮点数做为参数,但是在从前UIKit库中的某些函数里,苹果使用了双字。这些地方已经被修改了。比如说:
[UIProgressBar setProgress:(float)]
自动键盘支持
苹果显然已经意识到,让开发者在用户点击输入框时来手动控制键盘的显示是很愚蠢的事情,我必须同意这一点。(cocoachina.com注:真的很愚蠢,从前要显示键盘,先要创建一个键盘,设定显示的大小和位置,不用的时候还要隐藏掉……连飞出的动画都要自己做才行)不过不幸的是这意味着从前手工创建键盘的代码现在必须要改,否则屏幕会飞出两个软键盘,而且只有一个能用。
CoreGraphics和ImageIO
大部分希望在屏幕上画东西的程序都不需要从图形缓冲中进行复杂的数据输入/输出。所有关于图形缓冲方面的东西大概都需要吃掉太多的内存,所以它们从CoreGraphics里分到了另一个叫做ImageIO的库里。比如从前的CGImageDestination/Source函数。
UIApplicationMain(Class)
从前,UIApplicationMain()函数是从UIApplicationMain中继承的类型的元类对象中被传递的(这句话翻着真费劲),然后再被实例化。现在这个函数可选地加入了名字参数,来实现UIApplication的不同功能。如果你将从前类的名字做为参数传递进这两个参数的话,你会得到明显一样的结果。
mprotect(), NX,和max_prot
这个信息并不适用于破解的设备,但是了解一下苹果已经开始着手防止未经认证的代码执行还是很必要的。在代码签名之外,一旦内存页面设置为可写,就无法执行了,意味着不可能有JIT编译器(在执行时将代码转换为本地代码)或者动态的弹簧床指针的机制了。(cocoachina.com注:这表示Java不可能出现在iPhone上了?)这个问题已经在破解补丁中排除出了kernel。
使用新版toolchain的方法还是比较麻烦的,英文版的方法在这里,我们择日再推荐给大家。如果读者对新的toolchain有什么见解和看法,欢迎您在下面发表评论或者在这里和大家讨论。
发表评论