1.1 新建一个项目
很久没有新项目从头开始做了, 新建一个项目操作都淡忘了, 这里回忆一下.
测试平台: macOS 10.15.1, Xcode 11.2.1(11B500), 早期的操作与现在的操作基本大同小异, 可以融汇贯通.
选择 iOS > Application > Single View App > Next
$ Product Name: 项目名(可以根据需求取名, 安装到手机上的产品名称基于它, 但两者无必然关系, 产品名可以自定义), 这里使用Demo作为项目名
$ Team: 选择已经登录的开发者账号
$ Organization Identifier: 一般是域名倒过来(新浪就是com.sina, 百度就是com.baidu), 因为域名是唯一的
$ Bundle Identifier: 包名, 自动生成(由Organization Identifier + Product Name构成), 由于域名的唯一性, 就可以保证在同一公司内, 产品的包名不会重复.
$ Language: 开发语言, Swift跟Objective-C, 因为他们可以混编, 那么也就是说两者皆可, 但是还是优先选择你自己主打的开发语言
$ User Interface: 就一个选项, Storyboard.
1.1.2 基本配置
在新建的项目中, 有很多文件, 分四组, Demo, DemoTests, DemoUITests, Products
先将注意力集中在Demo文件夹上, 它里面有
$ AppDelegate 见名知义
$ SceneDelegate, 这词读/si:n/森~音, 不是塞尼, 也不是正弦函数sin, 他是iOS13出来的东东, 也是第二步再讨论, 先让我们把第一步慢慢走好, 所以删掉它!
$ ViewController, 演示要用, 暂时不删, 实际上商业项目中它都是要被删掉的.
$ main.storyboard, 由于我习惯代码构建项目基础, 这个基本上不用, 所以, 我习惯删掉, 当然也不是一删了之, 删掉后有一些操作要做, 不然项目跑不起来.
$ Assets.xcassets, 管理app图标, 启动页等等项目级图片
$ LaunchScreen.storyboard, 暂时先不要删, 这里不聊如何代码控制LaunchScreen(放广告), 而且没有它影响后面我要用到的[UIScreen mainScrren].bounds值.
$ info.plist, 项目中要用到的基本配置信息都在这里
$ main.m, 项目启动入口文件, 它之所以是项目入口, 不是因为它文件名叫mian, 而是它里面有一个叫main的函数, 这个才是一个程序的入口函数(C语言程序,
或者base on C语言的程序(例如: OC), 入口函数都是main), 学C语言的小老板们都门清, 至于包含main函数的文件名并不重要.
配置:
1.1.2.1, 在工程下新建一个Group, 取名: Supporting Files, 这个在以前的版本中默认是有的, 不知从几时起, 被取消了.
那么这个Group用于放什么呢?
放工程里最初始的资源文件,
$ Assets.xcassets
$ info.plist
$ main.m
在做一个商业级项目时, 不管其规模如何, 都应该把工程做好分组, 方便自己, 也方便他人后续的扩展, 维护.
第一级,
比如微信, 四大基础模块"微信", "通讯录", "发现", "我"
那么最起码分4个Group, 可能还有几个工程级公用模块, 比如数据持久化模块, 网络接口模块, 工具模块, 根据需求也可以跟产品基础模块平级
第二级,
在第一级的内部, 再根据设计模式来分, 比如mvc, 就分3个group, Controllers, Views, Models
1.1.2.2, 文件配置
前面在1.1.2里面, 我是把很多文件给直接删掉了, 那么不出奇迹, 此时的工程是跑不起来的(或者跑起来立马就crash)
@1 如上图所示, 在工程中找到Build Settings > Packaging > Info.plist File, 修正他的路径值
这里需要特别说明, 我们在工程里面新建Group的时候, 有两种选项,
$ New Group: 创建新的Group, 同时在工程目录中创建对应的文件夹, 那么其内部的文件相对来说路径值已经改变,
$ New Group without folder: 只在工程中创建Group, 但不生成对应的文件夹, 它仅仅表示一种逻辑关系, 路径值并没有变
那么, 刚才我新建了Supporting Files, 同时工程内部也存在对应的文件夹, 那么我把info.plist拖进去以后, 它的路径就由/Test/info.plist变成了/Test/Supporting Files/info.plist
@2 由于我删除了main.storyboard, 那么在工程General选项卡里找到它删除(如果Launch.storyboard被删掉了, 也要找到他的配置项删除其值)
还有在info.plist文件中 Application Scene Manifest配置以及他的子配置都可以删除.
@3 我们没有使用到SceneDelegate, 那么关于它的都可以删除, 包括上图中info.plist中Application Scene Manifest配置项整体删除, 关于SceneDelegate后续在聊
还有AppDelegate.m中也有关于SceneDelegate的代码, 统统删掉
@4 配置rootViewController, 因为我们这里是测试, 就不搞那么复杂, 直接用工程自带的那个ViewController
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
CGRect frame = [UIScreen mainScreen].bounds;
UIWindow *window = [[UIWindow alloc] initWithFrame:frame];
window.rootViewController = [[ViewController alloc] init];
[window makeKeyAndVisible];
self.window = window;
return YES;
}
如果发现LaunchScreen.stroyboard误删除了, 那么[UIScreen mainScreen].bounds;获取到的值就不够准确, 如果LaunchScreen.storyboard并没有删除, 但是发现获取的屏幕尺寸依然不准, 可以检查info.plist, 是否有一项"Launch screen interface file base name", 它的值是"LaunchScreen.storyboard", 如果没有, 或者值错误, 请自行纠正.