常见App技术栈和技术解析

4,098 阅读7分钟

本文已参与掘金创作者训练营第三期「话题写作」赛道,详情查看:掘力计划|创作者训练营第三期正在进行,「写」出个人影响力

概念

按照开发技术,App 可以分成三大类。

  • 原生应用(native application,简称 native App)
  • Web 应用(web application,简称 Web App)
  • 混合应用(hybrid application,简称 hybrid App)

原生App

专门为特定手机平台开发的应用程序 ,无法在其他平台运行。一个手机软件如果要同时支持苹果手机和安卓手机,就需要为它们各写一个原生 App。

优点:

  • 较好的性能和体验
  • 可以使用系统的所有硬件和软件 API,比如 GPS、摄像头、麦克风、加速计、通知推送等等,能充分发挥系统的潜力。

缺点:

  • 成本大,需要IOS和安卓开发团队
  • 原生 App 使用底层操作系统的语言,都是很重的编译型语言,开发和调试成本相对较高,时间周期长。
  • 原生 App 必须下载安装才能使用,只要升级版本,就必须重新下载安装。用户往往不愿意更新版本,厂商被迫不得不长期支持很久以前的旧版本。

Web应用

Web App 是使用网页做的应用程序,必须在浏览器中使用。主要使用网页技术,即 HTML、JavaScript 和 CSS。

优点:

  • 不需要下载安装,打开浏览器就能使用,而且总是使用最新版本。
  • 对于开发者来说,Web App 写起来比较快,调试容易,不需要应用商店的批准就能发布。

缺点:

  • 浏览器提供的 API(即 Web API)很有限(目前只有相机、GPS、电池等少数几个),大部分系统硬件都不能通过网页访问,也无法直接读取硬盘文件,所以 Web App 无法充分利用平台的硬件。
  • 网页通过浏览器渲染,性能不如原生 App,不适合做性能要求较高的页面。
  • 打开浏览器才能使用,不能从手机的首屏进入
  • 缺乏手机状态栏和锁屏时的通知推送能力
  • 不知脱机访问(即断网也能使用)

Chrome 团队开发了新技术"渐进式 Web App"(Progressive Web App,缩写 PWA)。它可以把网站缓存在手机里面,供离线时使用,还能在手机首屏生成图标,直接点击进入,并且有通知推送能力,也不带有浏览器的地址栏和状态栏,跟原生 App 的使用体验非常接近。

但是,PWA 需要浏览器访问一次网站,才能在首屏生成图标,并且目前 iOS 系统的支持还不够理想,所以还只是一项探索性质的技术,迄今为止缺乏足够的成功案例。

混合应用

原生 App 与 Web App 的结合。它的壳是原生 App,但是里面放的是网页。 可以理解成,混合 App 里面隐藏了一个浏览器,用户看到的实际上是这个隐藏浏览器渲染出来的网页。

混合 App 的原生外壳称为"容器",内部隐藏的浏览器,通常使用系统提供的网页渲染控件(即 WebView 控件),也可以自己内置一个浏览器内核。

结构上,混合 App 从上到下分成三层:HTML5 网页层、网页引擎层(本质上是一个隔离的浏览器实例)、容器层。

可以调用底层系统所有的 API,容器层提供了API Bridge,充当底层 API 的中介,允许内部的网页调用底层。

优点:

  • 跨平台
  • 灵活性
  • 开发方便

缺点:

  • 性能比较欠缺,存在网页引擎的中间层,不仅不如原生 App,而且由于 WebView 不是全功能浏览器,可能比 Web App 都要慢一些。
  • 跨平台就无法使用只有特定平台提供的功能,导致体验不如纯的原生 App。如安卓有物理的后退按钮、iphone没有。
  • 开发方便

手机 App 的技术栈

  1. 原生 App 技术栈

安卓平台的 Java 技术栈(Android Studio),iOS 平台的 Object-C 技术栈或 Swift 技术栈(Xcode)。

  1. 混合 App 技术栈

PhoneGap、Cordova、Ionic 等框架

  1. 跨平台 App 技术栈

Facebook的React Native、谷歌的Flutter 、阿里的Weex、Dcould的uni app

优缺点

  1. 原生技术栈的技能和体验最好,对于复杂的大型 App,如果条件允许,应该采用这种方式开发。

  2. 混合技术栈的成本低,灵活性好,对性能要求不高的简单 App,尤其是纯展示性的页面,可以采用这种方式开发。

  3. 跨平台技术栈适用于,存在外部或内部条件的限制,只有一个团队开发跨平台 App 的情况。

主要说说iOS的技术栈

  1. iOS 如果需要做原生开发,是必须需要一门原生编程语言来做技术栈。(object-c、Swift)

object-c :

  • 是最早的iOS开发语言,也是在C/C++上扩展的C的高级封装,主要针对iOS开发。

  • 底层是对C的封装,如果要提升代码效率,需要多去研究或者使用C/C++来实现一些功能。

  • OC 是运行时语言、动态语言,也可以实现很多类似于热更新,更便捷的一些操作,类似于之前的 JSPatch 。

  • OC 安全性相对是较弱的,既然是动态的,别人也有机会去动态修改你app 的信息。

Swift:

  • 静态、强类型;相对来说是更安全的语言。
  • Swift 的扩展性更强,面向协议、面向函数、面向对象等。
  • 开发效率上也是相对于OC是更高一些的,被apple的大力推崇,相对来说是更优秀一些的
  • 在内部,对于泛型、一些高阶函数、一些自定的语法,相对是比OC更流畅的。
  1. 在开发中,也会存在与原生相悖的一些东西,比如广告、提示、等等需要开始的迭代,与web的交互也变的尤为重要。
  2. 如果深入底层,尽可能的还是需要对C、C++、甚至是汇编更多的了解,无论是oc还是swift都提供了接口以供调用。
  3. 一些基础的动画原理,使用等。iOS 无论是app还是系统应用吃香的原因就是各式各样优秀的动画交互。
  4. 你应该需要了解一些跨平台技术,week、flutter、rn等,可以做一个模块嵌入,提升自己的技术栈、甚至提升开发效率。

进阶之路

基础:

  • UI - 可以实现各种基础页面
  • 内存管理 - 内存泄露、卡顿、延迟、缓存、引用计数、等
  • 网络 - API的请求、数据处理
  • 存储(DB) - 数据库、文件操作、等
  • 渲染 - 动画、图片加载过程
  • 线程 - 多线程处理技术、线程安全
  • 等。。。

进阶:

  • 多去分析、查看优秀的第三方:比如:RxSwift、Kingfisher、SnapKit、等(当然可以找对应的OC版本)
  • 深耕某一个领域:比如音视频、图片处理等
  • 性能优化:会使用系统自带的、或者第三方插件去调试性能;优化app(卡顿、crash)。多用try、catch语法。
  • 代码优化:多去做代码的review、去分析优化,怎么做更简洁,怎么做更优秀等、重构重组,架构思想等。
  • 开发效率:在质量的提升情况下多去考虑一下效率,有更多时间可以做更多进步的事情。(比如:封装控件、自动化、等)
  • 安全性:OC动态语言,如何防护被别人hook、签名等。
  • 尝试新技术:web深度交互、跨平台技术做某个模块、内嵌类似于小程序一样的应用。