• Xcode不支持iPhoe OS 3.2.1的解决方法

    最近iPad升级到iPhone 3.2.1,今天准备进行真机调试,猛然发现Xcode下出现下列错误:


    The version of iPhone OS on “xxxx” does not match any of the versions of iPhone OS supported for development with this copy of Xcode. Please restore the device to a version of the OS listed below. If necessary, the latest version of Xcode is available here.


    Google 了一下,发现是3.2.1的目录在DeviceSupport下不存在。解决办法是用最接近的OS版本使用ln命令进行链接。不过在操作过程中有两个问题:


    1. 不知什么原因,ln -s 命令后总是为文件而不是目录
    2. 不知OS 3.2的build number


    于是,采用最笨但最为有效的方法:


    在/Developer/Platforms/iPhoneOS.platform/DeviceSupport目录下创建3.2.1目录,然后,将3.2下所有文件及目录复制到3.2.1下,重新启动Xcode,问题解决。

     
  • 怎样离线使用iPhone SDK文档

    我是用Dell机安装的雪豹系统,由于没有无线网卡的支持,所以上网很不方便。在使用Xcode进行iPhone编程时,有时需要参考iPhone SDK的文档,不过每次Control+Click后,Xcode都会试图连接Internet,进行在线读取。有什么方法能够把资料下载到硬盘上进行离线阅读吗?


    答案是肯定的。首先去Xcode的Preference中的Documentation Sets下,选择所需的docset,这里是iPhone 4.0 Reference Library,右击选择“Get Info…”,找到Feed URL:


    http://developer.apple.com/rss/com.apple.adc.documentation.AppleiPhone4_0.atom


    用浏览器打开,下面列出了许多版本,在Windows下你就可以使用迅雷下载了。


    下载后,拷贝到Mac的/Developer/Documentations/Docset目录下,使用终端命令:

    sudo xar -xf 下载的文件名.xar



    将其解压,然后使用:

    sudo chown -R -P devdocs 解压后的文件名.docset



    将文档的所有者改为devdocs。打开Xcode就可以离线浏览了。

     
  • Navigation-Based应用程序iPad模板

    准备为iPad写一个Navigation-Based程序,却发现XCode 3.2中根本没有iPad的Navigation-Based程序的模板。Apple推荐在iPad下使用Split-View程序,但我并不想这样做,原因是我的iPad程序以后可能要放到iPhone中去,所以我需要一个Universal版。如果我在iPad下使用Split-View,那么这两个版本相差太大,所以我觉得都使用Navigation-Based程序。


    试了半天想修改iPhone的Navigation-Based程序的模板到iPad下,却没有成功,在网上搜了一下,终于找到一个别人做好的。下面是下载地址。可以使用如下命令将其加到XCode的模板中:

    mkdir -p “$HOME/Library/Application Support/Developer/Shared/XCode/Project Templates/My Templates”

    cd “$HOME/Library/Application Support/Developer/Shared/XCode/Project Templates/My Templates”

    git clone git://github.com/benellingson/Universal-Navigation-based-Application.git

    rm -rf “Universal-Navigation-based-Application/.git”



    或者下载zip文件,在创建了目录后,将zip解压其下。

     
  • 访问外部网页

    实际上有两种方法,第一种是:

    1
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://www.google.com"]];



    这种方法将会退出当前程序,用Safari打开url。我有好几个朋友都问到这个问题,实际上非常简单,可以使用UIWebView在当前程序中打开网页(假定你的UIWebView实例为webView):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
         NSString *urlAddress = @"http://localhost";
           
        //Create a URL object.
        NSURL *url = [NSURL URLWithString:urlAddress];
           
        //URL Requst Object
        NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
           
        //Load the request in the UIWebView.
        [webView loadRequest:requestObj];
     
  • 不通过App Store发布程序

    在一些情况下,我们需要不通过App Store发布程序,比如:


    1. 发布前的测试
    2. 企业内部自用软件,不需要发布到App Store


    非正规的做法当然是“越狱”,但是更为正式的做法是使用Ad-Hoc。至于怎样创建Ad-Hoc provision文件,不在本文讨论的范围内。本文讨论的是怎样安装Ad-hoc发布的程序。通常的做法是:


    1. 开发者将Xcode编译的Ad-Hoc程序.app文件压缩后与.mobileprovision一起传给用户。
    2. 用户拖动.mobileprovision文件到iTunes下的资料库应用程序
    3. 将压缩的.app文件解压,然后将整个.app文件夹拖动到iTunes下的资料库应用程序


    通常这对于Mac用户没有什么问题,但有时Windows用户会遇到一些问题。所以更好的做法是将.app制作成.ipa与.mobileprovision文件一同寄给用户。下面是制作ipa的步骤:


    mkdir Payload
    cp -rp MyApplication.app Payload/
    zip -r MyApplication.ipa iTunesArtwork Payload
    


    需要注意的是这里使用的是zip命令而不是Find中“Compress”选项,因为它会添加一些额外的内容。另外iTunesArtwork是一个512×512的png文件(注意无后缀),它将在iTunes中增加一个图标,所以这并不是必需的。

     
  • 使用Javascript和PHP检测iPhone/iPod的使用

    这与iPhone编程无关,不过当你的网站需要为iPhone/iPod进行优化时,可能会需要使用下面的技术:


    使用Javascript检测是否正在使用iPhone 和 iPod


    如果你的网页需要支持iPhone和iPod Touch,首先你必须检测到是否正在使用iPhone和iPod Touch,这样你才可能为其使用特定的代码或样页式。下列代码段使用Javascript来检测iPhone/iPod Touch的使用,从而将网页重定向iPhone相关的网页。


    1
    2
    3
    4
    5
    6
    <br />
    if((navigator.userAgent.match(/iPhone/i)) || (navigator.userAgent.match(/iPod/i))) {<br />
        if (document.cookie.indexOf("iphone_redirect=false") == -1) {<br />
            window.location = "http://m.espn.go.com/wireless/?iphone&i=COMR";<br />
        }<br />
    }<br />

     

    使用PHP检测是否正在使用 iPhone 和 iPod


    有时在iPhone上,Javascript被禁止使用。为检测到iPhone/iPod Touch的使用,你需要使用下列PHP代码:


    1
    2
    3
    4
    5
    <br />
    if(strstr($_SERVER['HTTP_USER_AGENT'],'iPhone') || strstr($_SERVER['HTTP_USER_AGENT'],'iPod')) {<br />
        header('Location: http://yoursite.com/iphone');<br />
        exit();<br />
    }<br />

     
  • iPhone不是Mac Pro

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


    Spots


    读文章 »

     
  • OpenAL系列之二 – 为什么要避免使用alBuferDataStatic

    我收到Ken一封Email,这位仁兄浏览了我博客的中有关OpenAL的文章,遇到一些问题请求我的帮助。他在加载缓存后重复使用时遇到了一些OpenAL神秘的错误。

     

    所以我阅读了他寄给我的代码片段,我注意到:

     

    1
    2
    3
    // use the static buffer data API

    alBufferDataStaticProc(buffer, format, data, size, freq);

     

    啊哈! 这可能就是你问题的根源!除非你真正需要,alBufferDataStatic应该完全被避免。你怎样才知道你需要使用它?有一条金桂玉律:如果你不知道这个问题的答案,那么你就不需要它。

     

    读文章 »

     
  • 开始学习iPhone编程之四 – 所有iPhone apps都需要做的七件事

    想要开发iPod或iPhone程序?这里有一个列表,列出了要获得成功需要做到的七件事。

     

    如果你有一台iPhone或者iPod,那么你可能下载过一些程序。如果你下载了不止一个程序,那么你很快就会发现一些程序比另一些更好。

     

    开发者在编写程序时有许多选择;程序不但需要有一个很好的设想,而且需要以一种iPhone用户熟悉的方式展现出来。如果用户需要花上超过一分钟的时间来摸索这样使用你的程序,那么导致的结果可能是他们再也不会使用你的程序并且会给出一个低分。

     

    这两种结果都是不好的结果,特别是你希望在App Store中获得成功时,你的程序需要处于某个“Top”列表中。

     

    考虑到这些,我根据我的经验汇总了一个列表,将帮助你使你的iPhone程序获得成功。

     

    读文章 »

     
  • 怎样替换Xcode中__MyCompanyName__

    我们知道,Xcode在每个.h和.m文件头都会加上一些发行信息,如姓名,创建日期,公司名等。但公司名是用__MyCompanyName__代表,每个文件都要手工修改十分麻烦。此信息的模板存在/Library/Application Support/Apple/Developer Tools/File Templates下,格式如下:

    1
    2
    3
    4
    5
    6
    7
    8
    /*
     *  «FILENAME»
     *  «PROJECTNAME»
     *
     *  Created by «FULLUSERNAME» on «DATE».
     *  Copyright «YEAR» «ORGANIZATIONNAME». All rights reserved.
     *
     */

    我们当然可以修改此文件。但每次Xcode升级后,此信息就会丢失。我在一本有关Xcode的书中找到一个方法:

    1
    defaults write com.apple.xcode PBXCustomTemplateMacroDefinitions '{ ORGANIZATIONNAME = "Joan Smith"; }'

    另一种方法是通过双击~/Library/Preferences下com.apple.Xcode.plist来修改。