这个月华师匣子的iOS版终于上线,历时四个多月的开发告一段落。我达成了从客户端开发0基础到App Store的成就。四个多月,99次提交,10个内测版本,两次App Store发布,这实在是一个值得纪念的时刻。
这是匣子iOS的Github提交图表:
上个学期我接下iOS版开发的任务时,其实我心里是没底的。没学过iOS是一方面,关键是我也没有任何客户端开发的经验。当时我对客户端开发的了解几乎为0。之前有接触过一点安卓。但iOS这边玄学的StoryBoard和新语言Swift都让我比较没底。
起步
我首先看了斯坦福的iOS开发课程。这个课程是一个非常不错的课程。里面实现一个计算器,代码的结构非常的合理,也充分发挥了Swift的特性。当时我的感觉就是,写APP或者其他业务并不是会调API就好,如果想要写漂亮的代码,那还是需要扎实的计算机基础。
我看着课程,但我并没有跟着写,因为时间不多了。我在了解了基本的MVC架构、StoryBoard中拖控件、拖Outlet和Action、Auto Layout之后,就开始写匣子的几个界面。
当时写了界面之后,就有所感触了。首先Auto Layout的确是一个非常好的布局方式,让我不再怀念CSS。然后,原生APP中首先所有的组件都是有与之对应的对象实例的,这是顺理成章的事情。但在Web这边,组件需要自己抽象,而且在Web Component没有普及之前,没有原生级别的支持。写iOS的过程中我越发明白,DOM其实只是Web界面UI的实现细节。我们要用某种方式去封装DOM,在UI抽象层编写代码。iOS就完全符合这种方式。想来客户端软件理应是这样的。只不过Web技术从一开始并不是为客户端软件打造的,因此这几年前端走的路,基本就是补上之前落下的课。
当然Web前端数据驱动,双向绑定这些,在我看来已经是最前沿的东西了。iOS这边肯定也有。但因为我对前端更了解一些,所以觉得前端要更优雅一些。
最开始做图书馆,于是就遇到了输入框键盘如何收起的问题。点击return,点击屏幕的其他地方都会收起键盘。这里要提到一点,就是这次0基础做iOS,是我第一次在全英文的环境下从头开始学一门技术。这次我全程一行中文都没有看。回头想想,很难想象如何在中文社区解决这些问题。
深入
接下来就是各个技术点的学习了。数据持久化要用Core Data,其实就是一个本地的SQLite数据库。这个我基本是当Key Value存储来用了。对数据库还是不是很了解。然后有触摸事件的处理等等。网络请求用Alamofire和SwiftyJSON。学用iOS的Cocoapad装依赖。
学习的过程中,说起来只有一个比较理论的知识,就是delegate、protocol、extension这些。
之前在看斯坦福课程的时候还不是很了解。后来用UITableView以及需要不同VC直接通信的时候,就慢慢了解了delegate。我对delegate的了解就是一种委托的模式。任意一个实现了对应接口的对象都可以作为委托的对象。后来在安卓那边了解了一下,大致有同样的实现。
UITableView实在是一种很经典的接口设计。除了那几个delegate方法之外,UITableView会对Table Cell进行回收的做法,也让我明白了之前面试时问我的长列表优化问题的答案。在Web端我们也可以控制列表只保留可视区域的DOM元素,来做优化。这样不管列表有多少元素,都可以顺利的渲染。
课程表
课程表一度是我迟迟不愿意动手的一个模块。其实匣子里大部分模块的逻辑都是简单的查询和拉取数据。课程表也不例外,但课程表的View相对来说比较复杂。我咨询了安卓的同学之后才知道要自己画View,自己handle触摸事件。于是就写了一个双向的滑动,在触摸事件中修改View的偏移。
画课表的格子也花了我一段时间,最后算是解决了。后期还要再完善。课程表的实现让我得以一窥iOS开发的常态———自定义View。实际上大部分的控件应该还是需要自己来写的,毕竟大家的APP看上去都很Unique。
iOS的View可以自定义drawRect方法。这应该就是暴露了底层的2D绘图API,类似于Web中的Canvas。
收尾
其他大大小小的问题还有很多,比如我一度纠结于如何取消Navigation bar上面返回按钮的文字,结果发现在Story Board里面的Back Button打一个空格就行了。踩了很多坑,有一个很大的坑就是我一度用中文做了包名,导致后来数据迁移一直报错。
Banner的话,最后是用原生的UIPageView实现的。之前一度以为要自己实现一个。想来自己的水平还是不够的。
后期陆续完成了数据迁移,远程推送,本地推送,闪屏处理,还有和后端元信息API的整合。
上线的时候,担心我们的服务器不支持IPv6,担心不会过审。不过最后很顺利的过审核了。苹果的工作效率没有想象中的那么低。
苹果要求HTTPS和IPv6,Safari10支持全部ES6属性。这意味着苹果一直走在时代的最前沿。在这一点上我要给苹果点赞。
这次iOS的开发算是让我获得了iOS的初级开发经验,点亮了客户端开发的技能点。为后续我的Hybrid研究开了一个好头。
关于Swift
Swift给我的印象还是很不错的。静态类型,经典的面向对象,外加和JS类似的函数式特性,我用起来觉得很顺手。OC看起来太恐怖了,如果不是有Swift,想来我也不会鼓起勇气去写iOS。Swift未来还会进军服务端,虽然是Apple自家的东西,但开源了,想来发展应该会是不错的。