• iPad 编程教程 – Hello World++

    概述


    随着iPad的发布,我想很多人开始绞尽脑汁试图在新一轮的“淘金热”中抢占一块市场。iCodeBlog将推出一系列iPad教程帮助大家。


    由于iPad使用iPhone同样的SDK,所有代码看上去完全一样。实际上,看看最新和修改了的API类,你就会发现大部分是有关用户界面的。这是一个好消息,因为我们都对iPhone编程有了一定的经验。


    此教程被称为“Hello World”,实际上它远远不止这些。首先,我假定你们已经具有iPhone/Objective-C的编程经验。


    读文章 »

     
  • 从零开始学习OpenGL ES之七 – 变换和矩阵

    今天的主题是我一度谈之色变的。概念上讲,它是3D编程中最为困难的部分。


    首先,你应该理解 3D 几何和笛卡尔坐标系他。你还应该理解由顶点构成的三角形组成的OpenGL虚拟世界的物体,各顶点定义了三维空间的特定点,你还应理解怎样使用这些信息在 iPhone上使用OpenGL ES进行绘制。如果你不理解这些概念,我建议你回头再看看我的前六篇文章。


    为在交互式程序如游戏中使用这些虚拟世界中的物体,必须要有一种方法来改变物体间的相对位置以及物体与观察者之间的相对位置。要有一种方法不但可以移动,而且可以旋转和改变物体的大小。

    还必须要有一种方法将虚拟的三维坐标转换成电脑屏幕的二维坐标。所有这些都是通过所谓变换来实现的。实现变换的内部机制是就是矩阵


    尽管你不需要懂得太多有关矩阵和矩阵的数学知识就可以实现许多OpenGL的功能,但对这些观念的基本理解有很大的帮助。

    读文章 »

     
  • OpenGL ES纹理尺寸限制的处理方法

    大家都知道,OpenGL ES对纹理的尺寸有限制,就是长和宽都必须是2的整数次幂。(实际上OpenGL都有此限制,但有一些扩展可以解决此问题)。因此处理方案有两种:


    1. 将纹理尺寸限制为2的整数次幂。比如,我有一个480×320的背景图案,我可以用Photoshop将画布设置为512×512,在纹理映射时只使用480×320部分。当然我也可以将多个图案合成在一个纹理中,在纹理映射时根据图案的位置进行映射。
    2. 仍然使用正常的图像尺寸,但在使用时进行转换。下面是源代码:


    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 &gt; kMaxTextureSize) || (_height &gt; kMaxTextureSize))
            {
                _width /= 2;
                _height /= 2;
                transform = CGAffineTransformScale(transform, 0.5, 0.5);
                imageSize.x *= 0.5;
                imageSize.y *= 0.5;
            }
     
  • OpenGL ES 3D物体加载示例

    前几天有位朋友向我询问有关3D物体加载的示例,记得以前看到过一个示例,就找来出来与大家分享:


    iPhone Wavefront Obj Loader


     
  • Apple禁止越狱者访问App Store?

    据称部分越狱者在“越狱”iPhone OS 3.1.3后,出现以下问题:

     

    image

     

    是否Apple开始了“反越狱”行动,目前还不得而知。不过要是无法使用“越狱”的iPhone,我相信iPhone的使用者将大幅度地减少,你认为呢?

     

    参见:http://www.examiner.com/x-8134-SF-Gadgets-Examiner~y2010m2d15-Apple-might-be-banning-iPhone-hackers
     
  • iPad/iPhone与多任务

    最近很忙再加上新年,所以很久没有更新博客了,抱歉。

     

    苹果即将推出的iPad到底具有哪些功能,可谓是众说纷纭。我最为关心的问题是到底iPad是否支持多任务,种种迹象表明答案是否定的。这让许多开发者包括我自己十分失望。缺乏多任务支持使得许多简单的功能都无法实现。记得一位朋友问过我关于在iPhone上实现闹钟功能的问题,这实在是一个简单的程序,可是在没有破解的iPhone上却没办法实现。(准确地说,是无法完美实现。你当然可以写一个运行于前台的闹钟程序,不再运行其它程序,可是它有多实用呢?另外还可以用Push Notification技术,不过这实在有点“大炮打蚊子”了。)

     

    实际上,iPhone OS(iPad也采用iPhone OS)本身是支持多任务的。苹果的的官方解释是CPU,内存的限制以及安全性的考量,所以只支持单任务。但对我而言,这些解释是站不住脚的。举个可能不恰当的比喻,尽管大部分人在大部分时候都不能一心两用,但谁规定了人在看书写文章时就不能同时听音乐,就不能做运动,如果是这样,上帝造人时干脆弄个开关,让人只能做一件事情算了。说道安全性就更不靠谱,上网或运行别人的程序当然有风险,但与我得到的好处相比,我宁愿承担风险,或者说我宁愿自己进行风险评估。更何况App Store不就是用来帮助人们对安装程序进行检查以降低风险的吗?如果这点风险都不愿承受的话,那么人最好不要吃药甚至不用吃东西,因为再好的药物都有可能带来副作用,食物可能包含对人体有害的物质。

     

    下图是一些移动平台有关多任务的对比,其优劣大家自己判断:

     

    image

     

    不过,iPad还会提供一个新的机制可以有限度地支持多任务,那就是支持Dashboard widgets。或许我们可以编写一些运行在后台的widget,谁知道呢?

     
  • 新春快乐!

    新年将近,祝各位新春快乐,身体健康,万事如意!


    2008520211942659_2

     
  • iPhone不是Mac Pro

    本文是关于通过Objective C++的强大功能提高iPhone程序的性能。通过讨论现实世界中Savoy的Spots应用程序遇到的问题,本文展示了通过3个步骤对程序进行优化使其顺利运行的过程。


    Spots


    读文章 »

     
  • iPhone是个“大嘴巴”

    newton-virus-objectsq

    TaranFx上有一篇文章介绍了一个名为SpyPhone的新的开源程序,它将当前iPhone SDK的“信息脆弱点”都完全曝光。下面是该文章的链接:


    SpyPhone程序从所有iPhone数据


    大家可能都听说过越狱iPhone用户可能遇到的一些问题。没有SDK的限制,许多用户的手机都被恶意程序通过默认的root密码劫持了。不像我们听说过的其它一些程序,SpyPhone仅利用公共API获取它显示的信息。它显示了:

    1. Email账户
    2. Wi-Fi 网络
    3. 电话使用信息及历史信息
    4. 位置信息
    5. Safari 搜索
    6. YouTube 搜索,历史和书签
    7. 照片
    8. 地址簿数据
    9. 键盘缓存


    在这里我们的目的并不是向大家大声抱怨安全,隐私问题,而是要看看到底该程序是怎样做的。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;

    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;


    上面的代码获取程序运行其上的电话的网络信息,它包括在一个数组中。尽管有些担忧,但我认为它还并不是罪恶滔天。首先我知道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的访问?


    原文见:The iPhone is Bad at Keeping Secrets
     
  • 使用UIImagePickerController从iPhone照片库或照相机获取图像

    本文讲述使用3.0的方法怎样从iPhone的照片库或照相机获取图像。


    我们将创建一个应用程序从图片库或照相机获取图像并显示与屏幕之上。下面是截图:


    photo 2

    读文章 »