文档章节

如何采用Yeoman + Grunt + Bower开发基于PhoneGap的Hybrid APP

僵尸猫
 僵尸猫
发布于 2015/06/24 23:14
字数 2465
阅读 3185
收藏 136
 

一直想开发手机应用,也跟着教程学做了两个iOS小应用,但开发思维上的转变需要一个长期的过程,而且iOS系统功能很强大,陌生的地方也很多,很多功能不知道该自己开发还是系统上已经存在,也不了解现在iOS开发的流程。所以对于没有任何移动平台客户端开发经验的开发人员来说,想要做一个产品级别的产品出来,如果直接采用原生开发,不知道有多少坑要填。幸好现在有Hybrid APP方式,一种介于Web APP和Native APP之间的解决方案。Web APP无需安装,但需要打开系统上的浏览器来运行,因为就是网页嘛,用户体验不太好,操作局限性大。Native APP是安装在系统上的应用,体验更好,但是开发难度不小,并且需要针对不同系统开发对应的版本,开发和维护成本太高。Hybrid APP综合了上述两种APP的优点,用户界面通过Web前端技术实现,使用JavaScript调用第三方库封装的系统API,这样一来,不同系统下应用的UI界面不再需要使用原生语言重新开发,只用调用对应的第三方库即可。

  • 为什么开发Hybrid APP
    Hybrid APP——混合APP,就是采用非原生APP的开发语言来制作APP的界面,调用第三方发布的APP中间件在各平台上运行,关于中间件的介绍请参考《Hybrid App开发实战》。由此可见,因为有第三方中间件封装了各种平台的底层API,Hybrid APP可以实现跨平台开发,而且没有原生APP开发经验的开发人员也可以使用自己擅长的技术来开发APP。特别对于Web开发人员来讲,如果没有这种方式,转向去学习纯原生方式的开发,其成本和难度都不小。在前端方面,现在使用HTML5 + CSS3 + JavaScript可以快速开发出很强大的Web应用,所以能复用Web前端技术在APP开发上真是一件普大喜奔的好事。

  • 如何搭建一个基于PhoneGap的Hybrid APP
    我采用的是PhoneGap作为中间件,它采用命令行的方式来创建工程,所以需要先安装PhoneGap的命令行工具,并且这个命令行工具要用到npm来安装,也就是Node.js的包管理工具,所以在自己的开发环境里把Node.js安装好就可以使用npm了。
    安装妥当npm之后,全局条件下安装PhoneGap的命令行工具,在命令行界面输入如下命令,因为我的环境没能成功安装PhoneGap,所以采用cordova代替。
    $ sudo npm install -g phonegap
    我没有成功安装,于是安装的cordova
    $ sudo npm install -g cordova
    安装完毕之后,就可以使用cordova来创建PhoneGap项目。cordova是从PhoneGap提取出来的一个开源项目,在我看来,除了名字不一样之外,二者没有什么区别。
    然后在常用的项目文件夹下运行命令:
    $ cordova create hello com.example.hello "HelloWorld"
    Creating a new cordova project.
    $ ls
    hello
    create后面第一个参数hello是新建的项目文件夹名称,第二个参数com.example.hello是公司名称,第三个参数"HelloWorld"是项目名。在当前目录下可以看到多了一个文件夹hello。
    然后进到项目文件夹里,添加对iOS的支持
    $ cd hello
    $ cordova platform add ios
    $ cordova prepare
    至此,就完成了对基于PhoneGap的Hybrid APP项目的创建工作,接下来用XCode来打开这个项目,运行iOS模拟器来检验这个项目能否正常运行。
    启动Xcode,打开文件/hello/platforms/ios/HelloWorld.xcodeproj



    使用Xcode打开项目后,点击运行按钮后,稍等片刻,在模拟器中看到Cordova的界面,就表示成功运行。



    创建其他平台的流程应该也是类似的,具体操作建议参考官方文档。

  • 怎样加入Yeoman + Grunt + Bower开发流程
    通过上面的过程,创建了一个基于PhoneGap的Hybrid APP工程,可是APP本身的开发流程还没有涉及到。我想采用当前Web前端流行的Yeoman + Grunt + Bower全明星组合,开发一款基于AngularJS的应用,然后将这个Web APP打包后放到PhoneGap的环境下,使用Xcode编译之后就可以部署到iOS上运行了。
    Yeoman是一个Web APP的脚手架程序,所谓脚手架程序,就是帮助开发者完成搭建一个Web项目时经常重复的项目初始设置的过程,换句话说,就是用一个命令就可以搞定一个项目的初始搭建工作。
    Grunt是现在流行的Web前端自动化开源工具,并且有丰富的插件可以使用。可以完成单元测试,静态文件合并、缩小,还可以为前端运行一个简单的Web服务器等很多工作。
    Bower是Web前端的包管理工具,可以使用它来管理Web前端的各种第三方库,比如jQuery,Bootstrap,AngularJS等。
    以上三者也是通过npm来安装,既然上面已经安装过了,现在只需要输入安装这三个工具的命令,
    $ npm install -g yo bower grunt-cli
    这三个工具安装完毕之后,在之前创建的Hybrid APP项目文件夹下创建一个Web APP的目录,比如叫yo,然后安装用于创建基于angular的Web项目的自动生成器,并运行yeoman来创建一个Web APP项目。
    $ mkdir yo
    $ cd yo
    $ npm install -g generator-angular
    $ yo angular
    项目创建完成后,检查一下项目能否正常运行,在命令行输入
    $ grunt serve
    这样就启动了一个Web服务器来运行刚才创建的Web APP,顺利的话可以在浏览器上看到这个yeoman的实例页面。


    好了,现在看看怎么把yeoman创建的项目放到Hybrid APP里运行。
    把Hybrid APP根目录下的config.xml拷贝到yo/app目录下,然后修改yo下的Gruntfile.js。
    1,增加xml到copy->dist->files->src中
    2,在copy->dist->files中添加
    {
      expand: true,
      cwd: '../platforms/ios/www',
      dest: '<%= yeoman.dist %>/scripts',
      src: [
      'plugins/**',
      'cordova.js',
      'cordova_plugins.js'
      ]
    }
    3,在clean中增加options: {force: true}

    修改后代码如下:
    // Copies remaining files to places other tasks can use
    copy: {
      dist: {
        files: [{
          expand: true,
          dot: true,
          cwd: '<%= yeoman.app %>',
          dest: '<%= yeoman.dist %>',
          src: [
            '*.{ico,png,txt,xml}',
            '.htaccess',
            '*.html',
            'views/{,*/}*.html',
            'images/{,*/}*.{webp}',
            'styles/fonts/{,*/}*.*'
          ]
        }, {
          expand: true,
          cwd: '.tmp/images',
          dest: '<%= yeoman.dist %>/images',
          src: ['generated/*']
        }, {
          expand: true,
          cwd: '../platforms/ios/www',
          dest: '<%= yeoman.dist %>/scripts',
          src: [
          'plugins/**',
          'cordova.js',
          'cordova_plugins.js'
          ]
        }]
      },
      styles: {
        expand: true,
        cwd: '<%= yeoman.app %>/styles',
        dest: '.tmp/styles/',
        src: '{,*/}*.css'
      }
    },
    
    // Empties folders to start fresh
    clean: {
      dist: {
        files: [{
          dot: true,
          src: [
            '.tmp',
            '<%= yeoman.dist %>/{,*/}*',
            '!<%= yeoman.dist %>/.git{,*/}*'
          ]
        }]
      },
      server: '.tmp',
      options: {
        force: true
      }
    },
    4,修改index.html,在angular的引用之前添加对cordova.js的引用
    <script type="text/javascript" src="scripts/cordova.js"></script>
    5,在命令行运行grunt build,打包整个Web APP项目,然后拷贝yo/dist下所有文件到Hybrid APP项目的www目录下
    $ grunt build
    6,来到Hybrid APP项目的根目录,在命令行运行cordova prepare
    $ cordova prepare
    7,用Xcode打开Hybrid APP项目,运行iOS模拟器,可以看到Web APP已经成功的在iOS上运行了。


    步骤5,6在每次将Web APP部署到iOS上调试时都要做,纯属重复的手工操作,我写了一段shell脚本来运行
    echo '### Sync APP to Platforms ###'
    
    echo 'Building web APP...'
    echo 'Please be patient, it may take several minutes'
    grunt build
    
    sourceDir="dist"
    targetDir="../www"
    allFiles="/*"
    
    if [ -d $sourceDir ]
    then
    	if [ ! -d $targetDir ]
    	then
    		mkdir -p $targetDir
    	fi
    	echo 'Copying source files to www/'
    	cp -r $sourceDir$allFiles $targetDir
    
    	echo 'Calling cordova prepare'
    	cd ..
    	cordova prepare
    	echo 'All done'
    else
    	echo 'Err: The source directory "dist" doesnot exist, use command "grunt build" to generate it firstly'
    fi


    但想要开发高效率的应用,公认还是做原生开发更好,iOS原生应用开发入门教程推荐王寒的编纂的《从零开始学iOS7开发系列》,教程写的非常生动易懂,文章里的例子也很有代表性,仔细学习和琢磨之后可以举一反三开发自己的应用。其实Hybrid APP开发早已经不限于移动平台了,我最早接触到的Hybrid APP是家用主机平台,在XBOX ONE上,微软也实现了供JavaScript调用的XBOX系统API,将Web APP通过Visual Studio打包后发布到主机上就可以运行。既然HTML5和CSS3在制作用户界面上巨大的潜力,采用Hybrid APP方式确实可以极大的帮助Web开发人员开发浏览器平台以外的应用。


参考


© 著作权归作者所有

共有 人打赏支持
僵尸猫
粉丝 3
博文 8
码字总数 5620
作品 0
成都
程序员
私信 提问
加载中

评论(6)

僵尸猫
僵尸猫

引用来自“Slayer”的评论

楼主的入门教程不错,不过个人推荐ionic,开发速度快,定制自己的也比较快,IONIC在IOS上的表现很好,几乎和原生的差不多,至于安卓,主要是因为安卓自带webview太渣,如果不在意apk大小(大20M),集成crosswalk,也很流畅,
多谢推荐,我也打算研究下ionic。
冬芽
冬芽
楼主的入门教程不错,不过个人推荐ionic,开发速度快,定制自己的也比较快,IONIC在IOS上的表现很好,几乎和原生的差不多,至于安卓,主要是因为安卓自带webview太渣,如果不在意apk大小(大20M),集成crosswalk,也很流畅,
僵尸猫
僵尸猫

引用来自“huangjacky”的评论

ionic 继承angular,gulp更快

我理解ionic是cordova + angular + 一套它设计和实现的UI是这样的吗?它针对移动开发做了什么特别的优化吗?
kinosang
kinosang
ionic + 1
提供很多界面元件可以在不同平台上自適應 ui 規範
huangjacky
huangjacky
ionic 继承angular,gulp更快

Jashon
Jashon
不错
使用The PhoneGap Developer App实现快速调试项目

如今,基于 PhoneGap 的混合 APP 开发技术更加成熟,优势更加凸显。移动互联网的迅猛发展,Android 和 iOS 的版本快速迭代,使 HTML5 的性能问题逐步解决。仅仅在 PhoneGap 官网上,已经有来...

crazymus
2015/04/26
0
0
看看国外的phonegap和ionic移动app开发框架有多火

在2010年左右的时候,在android内存还在512内存的时候,和多人对phonegap提出了很多的质疑,以及一些不正当竞争的国内公司,用自己的框架和jqueryMobile+phonegap组合来给phonegap泼凉水,懂...

2tman
2014/12/23
0
1
PhoneGap Desktop App 0.1.11 发布

PhoneGap Desktop App 0.1.11 发布,更新内容如下: #373 nwjs Helper process uses 100% CPU #445 modify grunt task to clean build directory We’re hoping the upgrade to npm v3.3.3 w......

oschina
2015/09/30
1K
2
[Android]PhoneGap源码分析——白名单

对于单独的Web app应用来说,加载进来的url一般不能保证它的安全性。那么如何来处理url安全性的问题呢。 让我们来看看PhoneGap是如何做的。 PhoneGap采用了白名单的形式,认为在白名单中的u...

亭子happy
2012/09/29
0
1
关于跨平台移动应用开发框架的探索 -- PhoneGap

本文通过介绍移动互联网的发展,引出了跨平台移动应用开发的现状,并对当前的跨平台移动应用开发框架进行了比较。在实践环节中,本文首先使用 PhoneGap Build 将 HTML 程序发布为多移动平台的...

IBMdW
2011/11/24
3.7K
0

没有更多内容

加载失败,请刷新页面

加载更多

深入理解JVM—JVM内存模型

深入理解JVM—JVM内存模型 我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互,而CPU运转速度越来越快,磁盘远远跟不上CPU的读写速度,才设计了内存...

onedotdot
34分钟前
1
0
MVC、MVCS、MVVM、MVP、VIPER等这么多架构模式哪一个好呢?

在项目开启阶段,其中一个很重要的环节就是选架构。 那么面对目前已知的这么多架构模式我们该怎么选择呢?这确实是个很让人头疼的问题! 下面我就在这里梳理一下目前常见的一些架构模式。 先...

Java干货分享
今天
4
0
简单模仿配置文件的反射机制

//Student类 public class Student { public void love() { System.out.println("python"); } } //Tesy类 public class Tesy { public static void main(String[] args) throws Exceptio......

南桥北木
今天
2
0
你真的需要了解一下CSS变量 var()的用法

当Web项目变得越来越大时,他的CSS会变得像天文数字那么大而且还变得混乱。为了帮助我们解决这个问题,新的CSS变量很快就会出现在主流浏览器中,它让开发人员能够重用并轻松编辑重复出现的C...

前端小攻略
今天
1
0
嵌入式应用选择合适的微控制器

为嵌入式应用选择微控制器有几个原因,即低成本,高集成度,增加可靠性,节省空间等。 准备所需硬件接口列表使用微控制器的基本硬件框图,准备一份微控制器需要支持的所有外设接口的列表。微...

linux-tao
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部