苹果iOS程序开发经常会遇到下面这个问题:
到底是一套代码兼容 iPhone 和 iPad(含iTouch)还是做两个应用去分别支持iPhone和iPad?
其实这不光是成需要需要考虑的程序结构上的问题,而是一个产品规划的问题。
这里面涉及到决策的问题,按照我经历的几个iOS开发项目,我总结出一下的几点经验:
1. 首先需要考虑你提供的功能对于iPhone和iPad这两类用户是否有不同的需求?也就是意味着你的应用对 iPad 和 iPhone用户来说是否有不同的界面和交互设计?如果有则干脆就两套代码,两个App单独开发。功能上用公用的函数库来共享,在代码架构上就是通过 GIT 的Submodule的形式来维护公用库。各自产品自己建立项目baseline进行开发。
2. 需要考虑你的App是否需要针对iPhone和iPad不同的分辨率进行布局设计。这会设计到
iOS 设备现有的分辨率如下:
iPhone / iPod Touch
普通屏 320x 480 像素 iPhone 1、3G、3GS;iPodTouch 1、2、3
3:2Retina 屏 640x 960 像素 iPhone 4、4S,iPod Touch 4
16:9Retina 屏 640 x 1136 像素 iPhone5,iPod Touch 5
iPad
普通屏 768x 1024 像素 iPad 1, iPad2,iPad mini
Retina屏 1536 x2048 像素 New iPad,iPad 4, iPad mini 2
做一款 兼容 iPad 和 iPhone 所有型号手机的程序,光Splash Screen就需要做6种。
但 320x480 和 640x960 (768x1024 与 1536x2048)只是4倍的关系@2x 的关系。
但是还要考虑到 iPad版本一般需要支持横屏。所以工作量还是蛮大的。而且不容易协调。导致整个项目的迭代遇到很多问题,无法正式发布产品。
3. 第三,项目开发人员的数量能够决定到底是一套代码支持 iPhone 和 iPad还是 分开。
如果开发人员数量很少,那么为了高效和介绍代码浪费,而且一套代码+配置文件的方式是比较好的选择。因为任何一个开发人员都不愿意重复写自己已经写过的代码。公用代码是比较好的方式。在可控范围内减少维护人员的支出。相反,如果开发人员数量较多,那分开项目并行开发是比较有效提高效率的方式,但这也会带来沟通效率上的损失。不同水平的开发人员协同工作来短板效应。
综上,如果时间紧急,那么可以考虑迭代+一套代码维护。如果是大项目,从零开发,那么需要分项目+共享库的架构开始设计,最终决策取决于你自己对项目的进度把控以及需求裁减。
如何让工程同时支持在iPad和iPhone上运行
将现有iPhone应用程序移植到iPad平台时,需要完成的大部分工作只是重新设计应用程序的UI以利用新的iPad UI组件。从一开始就遵循MVC设计模式,使你能将大部分开发时间集中到将UI转换到iPad上,而不是浪费若干小时重建整个代码库。但是MVC的重要性不止于此。是的,事情越来越复杂了……
iPhone SDK 3.2引入了一种新的通用应用程序格式。这为开发人员提供了一个简便的途径,可以发行同时包含iPhone和iPad版本的单个应用程序包--因此要使用相应的通用名称。如你所料,如果应用程序被下载到iPad上,就会运行iPad版;如果被下载到iPhone上,就会运行iPhone版。显然,也可以选择仅将应用程序编译为独立的iPad应用程序或iPhone应用程序。
那么现在,假设你决定将应用程序构建成通用应用程序。先展示一个基本示例,从iPhone OS Application模板中选择Window-basedApplication,并从相关产品菜单中选择Universal,用Xcode新建一个项目。
为项目命名后,出现的主Xcode项目窗口将是你花费最多开发时间的地方。你可能已经知道,Xcode IDE是苹果开发人员工具库的核心应用程序。在这里管理项目文件和资源,并通过iPhone Simulator或连接的设备调试和测试应用程序。
在Window-based Application模板的Universal版中,会注意到生成的默认项目将源文件组织成不同的文件夹。在Groups & Files列表中,特定于iPad的文件位于iPad文件夹,而特定于iPhone的文件位于iPhone文件夹(参见图2-5)。到目前为止,这与在同一项目内维持两个不同的代码库没有什么区别,但是先别急着下结论!看到共享的文件夹了吗?除了共享通用的.plist文件,Universal项目还可以共享通用类、数据库、资源并选择控制器和UI视图!
通过在iPhone和iPad版本之间共享通用类,不仅可以消除项目中的冗余代码,而且还更容易维护代码库。在添加某些需要在两个平台上都可用的新特性时,这点变得极其有用。而且如果有一天苹果公司决定将iOS扩展到另一个硬件设备配置,这可能会向你的Universal项目添加第三个平台,那么你又该怎么办呢?通过遵循MVC方法,代码库可以很轻松地适应未来的任何平台。