第一个 iOS 项目的学习与开发记录

/ Design, Dev, Life

今年七月的时候,心血来潮想自学 iOS 开发,于是翻起了不久前买的 iOS Programming: The Big Nerd Ranch Guide 一书就这么开始了。到了八月中旬,慢悠悠地看完了这本五百多页的书。几天之后,开始了我的第一个习作 Time Flow 的开发。

Time Flow 是个简单的时间记录工具,你可以记录现在正在做的事情,然后这个 App 会自动帮你记录时间。当你做完了这件事情后,在 Time Flow 上完成这件事,它就会被记录在今天的 activity record 中。这是一个非常简单的 App,只用了两个 View Controller,底层数据也非常简单。

除此之外,Time Flow 还有一些有意思的小特性:

  • 在主界面中,有两层的水波动画(本质是两条正弦曲线),水波的高度表示了现在所处的时间。凌晨时水波在最上方,快到半夜时水波在最下方。在大多数人的工作时间时,水波刚好处在界面中比较好看的位置。这也是应用叫做 Time Flow 的原因。

  • 你可以通过 Time Flow 使自己专注。若在新建记录时,选择了 Work、Study、Workout、Reading 的类型,那么 Title 会变成「Focus on」。App 还可以根据 iPhone 的充电状态来控制屏幕不会自动变暗,如果你使用 iPhone Dock,插上 iPhone,调出 Time Flow 的主页面,它就能时刻提醒你当前 focus 的事情了。

  • Time Flow 会用一个饼状图表现每天的时间记录。但这个饼状图与市面上大多数时间记录 App 所用的饼状图都不太一样。其他的饼状图只显示已经记录的事件的时间分布,而对于那些没有记录的时间,则不会显示。这样的数据可视化并没有什么价值。而 Time Flow 的饼状图会将一天内的所有时间如实显示,也就是一圈刚好是 24 小时,你做的事情放在一天的范畴来看占比几何,一目了然。

  • Time Flow 会发送 local notification,以防用户忘记完成时间。但是若你选择了 Sleep 类型,那么这个 notification 会在八小时后出现。

开发过程

Time Flow 的核心功能用十天的业余时间完成。

第一天(周一)构想了这个 App 的主要流程和界面,简单设计了一下交互,简单看了看 App Store 的一些同类型应用。

第二天(周二)设计数据层。本来想用几个类作为事件的容器,通过 Archive 的方式做数据持久化,但这是条弯路。经过同事夏天的指点,选择用 Core Data 作为技术方案。由于不了解 Core Data,当天晚上的时间就在 objc.io 上学习 Core Data。

第三天(周三)基于 Core Data 完成数据层,并写了个简单的测试界面,完成了数据层的测试。

第四天(周四)完成了一个数据接口类,封装了 Core Data 的操作,并且实现了业务逻辑,改进测试界面并成功测试了这个接口类。

周五和周六暂停了两天。

第五天(周日)开始写界面,完成了新建事件时,选择类型的控件。这是我完成的第一个自定义控件。

第六天(周一)完成主界面的逻辑。

第七天(周二)利用 PNChart 开源库实现饼状图展示,写了个简单的将事件转化为时间段的方法,用包含极端情况的数据完成测试。

第八天(周三)利用并修改了 MZDayPicker 这个开源的日期选择控件,完成显示记录的 View Controller 基本结构。

第九天(周四)在记录的 View Controller 中添加自定义的 Table View Cell。

第十天(周五)视觉设计,添加各种状态的所有按钮、切图、色彩选择。创建了一个能够很方便修改颜色的工具类。

至此,Time Flow 已经基本成型了。剩下的工作(包括:主界面的动画微调、视觉设计微调、Bug Fix、屏幕亮度判断逻辑、Local Notification 逻辑和其他各种小改动)在后面两周边偷懒边完成了。

8月26日,成功加入 iPhone 开发者计划(期间还跟美国苹果通了个电话,解决了 Apple ID 资料乱码问题)。

到9月3日为止,搞定了各种证书、支付设置、App ID 等所有你能想到的任何跟提交相关的问题。在这之后一天,也就是9月4日,Time Flow 提交到 App Store 等待审核,定价 0.99 美元(也就是6元人民币)。

心得

最初开始学习的原因,主要考虑两点:一是苹果新出了 Swift,本来以为可以用这个全新的语言开发,而不用管 Objective-C 的奇怪语法了;二是 iWatch 要出了,如果能率先做 iWatch 的开发者那也是极好的。

结果,Swift 在我看了官方文档后就再也没碰过了,反而熟悉了 Objective-C 并且一直用 Objc 完成了开发。而对于 iWatch,这个产品短期来看貌似不开放 SDK。哈哈。

不过虽说如此,收获也是挺多的。

进一步理解 iOS Design

举个最基本的例子:我所见过的很多设计师都将 push/pop 动画,和 modal view 的 present 动画(通常为从下往上弹出)单纯地理解为两种不同的页面切换动画。然而,若是从代码层面来看,这两件事情是完全不同的:Push/pop 动画是基于 Navigation Controller 的,换句话说就是为导航而生的切换方式;而 present/dismiss 的意义只是显示一个暂时的页面,而其与 presentingViewController 的关系也显示出了其在页面层级中的定位。

知道这个有什么意义呢?我的答案是,理解整个 iOS 系统从设计之初的意图。上面说的设个区别,从设计师的角度来看也许是奇怪的,但是再以苹果的角度仔细想想,其实是非常合理的。从技术层面了解 Push/pop 和 present/dismiss,更能够体会 iOS 的意图,并且在今后的设计中更加合理地利用这两种 View Controller 切换方式。

通过研究 iOS 中各种控件和内容视图的 API,可以更好地理解这些控件,并且能够发现很多在平时设计中忽略的细节和特性。

再举个例子:Table View 有 Grouped 和 Plained 两种 Style,而这两种 Style 在设计上的区别是什么?虽然我之前在实际设计上都用对了,但并没有明显地提出或意识到这两种 Style 在设计上的区别,也没用对这两种 Style 提出更加通用化的设计场景和规则定义(在微信 Webview 交互设计指南中有撰写相关部分,感兴趣可以去查看)。这些都算是新发现。

理解实现方法

在 iOS 中写动画是有趣的,也是复杂的。虽然 Time Flow 中只使用了最基本的 UIView Animation,但至少也知道了 Core Animation、View Controller Transition、UIKit Dynamics 等多种实现动画的工具和方法。对于一个效果需要用多少成本实现、通过什么技术手段实现,也略知一二了。其实自己对后面三种动画兴趣很大,说不定会做些什么奇怪的东西自己玩呢。

除了动画之外,其他方面的实现方法和成本,我也都有一个浅显的印象了。

好多第一次

  • 第一次用 MVC 设计模式开发,对 MVC 有了更好的理解,并且接触了 MVVM 的概念;
  • 第一次使用 Core Data;
  • 第一次大量读代码,帮我使用的开源库 Debug,基于视觉设计修改了开源库的展示层代码;
  • 第一次大量读技术文档,越读越爽,读出了快感;
  • 第一次写界面和动画;
  • 第一次提交应用到 App Store。

终于搵返哩种感觉

自从办公室搬到了 T.I.T 创意园,就好久没有体验心流状态了。因为这个办公空间实在太大、太开放了,以至于在任何时刻都非常吵闹,并且经常有人就在你旁边讨论,然后拉上你去开会。

这次的开发过程,我躲在家里的白色书桌上,找回了久违的心流感觉。那种思维连续不断,思考效率一路狂飙的感觉真是爽爆了(当然这么做的副作用就是失眠)。

这是一个好的开始。如果这种状态能延续到阅读和吃零食中,那就更好了。

遗憾

最大的遗憾是:对于 iPhone App 而言,现在入场已经太晚了。但我们还有 iWatch,虽然它暂时不开放 SDK。

其他的遗憾有:

  • 由于偷懒,很多地方的代码结构都不是很好,有些实现方法很脏,需要找机会重构一遍;
  • 这个 App 在技术上完全没有难度,无论是 Core Animation,还是 Core Data 的进阶用法,我都还没涉及到;
  • 虽然我写了一些代码让界面能够自适应,但马上大屏 iPhone 就要发布了,而这个 App 目前来看,还不能在大屏 iPhone 上得到最好效果;
  • 由于偷懒,这个版本没有写 About 页面,也没有加入 App Store 评分提醒,没有加入任何收集用户数据的代码,也没有提供一个撰写用户反馈的入口。

最后感谢虾神 @txx 的支持和指导,在他那里我得到了很多建议、工具推荐和最佳实践。

comments powered by Disqus