• 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

    读文章 »

     
  • iPhone程序的文档目录

    最近实在太忙,手头上的事情还没有完成,因此正在进行的几篇有关OpenGL ES的文章只能推后了。


    今天介绍一下怎样获得iPhone程序的文档目录(通常用来存储用户数据),方法一:


    1
    2
    NSString* documentsDirectory  = [NSHomeDirectory()
            stringByAppendingPathComponent:@"Documents"];


    方法二:


    1
    2
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
     
  • iPad到底是什么?

    恕我孤陋寡闻,一直对Apple的平板电脑没有过多的关注,以为就是一台带触摸屏的Macbook。在我的Macbook Pro被盗后,还准备买一台进行iPhone的开发工作。但随着iPad新闻的发布,我发现iPad不过就是一台大号的iPod Touch。我觉得有下列弱点:


    • 不支持后台运行 – 这无疑是iPad的致命弱点。如果说iPod Touch和iPhone不支持多任务是为了最优化的用户体验,我还可以理解。但作为一台拥有如此先进的OS的电脑,我不知为何Apple一直抱定这个设计理念。简直让人觉得回到了DOS时代。
    • 不支持Flash – 仍然无法像使用普通浏览器一样访问Flash支持的网站。使其网络浏览功能大打折扣。
    • 不带摄像头 – 在视频聊天如此流行的今天,在这样一个高端的设备上,加上一个前置摄像头应该是必备的选择吧? 
    • 大尺寸的屏幕 – 这也是缺点?没错。虽然我觉得大屏幕确实有许多好处(特别是看电子书),但是如果它具有Laptop或Tablet的尺寸而仅仅具有掌上电脑的功能,这应该是缺点多过优点了。另外,试想一下,拿着这么个大家伙在地铁上摇头晃脑地玩着保龄或赛车游戏,是不是有那么点脑残?


    总而言之,我觉得iPad的设计理念互相矛盾,定位不明确,它不过是苹果公司另一个噱头,它的出现无非是进一步利用其极其成功的App Store模式,最大地获取利润的一种方式罢了,因此我并不看好它的前景,大家觉得呢?


     
  • “完美”安装雪豹,Windows 7双系统再续 – 开启QE/CI

    经过一天一夜的奋斗,终于搞定QE/CI的启动。在这里必须要感谢一下Insanelymac的riws朋友,从他那里学到了不少东西。下面介绍一下我的步骤,希望对大家有所提示和帮助。


    几个关键


    1. DSDT – 先前试过许多方法都没有效果,于是试一下DSDT方法。安装在/Extra下。此DSDT.aml使用了MSD 和 DTGP方法(请别问我,我也不太懂)。此dsdt.aml仅包括与显示有关的部分,其他部分已删除,使用GMA950(27a2)的用户尽管放心使用。(记住移除EFI String)
    2. 使用原版驱动,安装在/System/Library/Extensions下。将所有与显卡有关的驱动从/Extra/Extensions中删除。安装1.6.6驱动。修复权限后,重启。
    3. 不幸的是,虽然分辨率可调了,但QE/CI仍然没有如愿开启。使用kextstat命令,发现AppleIntelGMA950.kext并没有加载。使用 sudo kextutil /System/Library/Extensions/AppleIntelGMA950.kext 命令手动加载驱动,发现权限错误。使用下列命令:

      sudo su
      chmod -R 755 /System/Library/Extensions/*
      chown -R root:wheel /System/Library/Extensions/*

    4. 重启后,使用-f,但发现AppleIntelGMA950.kext仍没有自动加载。但使用kextutil加载kext时没有错误发生。再次使用kextstat,发现系统同时加载了AppleHDA和VoodooHDA(0.2.53),这两者是有冲突的。所有我删除了AppleHDA.kext后,重启。
    5. 一切正常,什么截屏,看图,水波纹,应有尽有了。有一个简易的方法测试是否QE/CI已经开启,使用OpenMark测试。


    虽然我的无线网卡还不能使用,但通过网卡上网没有问题。现在开始,我又可以开始iPhone的开发工作了。

     
  • “完美”安装雪豹,Windows 7双系统续 – GMA950显卡驱动研究

    我在“完美”安装雪豹,Windows 7双系统一文中提到所谓“完美”的安装是不存在的。昨天,我准备写一篇有关iPhone编程的文章时就发现了问题 – 无法截屏。上网搜了一下,问题的根源在于我的QE/CI没有开启。


    QE指Quartz Extreme,是利用显卡GPU的界面加速引擎。CI是Core Image,指利用显卡GPU的图片处理引擎,它也担任绘制OSX中3D效果的任务(比如水波纹,3D Cube))。至于QE/CI没有开启的后果是什么,除无法截屏外,我目前还不太清楚。(OpenGL ES功能完全正常,我已经测试过了,可能那些使用QE或CI的程序不能正常工作了吧)。


    经过大量的测试,目前我仍然没有找到解决的办法,不过测试的结果可能会对大家有所帮助。先介绍一下我的显卡:

    GPU:         GMA 950
    VRAM:        64MB of Shared System Memory
    
    Device ID:    0x27a2
    Vendor ID:    Intel (0x8086)
    Revision ID:  0x0003
    Resolution:   1440x900
    Depth:        32 Bits Color (ARGB8888)


     测试结果:(全部在32位下测试,我是用安装在Windows 7下的变色龙2.0 rc4启动)

    1. 使用原始驱动1.6.6.25,启动后黑屏,外接显示器能工作但分辨率不对
    2. 移除AppleIntelIntegratedFramebuffer.kext后,能正常启动,但分辨率固定在1024×768,QE/CI未开启
    3. 使用修改后1.4.20.28版AppleIntelIntegratedFramebuffer.kext,出现“五国”,无法进入系统
    4. 将修改后1.4.20.28版AppleIntelIntegratedFramebuffer.kext移动到/Extra/Extensions下后,正常启动,令人惊奇的是分辨率可以修改了,但QE/CI仍然无法开启。
    5. 有人介绍说使用EFI String可以启动QE/CI,于是修改了/Extra下的com.apple.Boot.plist,加入了GMA 950的EFI String,再次进行以上测试,但结果完全一样。


    我的结论:

    • 要正常启动,修改分辨率的关键是AppleIntelIntegratedFramebuffer.kext
    • 是否使用EFI String对开启QE/CI毫无影响


    不知各位朋友,有无在雪豹上成功开启GMA 950的QE/CI的经验?望分享。

     



     
  • 怎样编写Apple Push Notification服务器

    iPhone OS 3.0一个引入注目的新特性是push notifications(推送通知),它允许向已安装相关应用程序的各设备直接发送消息。苹果在新闻提示或IM应用中展示了此特性,它也十分完美地适合于我们的服务器监视服务程序Server Density


    Server monitoring iPhone application alert view

    读文章 »