移动开发分类

137 阅读4分钟
移动开发是一个较新的领域,开发者们开始涉足移动开发时间尚不足十五年,所以移动开发的工具仍然在发展当中,这并不奇怪。
OEM SDKs(原生App)
苹果的 iOS SDKs(软件开发工具包)发布于 2008 年,谷歌的 Android 软件开发工具包发布于 2009 年,这两种工具包基于不同的编程语言,分别是 Objective-C 和 Java。现在又有了Swift和Kotlin。
![](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d3203c5c8ea2431ab7da9cdb5804b6a3~tplv-k3u1fbpfcp-watermark.image)

图1

通过这些 SDK,你的应用可以与系统通信,以创建 UI 组件或访问系统相机。这些组件被渲染到手机屏幕,而相应的事件则被传回给组件。这个架构足够简单,但你仍然不得不为每个平台开发单独的 App,因为这些系统组件都是不一样的,更不用提开发语言的不同了。
WebViews
最早的跨平台方案是基于JaveScript 和 WebView的,像PhoneGap、Cordova、Ionic等。
![](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/695625c9139b47ec87316f5ebb503697~tplv-k3u1fbpfcp-watermark.image)图2

UI通过WebView来显示html代码,系统服务则通过一个中间层桥接到JaveScript中去。

React Native
RN不仅桥接系统服务,也将系统UI也桥接到了JaveScript中,这样写出来的UI最终也会渲染成原生的控件。

图3

React Native 是非常受欢迎的(这是它应得的),但是因为 JavaScript 访问了原生 UI 组件,所以它也必须经过这些“桥接器”,界面上的 UI 控件通常被频繁地访问(在动画、转化或者用户用手指“滑动”屏幕上的某些东西时,每秒被访问高达 60 次),因此这很可能会导致性能问题。
正如关于 React Native 的一篇文章 所说:这是理解 React Native 性能的其中一个关键,JS 代码和原生代码本身都是很快的,瓶颈经常发生在当我们视图从一边转向另一边时。未来构建高质量的应用程序时,我们必须将使用桥接的次数控制到最小。
Flutter
Flutter使用Dart语言开发,Dart可以被编译(AOT)成不同平台的本地代码,让Flutter可以直接和平台通讯而不需要一个中间的桥接过程,从而提高了性能。
![](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e33bb1f5de2d4e1b9c3ff0df197254ae~tplv-k3u1fbpfcp-watermark.image)图4

总结(混合开发)

以上与涉及到混合开发的有webview、React Native、flutter,其中webview、
React Native与JavaScript有关。
WebView是用于展示网络请求后的结果,也就是将url网络请求的结果展示在里面。WebView是一个基于webkit引擎、展现web页面的控件。Android的Webview在低版本和高版本采用了不同的webkit版本内核,Android4.4后直接使用了Chrome作为内置浏览器。有着显示和渲染网页、可与页面JavaScript交互、实现混合开发的作用。
很多app都是混合开发的(布局简单、功能简单的有可能是纯原生),或多或少地使用了webview控件,以减少审核带来的麻烦(原生代码上线应用商店都要审核,而webview链接的网页是在服务端,更新不用审核)
React Native使你只使用JavaScript也能编写原生移动应用。 它在设计原理上和React一致,通过声明式的组件机制来搭建丰富多彩的用户界面。也是使用了webview控件,只不过由于react本身的特性(html、css均转化为css,一切皆JavaScript),如图3所示,UI的渲染是很频繁的,要使UI不卡顿,必须达到60Fps。但是桥接会花一定的时间。所以这样的架构有时候会有性能问题。
混合开发中,一家公司有原生开发者,那么混合app可以有原生主导,毕竟一些底层的功能调用只有原生代码能实现,不经常更新的模块由原生写性能会比较高。如果没有原生开发者,那么H5开发者主导也不是不可以,采用一些Dloud这类网站给出的解决方案,可以最大程度使用封装好的js api去实现,对于必须用原生实现的部分也能自动打包。React Native的解决方案我不太懂,之后补充。。。