概述
随着iPad的发布,我想很多人开始绞尽脑汁试图在新一轮的“淘金热”中抢占一块市场。iCodeBlog将推出一系列iPad教程帮助大家。
由于iPad使用iPhone同样的SDK,所有代码看上去完全一样。实际上,看看最新和修改了的API类,你就会发现大部分是有关用户界面的。这是一个好消息,因为我们都对iPhone编程有了一定的经验。
此教程被称为“Hello World”,实际上它远远不止这些。首先,我假定你们已经具有iPhone/Objective-C的编程经验。
随着iPad的发布,我想很多人开始绞尽脑汁试图在新一轮的“淘金热”中抢占一块市场。iCodeBlog将推出一系列iPad教程帮助大家。
由于iPad使用iPhone同样的SDK,所有代码看上去完全一样。实际上,看看最新和修改了的API类,你就会发现大部分是有关用户界面的。这是一个好消息,因为我们都对iPhone编程有了一定的经验。
此教程被称为“Hello World”,实际上它远远不止这些。首先,我假定你们已经具有iPhone/Objective-C的编程经验。
今天的主题是我一度谈之色变的。概念上讲,它是3D编程中最为困难的部分。
首先,你应该理解 3D 几何和笛卡尔坐标系他。你还应该理解由顶点构成的三角形组成的OpenGL虚拟世界的物体,各顶点定义了三维空间的特定点,你还应理解怎样使用这些信息在 iPhone上使用OpenGL ES进行绘制。如果你不理解这些概念,我建议你回头再看看我的前六篇文章。
为在交互式程序如游戏中使用这些虚拟世界中的物体,必须要有一种方法来改变物体间的相对位置以及物体与观察者之间的相对位置。要有一种方法不但可以移动,而且可以旋转和改变物体的大小。
还必须要有一种方法将虚拟的三维坐标转换成电脑屏幕的二维坐标。所有这些都是通过所谓变换来实现的。实现变换的内部机制是就是矩阵。
尽管你不需要懂得太多有关矩阵和矩阵的数学知识就可以实现许多OpenGL的功能,但对这些观念的基本理解有很大的帮助。
大家都知道,OpenGL ES对纹理的尺寸有限制,就是长和宽都必须是2的整数次幂。(实际上OpenGL都有此限制,但有一些扩展可以解决此问题)。因此处理方案有两种:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | // 首先调整纹理的长和宽为2的整数次幂 if( (_width != 1) && (_width & (_width - 1)) ) { i = 1; while((sizeToFit ? 2 * i : i) < _width) i *= 2; _width = i; } if( (_height != 1) && (_height & (_height - 1)) ) { i = 1; while((sizeToFit ? 2 * i : i) < _height) i *= 2; _height = i; } // 如果调整后的图像尺寸大于最大纹理尺寸(1024),那么需要缩小 while((_width > kMaxTextureSize) || (_height > kMaxTextureSize)) { _width /= 2; _height /= 2; transform = CGAffineTransformScale(transform, 0.5, 0.5); imageSize.x *= 0.5; imageSize.y *= 0.5; } |
据称部分越狱者在“越狱”iPhone OS 3.1.3后,出现以下问题:
是否Apple开始了“反越狱”行动,目前还不得而知。不过要是无法使用“越狱”的iPhone,我相信iPhone的使用者将大幅度地减少,你认为呢?
最近很忙再加上新年,所以很久没有更新博客了,抱歉。
苹果即将推出的iPad到底具有哪些功能,可谓是众说纷纭。我最为关心的问题是到底iPad是否支持多任务,种种迹象表明答案是否定的。这让许多开发者包括我自己十分失望。缺乏多任务支持使得许多简单的功能都无法实现。记得一位朋友问过我关于在iPhone上实现闹钟功能的问题,这实在是一个简单的程序,可是在没有破解的iPhone上却没办法实现。(准确地说,是无法完美实现。你当然可以写一个运行于前台的闹钟程序,不再运行其它程序,可是它有多实用呢?另外还可以用Push Notification技术,不过这实在有点“大炮打蚊子”了。)
实际上,iPhone OS(iPad也采用iPhone OS)本身是支持多任务的。苹果的的官方解释是CPU,内存的限制以及安全性的考量,所以只支持单任务。但对我而言,这些解释是站不住脚的。举个可能不恰当的比喻,尽管大部分人在大部分时候都不能一心两用,但谁规定了人在看书写文章时就不能同时听音乐,就不能做运动,如果是这样,上帝造人时干脆弄个开关,让人只能做一件事情算了。说道安全性就更不靠谱,上网或运行别人的程序当然有风险,但与我得到的好处相比,我宁愿承担风险,或者说我宁愿自己进行风险评估。更何况App Store不就是用来帮助人们对安装程序进行检查以降低风险的吗?如果这点风险都不愿承受的话,那么人最好不要吃药甚至不用吃东西,因为再好的药物都有可能带来副作用,食物可能包含对人体有害的物质。
下图是一些移动平台有关多任务的对比,其优劣大家自己判断:
不过,iPad还会提供一个新的机制可以有限度地支持多任务,那就是支持Dashboard widgets。或许我们可以编写一些运行在后台的widget,谁知道呢?
TaranFx上有一篇文章介绍了一个名为SpyPhone的新的开源程序,它将当前iPhone SDK的“信息脆弱点”都完全曝光。下面是该文章的链接:
大家可能都听说过越狱iPhone用户可能遇到的一些问题。没有SDK的限制,许多用户的手机都被恶意程序通过默认的root密码劫持了。不像我们听说过的其它一些程序,SpyPhone仅利用公共API获取它显示的信息。它显示了:
在这里我们的目的并不是向大家大声抱怨安全,隐私问题,而是要看看到底该程序是怎样做的。SpyPhone的源代码可以在 git hub 下载,你可以自己看看到底它是怎样完成这些工作的。快速浏览了一下它的源代码,我们发现iPhone像 Macintosh电脑一样都包括一些文件夹,比如“Applications”, “Library”, “Root”等等。如果你安装了SDK,那么你可以在iPhone模拟器上找到这些文件夹。它们在:
~/Library/Application Support/iPhone Simulator/User
这就是iPhone保存所有数据的地方。再看下SpyPhone的源代码,它的秘密就是利用这些文件夹和它们包含的文件。如果你再进一步,你会在iPhone模拟器的文件夹下发现:
~/Library/Application Support/iPhone Simulator/User/Library/Preferences/
这里有许多 com.apple.SOMETHING.plist 文件。这些文件就是SpyPhone获取大部分数据的源头(其它数据可以通过SDK的其他部分,如地址簿访问,照片服务等)。它使用下面代码获取数据:
NSString *path = @"/Library/Preferences/SystemConfiguration/com.apple.wifi.plist"; NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path]; if(!dict) return; NSArray *a = [dict valueForKey:@"List of known networks"]; if(!a) return;
if(!a) return;
上面的代码获取程序运行其上的电话的网络信息,它包括在一个数组中。尽管有些担忧,但我认为它还并不是罪恶滔天。首先我知道Apple会拒绝这样的程序出现在App Store上。Apple对SDK可谓是了如指掌,所有它可以叫停所有的滥用其SDK的程序。
但是该程序为神秘的App Store批准过程提出了一个挑战。令人难以置信的是获取进入世界上发展最快的软件市场的入场卷是如此的神秘。像SpyPhone这样截取“敏感”信息的代码随时可能发生而用户并不知情。虽然Apple可以监视对PLIST的访问,但我很容易就可以想像到某些程序具有绕过Apple检查的能力直到某天我们知道它出现在App Store上。
例如,我有一个在线 XML 文档指定是否要运行截取用户信息的方法,在App Store审核期间将其设为NO而在获取批准后设为YES,开始收集用户数据。所以尽管Apple有很好的方法来防止恶意程序,但我确信有许多方法可以逃过Apple的检查。所以我产生了最后一个问题,大家是否宁愿程序不具有使用这些信息的能力?没有照片,没有地址簿,没有wifi侦测,程序mail限制。大部分这些使iPhone变得精彩的程序都被“安全隐患”包围着。大家怎么看?是否Apple应该至少关闭系统PLIST的访问?