Android 工程师开发 iOS 是怎样的体验?

11,519 阅读10分钟

Hello 各位朋友好久不见😂,好久没有更新公众号了,为什么没有更新,是因为我最近一段时间都在写 iOS 应用,终于在前几天完成了自己的第一个 iOS 产品的开发工作,大概在明年一月初的时候这个 App 会上线,一款非常有意思的应用,你们可以期待一下。

正好通过这次尝试开发 iOS 的机会,写一篇文章分享一下开发 iOS 的体验,如果你和我一样之前是一名 Android 工程师,那么希望我的经历可以帮到你。

正如标题所说:Android 工程师开发 iOS 是怎样的体验?这篇文章我会为大家对比我在 Android 和 iOS 两端不同的开发体验。

开发语言

目前主流的 iOS 应用都在使用 Swift 开发,Swift 已经发展到 Swift5,关于语言的话,极力推荐直接使用 Swift 作为开发语言,至于 OC,现在谁还用 OC 啊?如果在前两年作为 iOS 开发者可能会经常为 Swift 而头疼,因为 Swift 每一次的大版本更新,API 都会有很大的改动,升级起来很痛苦。我的 iOS 开发最早使用的是 Swift4,印象中升级 Swift5 的时候几乎没有大的改动,目前 API 已经趋向稳定,所以如果你想要尝试 iOS 开发的话,Swift 是首选开发语言。

同样,Android 也经历了开发语言的切换,在 17 年的时候我就从 Java 切换到了 Kotlin 来开发 Android,还记得当时在写 Kotlin 的时候,遇到不会写的代码都是问隔壁的 iOS 同事,因为 Kotlin 和 Swift 语法真的很像,如果你有 Kotlin 的开发经历的话,那么你应该可以无障碍的读懂 Swift 代码。

所以作为 Android 工程师,得益于 Kotlin,语言不会成为你尝试开发 iOS 的阻碍。并且无论是哪种语言,都是同样的编程范式,同样的数据结构,同是面向对象编程,相似的架构模式,不同的只是 API,API 的问题最好解决了,查文档就行了呗。

对于我个人来说,在开发 iOS 的时候,并没有去专门去花时间学习 Swift,因为真的和 Kotlin 太像了,几乎无成本迁移。

如果从灵活简洁的角度给 Kotlin 和 Swift 来打分的话:Koltin 我给 9 分或更高,而 Swift 最多只能到 8 分。也可能是我学艺不精,在常常写 Swift 的代码的时候,我都在想如果是 Kotlin 这段代码可能会写的更爽一点,例如下面这个空判断,大家可以感受一下 Swift 和 Kotlin 的区别:

// Swift
let user: User? = User(id: "1", name: "2")

if let user = user {
    print(user)
}
val user: User? = User(id = "1", name = "2")

user?.also {
    print(it)
}

虽然几乎一样简洁,但是我是用 Kotlin 一个 ?写下来有种一气呵成的感觉,而 Swift 要写一个 if 一个 let ,诸如此类的小细节还有很多,写多了就会感叹还是 Kotlin 爽啊。

在语言方面我更喜欢 Kotlin。

IDE

iOS 使用 Xcode 作为官方 IDE 最新版本是 11.3,Android 使用 Android Studio 作为官方 IDE,最新稳定版 3.5.3,最新预览版是 4.0,4.0 有了众多的更新和升级,如果你想了解 4.0 最新进展,可以看我之前发的这篇文章:Android Studio 4.0 最新进展

我们先说正常的使用体验,写代码的时候,不得不说 Xcode 真的经常会抽风,高亮时不时就没有了,点击详情查看 API 定义的时候,经常出现一个大大的问号,提示找不到, 变量跳转不够智能,经常会点击跳转到另一个相同变量名的类中,而并不是这个变量真正所处的位置,我曾经遇到一个很蛋疼的问题,Xcode 无法对修改的代码编译生效,只能重新安装,真的是让人头大。

同时如果你用 Xcode 写 SwiftUI 有一个很致命的 bug,就是报错信息会提示在错误行,这样导致我在排查错误的时候很痛苦。

相反对比 Xcode,Android Studio 的开发体验真的是很棒,可能是基于 IntelliJ 。jetbrains 系列的 IDE 都很棒,很稳定很强大,至少我是用 Android Studio 有种很舒服的感觉,也可能是由于我的先入为主,不过据我之前的了解,Xcode 抽风是 iOS 开发人员公认的问题,经常听到他们吐槽。

我们再聊聊第三方依赖,从 Android Studio 诞生起就使用 Gradle 来依赖第三方库,在 AS 2.0 之前第三方依赖最大的阻碍就是网络问题,常常由于网络太差而无法完成编译。Xcode 最常见的是使用 Pod 来安装依赖,Pod 是一个第三方的依赖平台,在 18 年 Xcode 推出了自己的第三方依赖工具,Swift Package Manager,直接通过 Github 拉代码,比 Pod 方便了不少。就第三方依赖来说,二者相差不大。

由于 iOS 完全闭源,所以在开发的时候遇到一些问题,有时不知道从何下手,报错的时候直接抛出一个栈地址,看得我一脸懵。Android 是开源的,所以我们在调试的时候,可以一步步 debug 到源码里面,在解决 bug 上面方便不少。

在 IDE 方面我更喜欢 Android Studio。

声明式UI

今年的 Google I/O 和 Apple WWDC 不约而同的推出了声明式 UI 组件,SwiftUI 和 JetPack Compose,之前写过一篇文章:JetPack Compose 最新进展,感兴趣的同学可以看一下。

我的新产品大部分都是使用 SwiftUI 完成,部分使用 UIKit。使用过之后,声明式 UI 真的很方便,而且 SwiftUI 和 JetPack Compose 以及 Flutter UI ,在语法上面也非常相似,有些人抱怨声明式 UI 代码写起来嵌套太多,很乱,我个人觉得这根本不是一个问题,抽象和组合是一个程序员最基本需要具备的职业素质,写之前仔细思考一个如何设计代码,很大程度上就能避免嵌套臃肿的问题。

声明式 UI 最大的便捷之处,就是所写即所得。极大的减少了代码量,之前如果写一个复杂界面需要一天时间,那么使用声明式 UI 会节省你一半的时间。

虽然我很喜欢声明式 UI,但写了这么久的 SwiftUI 它目前的缺陷也很明显,SwiftUI 并没有完全实现原有 UIKit 的全部功能,如果 SwiftUI 没法实现,就需要自定义一个 UIKit 的 Warpper,但这并不能完全解决问题,SwiftUI 与 UIKit 混用目前仍有一些不可预见的 bug。

同时 SwiftUI 刚刚推出,很多最佳实践都没有,大部分人都在踩坑的阶段,bug 很多,而且是无法解决的 bug,我在 Github 上面开一个叫:SwiftUIBug 的库,来记录目前为止我使用 SwiftUI 遇到的 bug,并提供解决方法,避免别人继续踩坑,有兴趣的朋友可以持续关注一些。

说了这么多,怎么都在说 SwiftUI 呀?JetPack Compose 怎么样呢?

嗯.... 这么说吧,SwiftUI 的文档至少还有好几页,而 JetPack Compose 只有寥寥的一页,而且我体验了官方放出的 demo,现在的完成度,别说生产环境了,就连 demo 都有很多 bug,至少在生产环境使用 SwiftUI 写一些简单的页面还是没问题的。

所以我的观点是,iOS 开发中如果是简单的页面可以用 SwiftUI 实现,复杂的就用 UIKit 吧,毕竟万一 SwiftUI 不支持,那绝对会坑死你。而 JetPack Compose,我们至少要等正式版出来看看完成度怎么样,现在一切尚早。

对了 SwiftUI 最低支持 iOS 13,所以想要使用的同学谨慎考虑,而 JetPack Compose 没有这个限制,自 AndroidX 出现,Android 已经在规避 API 更新随着 Android 版本的发布而更新,而采取独立的第三方库来使用。

在声明式 UI 方面我给 SwiftUI 打 Call。

产品体验

这方面我是站 iOS 的,我认为 iOS 仍然是目前最好用的系统,无论是从 App 体验还是生态方面。关于体验来说,iOS 给人的感觉是值得信赖的,举个例子,对于很多 UI 的细节,iOS 支持的很好,而 Android 永远给人一种半成品的感觉。

Android 上面的卡顿是一个很常见的问题,即使你时刻小心翼翼的写代码,仍然会有卡顿的问题产生,而 iOS 真的只要不是太糙的代码,几乎不会有卡顿发生。

如果你细心观察,同样的 App iOS 端的体验一定要比 Android 端要好的,这和开发者的能力无关,系统差别就在这里体现了。不可否认 iOS 有很多优秀的应用,非常棒的交互和体验,在之前我翻遍了整个 Google play 想找出一个可以媲美 iOS 一样优秀体验的应用,不过可惜没有,就连同样在 Android iOS 双平台都上线的 Apple Music 两者之间的差距都相差不少。

API 体验

就最近几年的发展,iOS Android 两边一直在互相借鉴,功能趋向一致。iOS 的 API 设计一致都是很具有前瞻性的,而 Android 由于碎片化那几年,真的是留下了不少坑,Android 开发者真的是太痛苦了。据我个人感觉,iOS 的 API 非常成熟,开发起来要比 Android 整体速度快很多,很多效果以及需求,iOS 自身都有很好的解决方案,我们只要专注需求就好。而 Android 很多就像是之前说的半成品,什么都要自己去研究半天,iOS 分分钟就能撸出个原型,Android 还需要苦逼的做技术调研。就那阴影和毛玻璃来说,Android 也能做,但是效果就差很多。

iOS UIKit 中使用 AutoLayout 来布局,写起来虽然有些繁琐,但是 API 很统一,所有 UI 之间的布局都可以使用约束来绑定关系,相反 Android,拥有众多 Layout,不同的 Layout 拥有不同的 API,还好之后紧跟 iOS 推出了 constraintlayout,方便了很多,如果你还没有使用 constraintlayout 那真的是落后了,别说学不动,这个必须学。

Android 给我的感觉就是 Google 给你扔了一堆组件库,至于怎么用好,效果怎么样,可能他们都不清楚,需要开发者自己去踩坑。

而 iOS 除了提供给你组件库之外,还严格制定了规范,并推荐你该怎么做,同时不需要很高的学习成本,当然这也得益于 iOS 闭源的特性,虽然没有 Android 那么自由,但是却能保障你应用的质量。

最后

虽然 Android 是目前全球占有率最高的移动操作系统,但软件的质量和生态真的还距离 iOS 有很大的差距。以上就是我最近开发 iOS 的感受,完全出自我的主观感受,有不同意见可以留言分享,之后的推送中除了有关 Android 、 Kotlin 的相关之外也会继续分享其他我所感兴趣的事物,就是这个公众号的 slogan : 探索有趣的新事物。

最后,感谢你的关注!