Featured image of post 我用 SwiftUI 写了一个 V2ex 客户端

我用 SwiftUI 写了一个 V2ex 客户端

记录一下最近关于使用 SwiftUI、SPM、Xcode Cloud 的一些体会,同时分享一下 V2exOS 这个开源项目的诞生过程

关于 SwiftUI

自 WWDC2019 苹果发布 SwiftUI 来已经三年了,直到最近我才体验了一把 SwiftUI 在苹果人机交互技术生态中带来的变革,从浅浅的使用体验下来感受最强的几个点:

  1. 迟到的 “命令式 -> 声明式” :做为老一批 iOSer 在没接触 React、没接触 Flutter 之前,各种 pushViewController()/addSubview() 的命令式操作或许体感并不强烈,了解和体验真正的虚拟 DOM + 声明 UI 后瞬间感觉世界的美好,设计和算法对研发体验、架构的影响之强烈。
  2. 这次或许是苹果认真做多端统一了:当然 UIKit 一直统一着 iOS, iPadOS, tvOS,但是 macOS 仍然是同等对应级别的 AppKit 却和 UIKit 截然不同,过去由于 iPhone 的畅销引起 iOS 生态(基于 UIKit)盛极一时,无论是开源社区还是人们的经验沉淀,但 macOS 上的 AppKit 由于低层的分裂生态应用明显弱于 iOS,对于企业来说维护一个 macOS 客户端带来的成本也相对较高。SwiftUI 的出现从渲染层、控件层摈弃历史包袱真正开始考虑多平台一致性。

灵感来源

V2exOS 的灵感源自我逛 GitHub 无意间看到的一个叫 RedditOS 的 Reddit 客户端,也是用 SwiftUI 编写,UI 非常有 macOS Native 风,加上平常经常逛 V 站,搜了一下 iOS 客户端社区有很多, macOS 客户端还没有人做过,基础 API 都还算齐全,于是想着做一个 V2ex 社区的 macOS 客户端来练练 SwiftUI 的手。

RedditOS

SPM (Swift Package Manager)

V2ex 相对来说有比较完善的 RESTful API 设计,其 API 2.0 Beta 也是增加了 Access Token 的认证机制,这也是我选择基于 V2ex 来做的原因之一。

既然站长有设计标准的 API 规范,那其实可以可以有一套某种语言实现的 API 包装,不用每个做客户端的小朋友都去写一个 Network Service 层,基于这一点我单独 po 了一个包叫 V2exAPI,一个 V2ex API 的 Swift 封装,支持 iOS/macOS,通过 SPM 引入并支持 Swift5.5 的 async/await 语法。

Xcode 将 SPM 集成的很丝滑(前提是你得有访问丝滑的网络环境),相比 CocoaPods 免去了 pod init/pod install 等步骤,只管加依赖、运行你的项目,只是如果遇到网络不给力,可能还是需要切换到终端走代理拉取。

xcodebuild -resolvePackageDependencies -scmProvider system

Xcode - Swift Package Manager

Xcode Cloud 体验

V2exOS 一直都通过 Xcode Cloud 进行 TestFlight/AppStore 分发,相比 Jenkins 的高运维成本,Bitrise 的配置成本,总体感觉 Xcode Cloud 的体验还是要领先一大截的,几个优势:

  1. 你不用再关心什么是 “证书”,只管构建!!!
  2. 构建完成等同于自动上传 AppStore 待发布,不需要再通过 Xcode Arichives/altool 等工具上传了(网络不好传半天)
  3. 构建速度还行(以 V2exOS 这样的小项目为例,Archive 时间 6 分钟)

当然也存在一些特有或共性问题:

  1. CocoaPods 不是一等支持公民,用它就慢!(V2exOS 只用了 SPM)

Xcode Cloud

广而告之

第一次尝试去宣传一个开源项目,在 V2ex 分享创造板块获得了 7000+ 次点击 + 70 人收藏,然后做为《科技爱好者周刊》的忠实读者,突发奇想要不也去自荐一下,没想到很快被阮一峰老师给收录进了第 225 期,那几天也带来不少的流量。

在发布一个半月的时间,GitHub 星星数量突破了 500 ✨

V2exOS GitHub star history

开源的魅力

更多人知道这个开源项目后,有不同的人以不同方式参与进来,通过 Issue 提报缺陷,通过 Pull Request 贡献 feature,“开放” 和 “兴趣” 把大家连接到一起,这就变成了一件更有趣的事情了。

comments powered by Disqus