我知道我最近写得不多。这是因为在软件系统架构方面几乎没有什么演变。日复一日,同一件事。从很多方面来说,这很好,但写起来并不是很有趣。
在这篇文章里,我想讲讲应用程序使用原生 iOS 环境还是使用云环境的选择。这是每个开发者都必须做的选择。你是如何做选择的?这意味着什么?下次我会做出什么选择?
我之前的几个项目大部分都基于亚马逊云科技(AWS):
Best Sellers Rank。它跟踪你的书在亚马逊上的表现。它源于我想知道我自己的书表现如何。
Basis Calculator。它根据一个复杂表格生成一个基准报告。如果你不是一个会计师,那它就没有任何意义,但相信我,它很复杂。
Probot。它是一个 Facebook 和 Slack 聊天机器人,允许主题专家回答问题并获得报酬。它的运行成本很高,彻底失败了,所以我终结了这个项目。
各种从未发布的项目的一些尝试。
它们使用了典型的亚马逊云科技服务:Lambda、DynamoDB、S3、Route 53、SES、SQS、Cloudfront、Cloud Watch、Cognito、API Gateway、HTTP API、Amazon Aurora、SNS、WebSockets 等等。此外,我还按需使用 PayPal、Nginx、AdMob、Node 和 Let's Encrypt 等。
客户端是基于 Bootstrap 的 Web 前端或聊天机器人前端,后端具有不同程度的复杂性。
只有我一个人,所以我尽量让项目简单。我很少成功。我知道在这些事情上我只有自己一个人。
对于我的最新项目——Max reHIT Workout,我想要尝试一些完全不同的东西。
虽然我发现了一些直接可以使用的亚马逊云科技组件,但其它组件并不能直接使用。我的大部分时间都在与 Cognito 抗争来使其屈服,虽然我不愿承认这一点。至少可以说,文档和示例代码缺乏质量。
你说用 AppSync?AppSync 对我来说太偏执了。它规定使用我不喜欢使用的工具链、流程和服务。
亚马逊应该制作可重用的、文档良好的、可组合的组件,而不是将其打包成一个框架。他们转而使用 Ruby on Rails。这对很多人来说都很好,但我想自己对这些做选择。
此外,我也厌倦了 Web 框架之争。CSS、JavaScript、HTML——输家多于赢家的持续战场。
我需要改变。我需要从 Web 之争中休息一会儿。
使用 SwiftUI 的原生 IOS
因此我决定尝试一些完全不同的东西:使用 SwiftUI 的原生 iOS。
我的直觉是,与 Web + 亚马逊云科技体验相比,原生开发者的体验更令人愉快。我基本上是对的。
我不是完全的 iOS 新手。很多月以前,我用 Objective C 创建了一个简单的应用程序。作为一名长期的 C++编程人员,我发现 Objective C 非常难以理解,所以我匆匆回到了 Web。
后来,我用 Swift 和 UIKit 制作了另外一个简单的应用程序。那个就好多了。Swift 是一种很好的语言,即使看起来并不复杂。而且我发现使用 Swift 的 UIKit 虽然有点冗长,但能用。
我认为 SwiftUI 将是这两个世界中最好的。而且考虑到我不太出色的 UI 技能,我认为它可以提高效率。因此,我上了一些 SwiftUI 课,做了一些自己的研究,然后就开始上手了。
SwiftUI 是不同的
SwiftUI 对我来说是一个巨大的范式转变。在 Web 世界,我从不做响应式开发,因为我不认为额外的复杂性是值得的。但是为了避免使用 Xcode 的 Interface Builder,我会做很多事情。SwiftUI 只是代码。
至少对我来说,SwiftUI 不负众望。因为我一开始不是一个熟练的 UIKit 开发者,所以我没有错过其他开发者抱怨的大部分事情。
并不是说 SwiftUI 没有自己的问题。它有许多令人烦扰的编译器怪癖和令人迷惑的异想天开的 bugs,这些 bugs 只能通过一些套路来修复。但一旦你掌握了窍门,你就可以制作一个相当不错的界面了。而这就是我的目标。
根据数据变化进行 UI 更新有一个小窍门。当它起作用时,它是神奇的。但除了人们喜欢展示的简单示例之外,让它在应用程序变得比较复杂时起作用需要对 SwiftUI 有更深入的理解。
大多数 SwiftUI 管道隐藏在听起来几乎相同的属性包装器后,这些包装器本身是一种更深层次的 Swift 窍门。当用户界面没有按照预期更新时,找出错误并将其纠正可能是一种非常令人沮丧的体验。数据并不一定正常流动。
构建一个完整的应用程序
对我来说,SwiftUI 的复杂性在于学习如何将其整合到一个完整的应用程序中。
您如何处理登录模式与登出模式?您如何处理离线?您如何处理广告?您如何集成应用内购买?您如何存储数据?您如何查询、更新和删除数据?您如何处理登录/登出?您如何处理设备间同步?您如何在 Xcode 中测试?您如何处理上线?您如何学习 Swift + SwiftUI 语法的所有诀窍细节?您如何验证表单?您如何呈现错误?您如何集成异步服务?您如何处理在背景中来回移动?您如何处理推送通知?您如何在视图之间导航?您如何适配不同的屏幕尺寸?当这些在响应式范式中变化时,您如何应对这些模式?
在 Web 世界中,我知道如何做到这一切。在 SwiftUI 中,我花了很长一段时间才能够在没有过程代码或熟悉流程的支持下使所有功能协同工作。
我的选择也使应用程序变得更加复杂。在使用了十几种不同的健身应用程序后,我开始讨厌那些立刻要求你登录并在你“免费”试用之前收费的应用程序。因此,Max reHIT Workout 在无需登录或应用程序内购买的情况下也能良好运行。这意味着要处理所有这些模式。不好玩。
走向原生
顺应原生 iOS 生态系统意味着使用应用程序内购买、CloudKit、CoreData、Apple 登录等框架。其中大部分我都没有用过。因此会有一个学习曲线。
总是有学习曲线。总是有 bugs。总是有工具问题。总是存在糟糕的文档和几乎完全缺乏良好示例代码的问题。作为一名软件开发人员,我不认为有办法绕过这些问题。但你可以自己选择。
我使用 Revenuecat 来帮助进行支付处理。它简单吗?一点儿也不。如何集成到一个 SwiftUI 应用程序是显而易见的吗?一点儿也不。AdMob 也一样。这就是为什么每件事都要花很长时间才能完成。
我犯的一个大错误是没有从一开始就使用 CloudKit 和 CoreData。这是因为我最初的计划是让应用程序在一台设备上运行。我做了最简单的可行的事情,像往常一样,我后来为此付出了代价。
我使用 CoreData 来存储用户数据和用户默认值。对于存储的大型数据集,我使用了 JSON 文件。这是可行的,但是很复杂。一切都很复杂。
后来,我决定让 Max reHIT Workout 跨设备运行。我使用 CloudKit 将 JSON 文件存储在云端。这起作用了,但是不同步。
为了同步,我不得不使用 CoreData 和 CloudKit。我开始慢慢迁移所有东西来使用 CoreData。然后我迁移了 CoreData 来使用 PersistentCloudKitContainer。当你在视图中使用 SwiftUIs @FetchRequest 时,它可以正常工作。另外,它还保留了一个本地缓存,因此它可以离线工作,并在恢复连接时重新同步。它可以同步所有东西,可以进行扩展,安全,并且完全免费。
问题在于并非所有数据都发生在视图中。这就是 SwiftUI 倒下的地方。它是以视图为中心的。所有灵巧的工具在视图之外都不起作用。所以你必须弄清楚。
当然,要使这一切顺利运行,需要复杂的窍门和技巧。我通常可以通过谷歌搜索或在 Reddit 上提问来找到答案。
我会再做一次吗?
使用原生 iOS 生态是否比使用 Web + 亚马逊云科技 更快速更简单?一开始并不是。学习曲线是巨大的。我的下一个应用程序将会是更加流畅的体验。
我现在有了可重用的代码。Swift 的一个优点是,它鼓励制作可重用的组件。你不必与环境做斗争。而且由于 SwiftUI 是围绕组件构建的,因此一旦你了解了绑定和可观察状态的黑暗艺术,你就可以创建可重用的 UI 组件。就我个人而言,我会远离 SwiftUI 中的协议。它们比其它任何东西造成的编译器问题都多。
明显的缺点是我的应用程序只能在 iOS 上运行。需要一个网站或安卓应用程序?运气不好。
对于这个应用程序,我认为这是值得做的权衡。这是 iOS 用户可能觉得有价值的付费应用类型。他们会在网站上寻找和使用这类应用程序吗?他们会在安卓上购买它吗?这是你必须根据逐个属性决定的事情。
当然,如果苹果公司决定他们不喜欢我的应用程序,我没法申诉。我不希望发生这种情况。我经历过的应用程序审查一般都是积极的,但你永远不知道会发生什么情况。
30%的应用商店抽成怎么样?谁喜欢那样?对我来说,这个抽成比例是 15%,因为我最终被接受进入应用商店小微企业计划。如果我一年的销售额超过一百万美元,我才会担心这件事。
我觉得 15%的抽成比例可以接受。原生的应用内购买和登录体验比 PayPal 和 Cognito 好得多。在 Xcode 中测试和调试它几乎是不可能的。
当你加入云存储和同步功能时,我认为 Apple 公司的抽成是值得的。但是如果你是多平台的,并且没有利用 iOS 服务,成本就会很高。
我会再次使用 iOS 生态系统吗?是的,因为某些类型的属性。既然我知道自己在做什么了,我的工作效率就会很高。
但如果我需要面向多平台,并且我无法为每个平台提供一个原生团队,我会选择不同的方法。一种方法是为 SwiftUI 创建不同的后端代码生成器。SwiftUI 可以用来创建网站,甚至可能被用来创建 Android 应用程序。
原文链接:
评论