notes

最近几个月都在公司开发莫费时app项目,从项目开始的定原型到中间需求修改再到最后的上架AppStore。期间有很多坑,大多都是产品定的需求不明确和UI设计没有覆盖到所有情况导致的。前两个不明确导致提交测试后和测试撕逼,最后反复修改导致时间浪费。

产品原型交付确认

确认里面的功能能不能实现。

这个需要了解app的整个业务,有些比较难看出来。

逻辑上的问题要考虑全。

类似莫费时设备详细页面和报告人页面,每个报告需要绑定一个报告人,报告人页面又是可以编辑,删除,更换默认报告人的,删除了怎么显示,更换了默认报告人怎么显示,点击了返回怎么显示,都需要确定下来。

无网络状态和无数据状态下的提示

所有页面无网络状态和无数据状态下的提示

有些地方确定要不要显示toast。

比如短信发送成功,是toast还是dialog,很多产品经理不清楚toast和dialog的区别。

每个输入框的验证规则。

像姓名输入框应该有长度限制。 密码输入框有密码规则验证。 手机号输入框有手机号验证。 等等…

确认页面需不需要实时刷新。

像这次莫费时项目,有个资讯模块,展示一个新闻列表和新闻详情,在新闻列表中有一个阅读量的展示。有个测试提了个bug,说阅读量不实时刷新,他举的例子是两台手机打开莫费时app,一台手机点了相关的资讯,另一台手机上该资讯的阅读量不会加1。 列表即时刷新又会引起其他问题,一般需要网络请求的刷新会使列表回到顶部。这个提前确认好。

一些推送的信息要不要和当前页面实时刷新

一些推送的信息要不要和当前页面实时刷新

确认键盘的样式

键盘需不需要有toolbar。

UI交付确认

轮播图在不同尺寸下怎么展示

以什么方式展示轮播。根据宽度动态计算高度或者固定高度。

UILabel并排显示不下的问题

如果多个UILabel并排展示,很容易出现小屏手机展示不下的问题,这个时候应该省略哪个UILabel的信息都要定一下。

如键盘带工具条,提供带键盘的UI

如键盘带工具条,提供带键盘的UI

开发中碰到的细节问题

并排展示多个UILabel的处理方案

autolayout中,content hugging priority 代表控件拒绝拉伸的优先级,数字越大,控件越不容易被拉伸。 content compression resistance priority代表控件拒绝被压缩的优先级,数字越大,控件越不容易被压缩。

注意:每个UILabel的hugging和compression priority都需要改变,不然可能会没有效果。
导航栏跟随控制器退出

莫费时app中的我的模块,是隐藏Navigationbar的,这个时候push或者pop一个控制器,最好的效果是跟随控制器一起push或pop。代码如下:

- (void)viewWillAppear:(BOOL)animated  
{
[super viewWillAppear:animated];  
// push的控制器中添加  
[self.navigationController setNavigationBarHidden:NO animated:YES];  \n}\n- (void)viewWillDisappear:(BOOL)animated  
{  
[super viewWillDisappear:animated];
// push的控制器中添加  
[self.navigationController setNavigationBarHidden:YES animated:YES];  
}
提交appstore的构建版本消失

在上传appstore后,在TestFlight栏是可以实时看到提交的app的处理状态的,一般刚提交的应用会提示正在处理。然而有可能处理不通过,就会导致应用消失。这个时候apple会发一封邮件到注册apple账号的邮箱,里面会提示失败的具体原因。

项目成长

模块化开发

目前iOS模块化方案大致分为两类,一种是模块注册形式。另一种是通过runtime调用到各个模块,不需要注册。

莫费时项目中使用的是注册的形式。模块化中分离出接口为各种Protocol文件。项目文件划分如下: 模块划分图

壳工程

主要放置AppDelegate、pch、图片文件等。

各个组件暴露的接口

里面放置了各个模块的接口文件

各个组件

里面是项目的所有业务模块,还有一些调试模块,比如环境切换模块,分析统计模块

管理器

目前就两个管理器,一个登录管理器和定位管理器。 登录管理器负责记录用户信息,缓存用户模型,记录登录状态等。 定位管理器负责获取定位权限,保存反地理编码后的一些信息。

公共model 莫费时项目中没有实现完全的模块解耦,因为组员并不多,采用了公共model下层到底层去的方式,所以项目中会有一些公共model,好在并不多。

公共基础组件 公共基础组件中放置了一些第三方框架,还有自己封装的一些UI空间,工具类。这些组件都是可以在新项目中直接使用的。

单元测试 该文件夹主要给一些模块写单元测试,主要是针对protocol文件夹中的各种接口文件写测试,测试各种情况下接口的正确性。

使用fastlane进行打包和上传

fastlane确实非常好用,极大的缩短开发者打包,上传appstore,上传测试平台的时间。而且fastlane可以配合shell脚本实现自定义功能。只需要执行简单的命令就可以了。

在莫费时中,使用了第三方SDK,在提交appstore审核时需要对sdk移除x86_64和i386架构的二进制文件,需要调用外部shell脚本。

查看文档的命令是fastlane action 命令名