本文已参与掘金创作者训练营第三期「话题写作」赛道,详情查看:掘力计划|创作者训练营第三期正在进行,「写」出个人影响力。
概念
按照开发技术,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 的技术栈
- 原生 App 技术栈
安卓平台的 Java 技术栈(Android Studio),iOS 平台的 Object-C 技术栈或 Swift 技术栈(Xcode)。
- 混合 App 技术栈
PhoneGap、Cordova、Ionic 等框架
- 跨平台 App 技术栈
Facebook的React Native、谷歌的Flutter 、阿里的Weex、Dcould的uni app
优缺点
-
原生技术栈的技能和体验最好,对于复杂的大型 App,如果条件允许,应该采用这种方式开发。
-
混合技术栈的成本低,灵活性好,对性能要求不高的简单 App,尤其是纯展示性的页面,可以采用这种方式开发。
-
跨平台技术栈适用于,存在外部或内部条件的限制,只有一个团队开发跨平台 App 的情况。
主要说说iOS的技术栈
- iOS 如果需要做原生开发,是必须需要一门原生编程语言来做技术栈。(object-c、Swift)
object-c :
是最早的iOS开发语言,也是在C/C++上扩展的C的高级封装,主要针对iOS开发。
底层是对C的封装,如果要提升代码效率,需要多去研究或者使用C/C++来实现一些功能。
OC 是运行时语言、动态语言,也可以实现很多类似于热更新,更便捷的一些操作,类似于之前的 JSPatch 。
OC 安全性相对是较弱的,既然是动态的,别人也有机会去动态修改你app 的信息。
Swift:
- 静态、强类型;相对来说是更安全的语言。
- Swift 的扩展性更强,面向协议、面向函数、面向对象等。
- 开发效率上也是相对于OC是更高一些的,被apple的大力推崇,相对来说是更优秀一些的
- 在内部,对于泛型、一些高阶函数、一些自定的语法,相对是比OC更流畅的。
- 在开发中,也会存在与原生相悖的一些东西,比如广告、提示、等等需要开始的迭代,与web的交互也变的尤为重要。
- 如果深入底层,尽可能的还是需要对C、C++、甚至是汇编更多的了解,无论是oc还是swift都提供了接口以供调用。
- 一些基础的动画原理,使用等。iOS 无论是app还是系统应用吃香的原因就是各式各样优秀的动画交互。
- 你应该需要了解一些跨平台技术,week、flutter、rn等,可以做一个模块嵌入,提升自己的技术栈、甚至提升开发效率。
进阶之路
基础:
- UI - 可以实现各种基础页面
- 内存管理 - 内存泄露、卡顿、延迟、缓存、引用计数、等
- 网络 - API的请求、数据处理
- 存储(DB) - 数据库、文件操作、等
- 渲染 - 动画、图片加载过程
- 线程 - 多线程处理技术、线程安全
- 等。。。
进阶:
- 多去分析、查看优秀的第三方:比如:RxSwift、Kingfisher、SnapKit、等(当然可以找对应的OC版本)
- 深耕某一个领域:比如音视频、图片处理等
- 性能优化:会使用系统自带的、或者第三方插件去调试性能;优化app(卡顿、crash)。多用try、catch语法。
- 代码优化:多去做代码的review、去分析优化,怎么做更简洁,怎么做更优秀等、重构重组,架构思想等。
- 开发效率:在质量的提升情况下多去考虑一下效率,有更多时间可以做更多进步的事情。(比如:封装控件、自动化、等)
- 安全性:OC动态语言,如何防护被别人hook、签名等。
- 尝试新技术:web深度交互、跨平台技术做某个模块、内嵌类似于小程序一样的应用。