[TOC]
Hybrid App
Mobile App分为三大类:Native App,Hybrid App,Web App。其中Hybrid App介于Native App和Web App之间,它能兼顾Native App的良好用户体验及强大的功能并具有Web App跨平台快速开发的优势。缺点在于依赖于各平台的WebView,WebView的性能好坏直接决定了Hybrid App的性能。
KendoUI 2013年面向开发者做了一次有关的Hybrid调查,并将结果整理成了报告The HTML5 vs. Native Debate is Over and the Winner is...nativeDebate,下面来看报告中几个关键的结论:
- 在受访的2309个Mobile开发者中,到2013年8月为止完全使用Native开发的只有8%,而剩余的92%都可以被认为使用的是Hybrid
nativeDebate:KendoUI 2013年调查报告
相关技术
1.less/sass:css的预处理器。 2.bowerbowerAPI:管理依赖的JS库。 3.gruntgruntAPI:作为项目打包工具。 4.nodejs 5.Cordova 6.AngularJS 7.SQLite
bowerAPI. Bower ↩
gruntAPI. Grunt ↩
nodejs
JavaScript是一种运行在浏览器的脚本,它简单,轻巧,易于编辑,这种脚本通常用于浏览器的前端编程,但是一位开发者Ryan有一天发现这种前端式的脚本语言可以运行在服务器上的时候,一场席卷全球的风暴就开始了。 Node.js是一个基于Chrome JavaScript运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞I/O 模型而得以轻量和高效,非常适合在分布式设备上运行的数据密集型的实时应用。 V8引擎执行Javascript的速度非常快,性能非常好。 Node是一个Javascript运行环境(runtime)。实际上它是对Google V8引擎进行了封装。V8引 擎执行Javascript的速度非常快,性能非常好。Node对一些特殊用例进行了优化,提供了替代的API,使得V8在非浏览器环境下运行得更好。
安装
下载:http://nodejs.org/download/ 安装
npm
npm是node的包管理器,我们在开发nodejs应用程序的过程中,可能需要依赖许许多多的第三方模块以提高开发效率,那么此时,我们就需要npm来辅助安装所需package。
Cordova
(原来名字:PhoneGap)
PhoneGap是一个用基于HTML,CSS和JavaScript的,创建移动跨平台移动应用程序的快速开发平台。它使开发者能够利用iPhone,Android,Palm,Symbian,WP7,WP8,Bada和Blackberry智能手机的核心功能——包括地理定位,加速器,联系人,声音和振动等,此外PhoneGap拥有丰富的插件,可以调用。业界很多主流的移动开发框架均源于PhoneGap。较著名的有Worklight、appMobi、WeX5等
优缺点
时下流行的移动Web应用可分为三种:原生应用、Web应用和混合型应用(引用 yqd)。
- 原生应用:通过各种应用市场安装,采用平台特定语言开发。
- Web应用:通过浏览器访问,采用Web技术开发。
- 混合型应用:通过各种应用市场安装,但采用Web技术开发。它虽然看上去是一个原生应用,但里面访问的实际上是一个Web应用。
原生应用的优势:
- 提供最佳的用户体验、最优质的用户界面和最华丽的交互;
- 针对不同平台提供不同体验;
- 可节省带宽成本;
- 可访问本地资源;
- 盈利模式明朗。
原生应用的劣势:
- 移植到不同平台上比较麻烦;
- 维护多个版本的成本比较高;
- 需要通过store或market确认;
- 盈利需要与第三方分成。
Web应用的优势如下:
- 开发成本低;
- 适配多种移动设备的成本低;
- 跨平台和终端;
- 迭代更新容易;
- 无需安装成本。
Web应用的劣势如下:
- 浏览体验短期内还无法超越原生应用;
- 不支持离线模式(HTML5将会解决这个问题);
- 消息推送不够及时;
- 调用本地文件系统的能力弱。
混合型应用可以说是为了弥补上面两种应用开发模式的缺陷而生, 它是两者混合的产物,并且尽可能继承了双方的优势:
- 它可以让众多Web开发人员几乎零成本地转型成移动应用开发者。
- 相同的代码只需针对不同平台进行编译就能实现在多平台的分发,大大提高了多平台开发的效率。而相较于Web应用,开发者可以通过包装好的接口调用大部分常用的系统API。
Cordova正是混合型框架中的佼佼者,它基于标准的Web技术——HTML、JavaScript和CSS,用JavaScript包装平台的API供开发者调用,具备强大的编译工具来为不同平台生成应用,同时拥有丰富的第三方资源和产业链。 PhoneGap在Web应用和设备之间搭建了一个通信的桥梁,封装了移动设备的平台差异,统一使用JavaScript接口访问设备本地API,以此提供了一个优秀的跨平台解决方案
安装
npm install -g cordova
安装
插件
cordova plugin ls
列出所有插件
cordova plugin add https://XXX.git
git方式安装插件
cordova plugin add com.brodysoft.sqliteplugin
从插件库 cordovaPlugin安装sqlite插件
cordovaPlugin:Cordova Plugin Registry
学习
AngularJS
AngularJS诞生于2009年,由Misko Hevery 等人创建,后为Google所收购。是一款优秀的前端JS框架,已经被用于Google的多款产品当中。AngularJS有着诸多特性,最为核心的是:MVVM、模块化、自动化双向数据绑定、语义化标签、依赖注入、等等。
特点
- MVC
- 模块化与依赖注入
- 双向数据绑定
- 指令与 UI 控件
学习
ionic
Ionic 是一个强大的 HTML5 应用程序开发框架,号称 Advanced HTML5 Hybrid Mobile AppFramework 是 AngularJS 移动端解决方案 可以帮助您使用 Web 技术,比如 HTML、 CSS 和Javascript 构建接近原生体验的移动应用程序。 Ionic 主要关注外观和体验,以及和你的应用程序的 UI 交互,特别适合用于基于 Hybird 模式的 HTML5 移动应用程序开发。 Ionic 是一个轻量的手机 UI 库,具有速度快,界面现代化、美观等特点。为了解决其他一些UI 库在手机上运行缓慢的问题。
基本命令
npm install -g cordova
安装phonegap 科尔多瓦
npm install -g ionic
安装ionic
ionic start myApp tabs
创建一个myApp的项目,使用tabs模板
cd myApp
ionic platform add android
添加android平台
ionic build android
编译 ,需要安装对应的android sdk,条件如下:
* SDK platform for android-22
* Android SDK Platform-tools
* Android SDK Build-tools
ionic emulate android
启动android 虚拟机
adb devices
查看连接的设备
ionic run android
连接手机打开
ionic serve
使用浏览器打开
学习
SQLite
(localStorage有5M的限制)
SQLite 是一个开源的嵌入式关系数据库,实现自包容、零配置、支持事务的SQL数据库引擎。 其特点是高度便携、使用方便、结构紧凑、高效、可靠。 与其他数据库管理系统不同,SQLite 的安装和运行非常简单,在大多数情况下 - 只要确保SQLite的二进制文件存在即可开始创建、连接和使用数据库。如果您正在寻找一个嵌入式数据库项目或解决方案,SQLite是绝对值得考虑
移动WebApp开发框架对比
Sencha Touch
原来的EXTjs
- 优点
- 用户体验最接近Native App, 具有整体的UI组件、布局解决方案;
- 统一的编程代码结构和要求,良好组织的代码易于维护;
- 继承ExtJS 4的应用程序MVC架构;
- 完善的API文档,示例;活跃的社区,网上有大量的文档书籍帮助学习.
- 缺点
- 兼容性差,仅支持webkit内核的浏览器;
- 框架比较重量级,学习成本比较高;
- 商业化使用有版权问题
jQuery Mobile
- 优点
- 跨浏览器兼容性最好,几乎兼容所有的平台和浏览器;
- 入门简单,语法简洁,编码灵活,一些简单的应用直接用HTML既可实现,无需Javascript;
- 开源插件与第三方扩展网上资源丰富;
- 完善的API文档,示例;活跃的社区,网上有大量的文档书籍帮助学习;
- 缺点
- jQuery Mobile对代码没有特定的要求,后期维护难度较大;
Dojo Mobile
- 优点
- Dojo本身有很多优秀的设计,面向对象、MVC、JS模块化加载;
- 完善的API文档,示例;活跃的社区,网上有大量的文档书籍帮助学习;
- 缺点
- Dojo Mobile需要依赖完整的dojo库,压缩之后的代码140k,gzip压缩之后在40k;
- 兼容性差,仅支持webkit内核的浏览器;
- 学习成本高;
Jqmobi(Intel's App Framework)
- 优点
- 使用简单
- 与Sencha非常相似的一个框架;
- 缺点
- 兼容性相比Sencha Touch稍好一点,但是也不支持WP IE、Firefox、Opera;
Ionic
- 优点:
- 基于红的发紫AngularJs
- 漂亮的UI
- 强大的命令行(基于更热门的nodejs)
- 缺点:
- 需要了解angularjs、Cordova等入手难度大
GMU
- 好像挂掉了
React-Native
facebook开源的移动开发框架
能解决大部分ui性能问题
最值得期待的移动app解决方案
其他
- Ratchet
- Framework7
- MUI
- ....
Ionic Coding
部分代码展示
目录结构
Project
├── hooks
├── platforms
├── plugins
├── resources
├── scss
├── www 前端代码
│ ├── css 样式
│ ├── html 模板
│ ├── img 图片
│ ├── js js
│ ├── lib ionic库,不需要修改
│ ├── index.html 主页
├── .bowerrc
├── .gitignore
├── bower.json
├── config.xml
├── gulpfile.js
├── ionic.project
├── package.json
index.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width"> <title></title> <link href="lib/ionic/css/ionic.css" rel="stylesheet"> <link href="css/style.css" rel="stylesheet"> <!-- IF using Sass (run gulp sass first), then uncomment below and remove the CSS includes above <link href="css/ionic.app.css" rel="stylesheet"> --> <!-- ionic/angularjs js --> <script src="lib/ionic/js/ionic.bundle.js"></script> <script src="js/ng-cordova.js"></script> <!-- cordova script (this will be a 404 during development) --> <script src="cordova.js"></script> <!-- your app's js --> <script src="js/app.js"></script> </head> <body ng-app="starter"> <ion-nav-bar class="bar-balanced"> <ion-nav-back-button> </ion-nav-back-button> </ion-nav-bar> <ion-nav-view> </ion-nav-view> </body> </html>
app.js
模块定义
angular.module('starter', ['ionic', 'ngCordova']) .run(function($ionicPlatform,$cordovaSQLite) { $ionicPlatform.ready(function() { // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard // for form inputs) if(window.cordova && window.cordova.plugins.Keyboard) { cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true); } if(window.StatusBar) { StatusBar.styleDefault(); } db = $cordovaSQLite.openDB("my.db"); $cordovaSQLite.execute(db, "CREATE TABLE IF NOT EXISTS people (id integer primary key, firstname text, lastname text)"); }); })
路由定义
.config(function($stateProvider, $urlRouterProvider,$ionicConfigProvider) { $stateProvider //abstract .state('menus', { url:'/menus', abstract: true, templateUrl: 'html/menus.html' })
控制器定义
.controller("dbCtrl", function($scope, $cordovaSQLite,$ionicLoading,$timeout) { $scope.people = { firstname:'first', lastname:'last' } $scope.peoples = []; $scope.myNotice = function(msg, timeout){ $ionicLoading.show({template:msg}); $timeout(function(){$ionicLoading.hide();}, timeout || 1000); return false; }