隆重介绍 Stan

2020 年 4 月 18 日 • 12:00 AM

自从上班以来,自己写 app 的时间就少的可怜——其实也不是真的没时间写,但是上了八小时班,回家总要歇歇。万万没想到倒是疫情把时间空出来了,这短短一个月的 progress 真的能顶过去一年的。

丑媳妇要拉出来见公婆了——你可以在 App Store 下载 Stan 2.0.1,一个模拟胶片效果的相机 app:

Stan 是你口袋中的即拍即得相机。效果拔群的胶片预设让你跳过后期的繁琐,一键即可获得适合分享的照片。

胶片预设效果惊艳——

  • 相机: Ascend——默认的可免费使用的现代风格胶片相机。这款相机颜色丰富、细节突出并接近真实,是你日常出街的好伙伴。
  • 相机: Helix——含蓄的暖色调万用相机,通过调整画面的色彩平衡和提亮中心曝光来获得不一样的色彩效果。这款精心调校的相机完全能胜任风景、静物和人像拍摄。
  • 相机: 帕斯卡——高亮度的黑白相机适合拍摄人像特写。独特的中心高亮曝光让你的被摄对象在画面中明亮清晰。
  • 相机: 55 B——高对比度的黑白相机拥有超强的戏剧效果。通过去除颜色的干扰,这款相机对画面结构、线条和纹理进行着重强调,适合拍摄建筑和反差强烈的风光构图。
  • 相机: 圣克鲁斯——复古风格胶片相机,拥有增强的暖色调褪色效果。你的照片会像上世纪 60 年代的作品,颜色温暖而慵懒却不失鲜明的细节。
  • 相机: Mini Q 800——装配鱼眼镜头的玩具相机可以把所有东西都拍成球形。低质量的颜色效果让乐趣翻番,让你的作品显得怀旧却活泼。

导入之前的照片——在 iOS 相册中把照片加入到 “Stan” 相簿即可在 app 中查看并编辑。你可以用 Stan 为自己的老照片注入新的活力。

包含最新科技——

  • iOS 照片库整合:Stan 利用 iOS 照片库功能,允许你将照片的保存、编辑、整理和删除同步到 iOS 相册。如果你使用 iCloud 同步照片库,你的编辑和修改也会在任何设备中呈现。
  • 非破坏性编辑:你在 Stan 中进行的任何编辑和操作都是完全可逆的——甚至包括你在 app 相机中拍摄的照片。
  • 地理位置标记:Stan 使用 GPS 将你的照片进行标记。你可以在 iOS 相册中看到拍摄每一张照片的地理位置。
  • HEIC 支持:Stan 使用 HEIC 保存照片,让你能够保存更多的照片作品,并在图像压缩时获得更好的效果。

顺便送大家五个内购全部解锁的兑换码,自己用完也可以馈赠亲友——

7TKHLM69N6RY
HW9LNNHA4XTF
ALAYPRLM4TY6
4FYFLAKWMNPF
M6FP4ANFKX7M

一些讨论

一年没发东西我发现自己有很多技术和心得要探讨——

SwiftUI 尚不成熟

过去的一年时间很多都花在了研究 SwiftUI 这个新框架上。抛开任何新框架固有的问题不谈——支持文档不足、开发包少、网上的范例少都是意料之中的事情——SwiftUI 框架的功能只能实现 UIKit 很少的一部分。剩下的内容要么需要 UIKit 进行拼接(通过 UIViewRepresentable),或者需要一些刚刚出现的第三方包进行补充(比如和 UICollectionView 对标的第三方包 “QGrid”)。SwiftUI 的逻辑决定它的子 View 无法知晓任何父 View 的尺寸信息,除非使用非常蹩脚的 GeometryReader……相对 UIKit 使用的 Layout Constraint 的思路而言,SwiftUI 确实能控制信息的单向流动,但是在实现 UI 界面效果上远没有那么灵活。

剩下的时间大量花在了调查 SwiftUI 的 bug 上,比如为什么 popup 和 sheet 的表现在 iPhone 和 iPad 上并不一致,或者为什么边到边的 View 在一些情况下会有一条狭窄的白边……

甚至连 Xcode 的 compiler 都不能胜任复杂的 View 结构,compiler 会直接抱怨 “Xcode could not finish compiling within reasonable time“;一处的代码稍有不对,Xcode 直接在最外层的 View struct 级别报错,对具体的 debugging 过程毫无帮助……

SwiftUI 画了一个很好看的饼,但是吃到嘴里一点都不香。如果你想完全扔掉 Storyboard 进行 UI 设计,并且已经有了足够的经验而无需依赖视觉辅助,完全可以徒手写 UIViewController 的 subclass ——这也是我从 Stan 新版本开始做的事情,没有遇到任何障碍。如果你是因为需要开发时能够实时预览界面的模样,趁早买个 Sketch 自己用手画吧,UI / UX 设计弯道超车早晚栽倒沟里。

Framework 的直接和间接好处

iOS SDK 的 PhotoKit 是在相册管理方面能让 iOS 和安卓拉开十万公里差距的地方,但也是一个需要很多时间投入进行学习、针对自己的 app 写 convenience layer 的地方。得益于之前 HRZN 的积累——无论是对开发包的经验和熟悉度还是之前自己写的能直接被复用的 framework——这次更新 app 在 iOS 照片库的数据处理上走得顺风顺水。在开发过程中我又加入了新的 Adobe Color Cube 的处理框架,可以读取滤镜文件进行颜色效果转换,反过来用到 HRZN 上然后修了一波 bug。

写 framework 的一个好处是自己既是用户也是开发者。很多时候要戴上不同的帽子去思考一个方法和属性该不该设置为 public,甚至需不需要存在。创作 framework 的过程也是梳理一个 app 架构的过程——得抽丝般地剥离 code base 里能够被反复利用的地方,它们也往往是不需要和别的模块写在一起的地方。最近读 Code Complete 学到了很多思路(需要单开一篇),在实践中能够对自己一年前两年前的代码进行反思,有一种复习自己学到的内容的感觉,这些都是制作 framework 带来的额外好处。

The 1-year-from-now you is the most honest and the most critical reviewer of your works. A close second is a-week-from-now you. Everyone else on the planet earth is far behind in the league.

——太正确了。

不得不承认我现在还在写 spaghetti code,代码写完的时候就知道是为了赶进度没有仔细琢磨架构和依赖,但是这留给明年的我来解决吧,他更聪明更有经验一些。

要给自己计时

过去的 20 天我在新款的 app 上花了 48h 27m。过去的 365 天,在 work from home 开始之前我在新款 app 上花了 54h 8m,包括对 SwiftUI、数据模型和系统交互 layer 的尝试。

我发现通过对自己的工作进行计时,我能更好地明白自己的工作效率,以及在各种事情上花费的时间究竟是否值得。比如——

所以说给自己的工作计时还是很有必要的,能够用具体的数字把时间上的投资进行比较。推荐一下 Mac 上的 Timing App 给大家1

用户埋点和数据追踪很重要

不管是用 Google Firebase 还是 Mixpanel 还是其他的用户事件追踪服务,能够从第一个版本就植入追踪模块真的很重要。尤其是早期的事件追踪能够针对购买行为提供更多的上下文信息,比如每一步转化操作的转化率如何,用户的转化渠道是什么,是哪个入口带来了更多转化。这些信息紧接着带来商业驱动的开发需求:转化数量多是因为转化率高还是因为入口总人数多?这会告诉我是该想办法提高提高转化率,还是应该把入口 promote 到更表层提高进入总人数。

此外一些基本的信息——用户的地理位置、推定性别和年龄、推定的兴趣点——都是帮助你了解用户群体的有效手段。通过自定义埋点,我也能了解用户用我的相机都干了什么,比如某一个滤镜似乎非常适合自拍,它同时非常畅销,那么也许我应该设计更多的类似内容;某个功能根本没人用,那么我要考虑把功能去除、折叠进二级菜单来为别的操作腾出空间,还是说因为这是一个付费转化的入口,我要把操作 promote 到表层来加大转化?

这些只是很简单的例子,不过个个都说明了埋点的重要性。独立开发没空搞社群运营,如果连埋点都不做那就真的是个瞎子开发了。

其它

  1. Timing App 至少需要 Professional 版本才能比较自由计时。也在 Setapp 上提供——欢迎使用我的邀请码免费获得一个月试用