在开发项目之前,我们需要做一些准备工作,了解iOS扩展——Objective-C开发编程规范是进行开发的必备基础,学习iOS学习——Xcode9上传项目到GitHub是我们进行版本控制和代码管理的选择之一,明白iOS学习——iOS项目Project 和 Targets配置详解则更利于我们今天对完整项目开发环境的搭建,这些内容在在之前的博文中都已经有了一些总结和步骤说明,具体详情可以戳链接查看。
开发一个完整的App,不同于我们平时学习和练习时随意新建一个project,然后写我们示例代码就完了。要开发一个完整的App。有一定的开发流程,而且一般而言,在开发过程我们都是多人合作,每个人负责一部分功能模块的开发,最后进行合并、调试、测试、上线等流程。那么在项目开发的最初,我们需要对我们的App的开发环境进行搭建,在一个App开发之初,环境搭建主要包括如下几个部分。
在我们最初创建项目的时候,App的名称和我们的项目名默认是一样的,一般而言,我们的项目中命名是不用中文的,所以基本上App应用名和我们的项目名称是有区别的,因此,在项目刚开始的时候,App的名称是需要修改确定好的。目前有三个地方可以直接修改App显示名,这三个地方修改器中一个,另外两个会自动修改过来,具体操作如下图所示。
在项目开发过程中,我们一般需要对项目中所有的类加上一个前缀以区分是我们自己创建还是第三方或者系统自带的类,这个前缀是自定义的,一般设定为公司名的英文缩写或首字母,个人开发的可以随心设置,设置界面如下图所示。
这里除了设定我们的类名前缀之外,还额外标注了另外两项的设定方法:
一般而言,我们的应用软件的方向都是竖屏正向的(游戏除外,一般的游戏都是横屏的) ,所以我们在进行项目开发之前可以先把设备类型、屏幕的方向等确定下来,这也方便我们进行应用图标和启动图片的剪切和设置,屏幕方向的设置界面如下图所示。
这一部分的内容有一些在iOS学习——iOS项目Project 和 Targets配置详解中有讲到,主要是通过设置target的部署属性来设定该App安装到手机上一些状态。通过上图我们可以看到:
例如,在开发类似王者荣耀的游戏时这里的几个选项应该是设备类型选择Universal,设备方向是左横屏 + 右横屏,勾选隐藏状态栏,同事也勾选需要全屏。
如何设置y8ingyong图标和启动图片我们在iOS学习——iOS项目Project 和 Targets配置详解中已经详细进行讲过了。设置界面如下图所示,这一块主要设置应用图标和启动界面,其中启动界面有两种设置方法:通过设置启动图片或者通过设置启动界面文件来启动,启动图标和启动界面对不同的机型的设备所需要的尺寸是不同的,具体应用图标和启动页面的大小尺寸介绍见官网:Human Interface Guidelines。
App icon Source(应用图标):对应着文件资源Assets.xcassets目录中的AppIcon中的图标,如下图所示。最右边的面板可以选择添加哪一种或哪几种设备上的图标,每一个型号的设备上的图标的尺寸是不同的,具体需要多大尺寸的图标可参见Human Interface Guidelines。在中间有一个个的小格子,我们将所有切好的图标直接拖过来,他们会自动找到自己应该放在的格子里。这些小格子主要分为四类:
Luanch Image Source(启动图片)和Luanch Screen File(启动页面文件)都是用来设置我们的启动界面的。首先大家可能会很奇怪,为什么每个App启动时都会出现一些启动图片或广告或动图,很烦人对不对?但是启动图片是必须的,原因有两点。
刚刚我们说过了,Luanch Image Source(启动图片)和Luanch Screen File(启动页面文件)都是用来设置我们的启动界面的,那么他们之间有什么区别呢?
两种方法之间主要的区别在于启动文件的优先级高于启动图片,也就是说如果两个都设置了,那么启动页面以启动文件为准,如果都没有设置,则应用会黑屏。
在一般的项目开发中,我们一般都只使用启动图片设置启动界面(现在由于storyboard应用得比较多了,也有很多采用设置启动文件的方式来设置启动界面的,大家根据自己的需求和习惯进行设置都可以的),由于启动文件的优先级高于启动图片,所以我们需要将启动文件后的文件名删去,此外我们还需要将项目中的LuanchScreen.storyboard文件也给删去,这是因为App在启动时系统会自动查找LuanchScreen.storyboard的文件进行加载,所以我们需要进行这两步,具体如下图所示。
现在新建一个project时,xcode会默认主界面是通过main.storyboard设置App的主界面的,而设置主界面的方法除了这个还有另外一个方法就是通过代码的方式进行设置。那么系统是怎么判断我们是如何设置主界面的呢?这个问题就涉及到一部分启动流程的问题。
我们都知道,项目运行的起点是main函数,在我们的iOS项目中也不例外,我们可以看到,项目中有一个main.m主函数,这里面只有一个方法就是我们的main方法,代码如下,很简单。
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
这个主函数的作用主要是有以下四点,最后一点则告诉我们系统是如何选择我们设置了主界面的。
在实际的项目开发过程中,一般而言我们都是采用纯代码搭建框架,并不会用storyboard去构建我们的App,因为项目中必然涉及到非常多的界面以及互相之间的跳转,用storyboard控制逻辑会显得很混乱,而且我们一般都是多人合作开发一个项目,用storyboard则无法进行多人协作的方式。所以,要采用手动设置主界面需要分为两步:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//初始化当前window并设置其大小
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
ViewController *viewController = [[ViewController alloc] init];
//设置当前window的主控制器
self.window.rootViewController = viewController;
//设置主界面并显示
[self.window makeKeyAndVisible];
return YES;
}
对于一个比较复杂的项目,我们再开发过程中肯定不能把所有的文件都直接放在一个文件夹目录下,我们需要搭建目录结构对其进行层次化和结构化管理,这样便于我们在出现问题时快速定位到个功能模块上。对于项目的目录结构,没有统一的规范,主要是方便我们队我们的项目模块进行区分。
这里比较推荐的两种搭建目录方法如下:
项目目录
├── ThirdLib(三方库)
│ ├── SDWebImage
│ └── AFNetworking
├── Framework(自己封装的类库)
├── General(通用类目录)
│ ├── Class(通用的类,比如自定义父类)
│ └── Helper(通用辅助方法)
├── Main(程序单一入口,仅放AppDelegate区分其他文件)
│ ├── AppDelegate.h
│ └── AppDelegate.m
├── Model(数据模型类目录)
│ ├── Macro(宏定义目录)
│ ├── BLL(业务逻辑层目录)
│ ├── DAL(数据访问层目录)
│ ├── Entity(自定义实体目录)
│ ├── Request(网络请求类目录)
│ ├── Location(定位服务类目录)
│ └── Socket(Socket类目录)
├── Module(功能模块目录)
│ │
│ ├─── ModuleA
│ │ ├── ViewControllerA.h(视图控制器头文件)
│ │ └── ViewControllerA.m(视图控制器m文件)
│ ├── ModuleB
│ ├── ModuleC
│ ├── ModuleD
│ └── ModuleE
└── View(视图类目录)
└── MyTestView