春争日,夏争时,扫码抽取夏日礼包!!! 了解详情
写点什么

Max ReHIT Workout 的架构:我为什么选择原生 iOS 环境而不是云环境进行开发

  • 2021 年 12 月 23 日
  • 本文字数:3548 字

    阅读完需:约 12 分钟

Max ReHIT Workout的架构:我为什么选择原生iOS环境而不是云环境进行开发

我知道我最近写得不多。这是因为在软件系统架构方面几乎没有什么演变。日复一日,同一件事。从很多方面来说,这很好,但写起来并不是很有趣。

 

在这篇文章里,我想讲讲应用程序使用原生 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 应用程序。

 

原文链接:

Architecture Of Max ReHIT Workout

2021 年 12 月 23 日 18:282302

评论

发布
暂无评论
发现更多内容

我的副业已经成为了我的主业,Android软件开发面试题

android 程序员 移动开发

打造自己的Android常用知识体系,android音视频开发面试

android 程序员 移动开发

插件化框架解读之Android-资源加载机制详解(二),kotlin语法印章类

android 程序员 移动开发

插件化框架解读之android系统服务实现原理(五),毕业工作5年被裁

android 程序员 移动开发

我的Android 求职简历,二本渣校,靠这份简历拿下BATJ等15家大厂Offer

android 程序员 移动开发

拿来吧你,Compose尝鲜初体验!,Android开发真等于废人

android 程序员 移动开发

收好这份钉钉和抖音的客户端面经,真的很重要!,ndk开发环境

android 程序员 移动开发

我是如何在一晚上拿到阿里巴巴Android研发offer的?,三年经验Android开发面经总结

android 程序员 移动开发

手把手讲解-一个复杂动效的自定义绘制2,html5移动端开发框架

android 程序员 移动开发

手撕专有钉钉Android面试题完全指南(1),2021年网易Android岗面试必问

android 程序员 移动开发

我草-28岁就年薪百万??直到我看到这个Alibaba Android技术图谱

android 程序员 移动开发

拥抱-Koin,放弃-Dagger吧!,android开发技术难点

android 程序员 移动开发

收割腾讯等十几个Offer后,揭秘进大厂的秘诀和Android技术面试题汇总!

android 程序员 移动开发

技术迭代迷茫?Android资深架构师教你如何打破这个局面!

android 程序员 移动开发

掌握Android和Java线程原理上,跨平台移动开发工具

android 程序员 移动开发

插件化框架解读之Class文件与Dex文件的结构(一),Android详解

android 程序员 移动开发

揭秘 Android 百万开发被迫转行背后的残酷真相,只是你没找对方向罢了

android 程序员 移动开发

手把手教你打通车载蓝牙与手机app的音频信息传输&车载反向控制手机app

android 程序员 移动开发

手把手讲解IPC框架,成为一名合格Android架构师

android 程序员 移动开发

搞Android开发为什么这么难?想哭了!,kotlin中文

android 程序员 移动开发

搞了三年Android开发终于把线程、多线程和线程池全搞懂了,掌握这些核心知识

android 程序员 移动开发

手把手讲解--性能优化案例(2)app卡顿优化,androidsdk开发封装

android 程序员 移动开发

把Flutter扩展到微信小程序端的探索,androidstudio汉化

android 程序员 移动开发

抱着试一试的心态,没想到还真被录用了!年后我收到的第一个offer

android 程序员 移动开发

拔刀金九银十:2020年最新BAT大厂 Android 面试知识点,安卓开发入门到精通

android 程序员 移动开发

插件化&热修复系列——ClassLoader方案设计,开源至上

android 程序员 移动开发

插件化库VirtualAPK详解,你头秃都没想到还能这样吧

android 程序员 移动开发

我是怎么把业务代码越写越复杂的 _ MVP - MVVM - Clean Architecture

android 程序员 移动开发

换个姿势,带着问题看Handler,android应用程序开发的流程

android 程序员 移动开发

搞了三年Android开发终于把线程、多线程和线程池全搞懂了,掌握这些核心知识(1)

android 程序员 移动开发

手撕专有钉钉Android面试题完全指南,安卓开发入门书籍

android 程序员 移动开发

Max ReHIT Workout的架构:我为什么选择原生iOS环境而不是云环境进行开发_云计算_Todd Hoff_InfoQ精选文章