• 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解压其下。

     
  • IAP(程序内购买): 完全攻略

    第一印象觉得In-App Purchase(简称IAP)非常简单。Apple提供的大量文档应该让开发者很快熟悉地熟悉。那么,为什么在你的应用中集成IAP特性就如此令人生厌呢?


    这是因为在开发过程中不可避免会出现一些错误。而但这些错误发生的时候,你就抓瞎了。虽然Apple提供了有关IAP的大量文档,但他们并未提及集成IAP的详细步骤。而且对StoreKit集成过程中出现的问题也没有一个核对清单。另外对于为什么诸如产品ID非法之类的问题也没有提供NSError之类的对象来告诉你原因。


    在试用了各种可能的解决方案后,你只能身心疲惫,彷徨无助。


    为了提高你的效率和减少你的痛苦,我觉定利用此文来介绍一下实现IAP的详细步骤。本文很详细,有点长。甚至可能太长了,但不像Apple的文档,它提供了为实现IAP的每一个步骤。


    废话少说,我们直入主题吧。


    读文章 »

     
  • iPhone用Expat XML解析器

    xml的解析运用的十分广泛,我以前也介绍过使用ticpp(tinyxml的c++版本)进行简单的xml解析,见跨平台代码分享之三–xml解析器,它是采用DOM进行解析。iPhone SDK中自带的NSXMLParsers也可进行xml解析,但是对于解析web server下载的大型文件时效率不够高,有一个第三方的objective c expat wrapper 采用expat(SAX方式)进行解析,效率非常高。据有人测试,其效率相对于NSXMLParsers约提高了70-80%。


    下面是其下载地址



     
  • 调试教程 – 使用UIRecorder Instrument将测试自动化

    (注:这是我以前收集的一篇文章,找不到出处了,稍作修改在此发布)


    如果你发现程序的bug,但每次进行测试都需要许多步骤才能重现问题,那么本教程适合你。通常,测试和调试是非常繁琐的事情,iPhone程序的开发尤其如此。

    读文章 »

     
  • 真机安装测试iPhone应用程序

    前两天有朋友问我有关怎样在真机上加载和调试iPhone程序的问题,实际上有两个方法:


    1. 申请ADC帐号,购买iDP(iPhone Develop Program)

    2. 在“越狱”的iPhone上安装程序


    本准备写一篇教程,但在网上搜了一下,找到一些链接,为尊重原作者的劳动,这里我仅给出链接(但是否是原始链接,我就不得而知了,因为有许多网站并未表明原始地址。对此,小小地鄙视一下!)


    从零开始开发iPhone,教你如何在真机调试iPhone应用程序


    简单明了SDK2.2.1无99刀证书真机运行方法图文教程

     
  • iPhone不是Mac Pro

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


    Spots


    读文章 »

     
  • iPhone程序的文档目录

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


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


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


    方法二:


    1
    2
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
     
  • 跨平台代码分享之七 – 一个简单的音效引擎

    游戏都需要一个声音引擎,一般来说,有三种类型:

    1. 播放音效。音效一般是比较简短的声音文件。
    2. 播放背景音乐。
    3. 乐器,音效模拟。

     

    本文介绍一个简单跨平台的音效引擎,主要针对第一种类型。实际上,也可以适用于第二种类型,但由于背景音乐文件较大,占用内存较大,所以本文介绍的方法并不是最为有效率的(特别是对于像iPhone之类内存较为紧张的平台,但仍然可用)。可以在本引擎的基础上加以改进,比如采用“流”(streaming)技术。而第三种类型,可能涉及到DSP(数字处理技术),比较复杂,另外在不同平台有一些不同的技术,如Windows下的VST/VSTi,Mac OSX下的AU等,不在本文的讨论范围。

     

    本文介绍的音效引擎是基于OpenAL的,并且是我在许多项目中使用的引擎的简化部分(去除错误处理及乐器模拟部分)。

     

    有关OpenAL的使用,网上有许多教程,比如:OpenAL编程教程等。iPhone上的OpenAL使用,本网站也有几篇文章。所以这里不再赘述。

     

    本引擎的目的,是简化声音播放接口。最简单的情况下可以仅仅使用两条语句,就播放一段音效。而繁复的OpenAL初始化功能等都由引擎自动完成。下例展示了怎样播放一段音效的最为典型的调用:

     

    1
    2
    3
    audio::CSound sound("sound.wav");

    sound.play();

     

    本引擎由三个类和一个公共函数构成。audio::CEngine是引擎的核心部分,它是一个单例类(Singleton),负责直接与OpenAL接口,用户无需与其打交道。audio::CBuffer类对应于OpenAL中的缓存,通过audio::openAudioData函数打开音效文件,创建内部缓存,用户也无需直接使用。audio::CSound是用户直接使用的类,它提供了诸如play(),stop(),setVolume()和setPosition()几个接口函数。如需扩展功能,添加一些其他功能,可以直接加在此类中,并在audio::CEngine中实现。

     

    以上三个类可以直接使用在不同平台中。与平台相关的代码,都在audio::openAudioData()中。它的作用是打开不同的声音文件。对于Windows,我使用了一个开源项目库libsndfile,用来打开诸如wav,caf,aiff,flac,ogg等常用音效文件(注意:mp3并未包括其中。由于使用mp3的软件需要支付一定许可证费用,本人也不喜欢使用)。而对于Mac OSX(iPhone),则使用了core audio。这里大家可能会有一个疑问,既然libsndfile也是跨平台的,为什么在iPhone上不使用它呢?确实,libsndfile支持Windows,Linux,Mac OSX,Sun Solaris等平台,而iPhone并不支持ogg等格式,使用libsndfile不正好填补这个空白?是的,我也是这样想的,但是,有两点原因初始我暂时没有使用它:

    1. 没有现成的iPhone库。由于libsndfile需要使用makefile由GCC编译(我曾试过使用Xcode编译,没有成功),我也不是这方面的专家。但是,libsndfile在Mac OSX下编译没有问题,所以只需稍作修改,在为iPhone进行编译也不是没有可能的事情。
    2. 由于其许可证的限制。libsndfile是基于LGPL的,它要求使用者采用动态连接库,而众所周知,iPhone(官方)是不支持动态链接的。如果使用静态链接,则需要随软件发布源代码或目标代码。其实,这也不是无法克服的,LGPL只要求发布与libsnd相关的目标代码,所以对你的软件并无影响。对吗?

     

    本文给出了Windows下和iPhone下的应用。在Windows下使用需要下载OpenAL SDKlibsndfile。为方便编译好的libsndfile随示例程序给出给出。(你需要修改一下VS 项目文件中的有关OpenAL的头文件和库文件路径,另外,在OpenAL include目录中创建一个OpenAL目录,并将.h复制到其下,这样我就不需要修改#include语句了。)

     

    示例程序audiolib下载。(项目在test目录下)

     
  • Poco C++ for iPhone之一 – 编译

    Poco C++是一个强大的跨平台C++库,你可以在iPhone程序中使用它,如果:

    1. 你打算使你的程序跨平台。
    2. 你喜欢使用C++或希望使用Poco C++中的功能如:XML,Zip等。

     

    目前,最新Poco C++版本为1.3.6P1,根据文档,它可以编译为iPhone静态库。但是我试用了一下,无法使用在iPhone Xcode项目中链接,不知何故。所以我自己创建了下列Xcode项目:

    • Poco Foundation
    • Poco Util
    • Poco Net
    • Poco XML
    • Poco Zip

     

    另外,由于Crypto,Data,NetSSL_OpenSSL库需要外部库而且目前我不需要使用,所以没有包括。另外我增加了一个目录iPhoneSamples,它目前包括了一个示例程序HelloPoco,演示了怎样在iPhone项目中使用Poco C++库(此演示程序十分简单,它调用Poco中的UUID功能,产生一个UUID,显示与屏幕上)。下面是包括了此展示程序以及各Xcode文件的Poco包的下载:

     

    poco-1.3.6p1

     
  • 跨平台代码分享之六 – 使用minizip进行解压

    压缩和解压技术应用很广泛,比如游戏程序中的资源管理器可以使用压缩技术将许多文件打包,便于管理,也节约了空间。本文介绍使用minizip进行解压。由于可以使用zip工具比如winzip,betterzip等进行压缩,所以本文并未涉及压缩。

     

    读文章 »