基于phonegap开发app的实践
app开发告一段落。期间遇到不少问题,写篇文章记录一下。
为虾米要用phonegap
开发app,至少要考虑android和ios两个版本号吧,android偶能够应付,ios表示全然木有接触过。于是时间成本、开发成本上去了。phonegap则攻克了这个问题,并且对po主而言。用web开发的方式来搞app非常爽啊有木有!
当然,用之前还是要调研下。基于phonegap的app有木有成功案例。大公司里腾讯的qq邮箱ios版,豆瓣的豆瓣音乐人都是基于phonegap。
重点看了看豆瓣音乐人,非常无耻的反编译了一下apk。竟然代码都木有压缩过
,正好方便了偶研究。
豆瓣音乐人的实践
从体验上讲,豆瓣音乐人和native的app还是有差距,首先,点击tab有明显的延迟,另外,豆瓣音乐人整个页面仅仅有一个view,即下图中的frame(view能够理解为app的一个界面。每一个app看成是由非常多个视图界面组成的)。视图之间的切换效果,是先在frame以下再创建一个新frame,里面是将要切换进来的视图代码,然后用css3 transform做视图切换动画,动画结束之后,把原来的frame删除。
也就是,在页面中保证仅仅存在一个frame。
这么做应该是基于性能考虑,可是牺牲了部分体验,比方一个列表,滚动到第3屏。点到列表详情。再返回,视图不是停留在点进详情页之前的位置,而是回到了顶部。

豆瓣音乐人事实上还是以浏览为主的app。功能比較轻,而我们的app则是包括了发帖、传图片等功能,表示鸭梨非常大,但值得尝试。
技术方案
总体技术方案是:
phonegap负责和底层OS通信,调用摄像头、获取网络状态等
backbone+underscore做路由以及视图渲染
iscroll做布局
css3做动画效果
路由及视图管理
整个app事实上是个single page application(SPA),对于SPA来说,路由和视图的管理非常重要。我用了backbone+underscore来做这个事情。
通过backbone的router实现不同hash值相应不同视图。视图里用到的模版用underscore。
app布局
典型的app布局例如以下图,header和footer固定。中间内容能够滚动,第一个想到的就是用position:fixed,可是po主google一下。android 2.x,ios5下面不支持position:fixed。然后po主看到了业界比較推荐的iscroll。试了些demo。po主就决定用iscroll了。

用iscroll有下面几点优点:
1、非常easy实现app的布局,并且每一个视图是用的绝对定位,这样做视图切换动画的时候非常方便
2、下拉刷新,上拉载入也一并实现了
3、iscroll自带左右滑动的手势功能
弊端:
1、滚动区域里图片多了。低端机卡爆- -
2、iscroll引发的“fake click”问题
其它倒没有什么弊端了
视图切换
考虑到体验问题。没有採用豆瓣的做法, 事实上本来我是想用angularJs而不是backbone+underscore,可是angularJs的视图切换原理也是先append一个frame,动画结束再删掉这个frame。这样的做法一是无法保留原有视图的状态,第二视图渲染是须要时间的,导致动画切换时,下一个视图会有非常短暂的空白时间。
所以我的做法是,多个视图并存,要展示哪个视图就加上current,并调用计算视图相对位置和滑动动画的函数。

屏幕大小及分辨率适配
屏幕大小:布局要自适应不同的屏幕大小。所以固定宽度神马的尽量少用。改用百分比
屏幕像素密度:主要影响到css里引用的图片,以及页面中展示的图片(即img标签的图片),豆瓣音乐人的做法是对不同密度提供不同的图片,可是po主比較懒,仅仅针对像素密度为2的做了一套。比方有个叫icon的div,我们能够这样
.icon{
width:20px;
height:20px;
background: url(‘../images/icon.png’) no-repeat 0 0;
background-size: contain;
}
icon.png的大小事实上是40*40,这样尽管有点浪费资源。可是减轻了工作量啊有木有 
对于页面中的img标签。提供的图片也是2倍展示宽度的,这个倒是浪费部分用户流量了- -
其它
dom操作和事件还是用的jquery,不要问偶为什么- -
关于开发中遇到的各种问题,请看下一篇
參考文献
基于phonegap开发app的实践的更多相关文章
- 吐槽:基于PhoneGap开发移动项目
目前,随着Google的Android手机和苹果的iphone手机的逐渐普及,越来越多开发者加入到移动应用开发的大军当中.其中,Android应用是基于Java语言基础上进行开发的,而苹果公司的iph ...
- phonegap开发app中踩过的那些坑
把遇到的问题列出来,假设有解决方式的,偶也会写下来.假设大家有更好解决方法的.欢迎留言噢 phonegap 2.9无法触发deviceready事件 亲们能够看下控制台有木有报错.假设有提示cordo ...
- 使用PhoneGap开发基于Html5应用二:第一个PhoneGap应用:百度
上一篇博文使用PhoneGap开发基于Html5应用一:PhoneGap简单介绍 中我介绍了怎样从phonegap官网上下载源代码并启动第一个应用,今天我们把phonegap的应用略微改一下,让他实现 ...
- c++开发ocx入门实践三--基于opencv的简易视频播发器ocx
原文:http://blog.csdn.net/yhhyhhyhhyhh/article/details/51404649 利用opencv做了个简易的视频播放器的ocx,可以在c++/c#/web ...
- 基于Android开发的天气预报app(源码下载)
原文:基于Android开发的天气预报app(源码下载) 基于AndroidStudio环境开发的天气app -系统总体介绍:本天气app使用AndroidStudio这个IDE工具在Windows1 ...
- 用mui框架开发手机app项目实践中的那些事儿
http://www.yilingsj.com/xwzj/2015-04-29/260.html 最近在玩mui框架,坑的我是:西湖的水,全都是眼泪!!! 公司的手机app要进行改版,我率先想到的是j ...
- 比较了一下基于PhoneGAP/JQ Mobile 等基于HTML5的Phone 开发框架
比较了一下基于PhoneGAP/JQ Mobile 等基于HTML5的Phone 开发框架,如果做APP客户端的化,想达到Native UI的效果,都是胡扯的,根本不可能. PhoneGAP 如果想达 ...
- mui开发app前言(一)
dcloud mui开发app前言 大一那会就听说html5快要发布了,前景无量,厉害到能写操作系统==|||(什么???蛤?) 似乎html5标准还没正式发布那会,使用hybrid模式开发app已经 ...
- Cordova 开发 App
Cordova 是一个开源的移动开发框架.允许你用标准的 Web 技术——HTML5,CSS3 和 JavaScript 做跨平台开发.应用在每个平台的具体执行被封装了起来,并依靠符合标准的 API ...
随机推荐
- Entity Framework的原理及使用方式
ADO.NET Entity Framework操作数据库的过程对用户是透明的(当然我们可以通过一些工具或方法了解发送到数据库的SQL语句等).我们唯一能做的是操作EDM,EDM会将这个操作请求发往数 ...
- kill&&pkill&&killall---删除执行中的程序
命令功能: 发送指定的信号到相应进程.不指定型号将发送SIGTERM(15)终止指定进程.如果无法终止该程序可用“-KILL” 参数,其发送的信号为SIGKILL(9) ,将强制结束进程 使用ps命令 ...
- Windows学习总结(2)——30+ Windows命令提示符快捷键汇总
即便你平时经常用到 Windows 命令提示符,可能也会对本文将提到的快捷键数量感到惊讶.其实我们可以使用快捷键来简化命令提示符中的选择操作,或对文本进行重复操作,下面我们会列出完整列表. 大家都知道 ...
- PHP glob() 函数详解
PHP glob() 函数详解 一.总结 glob()作用:glob() 函数返回匹配指定模式的文件名或目录. glob()返回值:该函数返回一个包含有匹配文件 / 目录的数组.如果出错返回 fals ...
- Flume的可管理性
Flume的可管理性 所有agent和Collector由master统一管理,这使得系统便于维护. 多master情况,Flume利用 ZooKeeper和gossip,保证动态配置数据的一致性. ...
- 简约之美jodd--props属性使用
Prop是一个超级properties:包含了很多jdk缺失的东西:utf-8支持,宏,分区,profiles,全配置等等. 属性存储在一个或者多个*.props文件,而且它是开放的,支持多种类型的资 ...
- 洛谷 P1313 计算系数
题目描述 给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^m 项的系数. 输入输出格式 输入格式: 输入文件名为factor.in. 共一行,包含5 个整数,分别为 a ,b ,k , ...
- 《四》JAVA 字符输入输出流
那么这篇博客我们讲的是字节输入输出流:Reader.Writer(下图红色长方形框内),红色椭圆框内是其典型实现(FileReader.FileWriter) ①.为什么要使用字符流? 因为使用字节流 ...
- 界面实例--旋转的3d立方体
好吧,这里直接编辑源码并不允许设置css和js……毕竟会有危险……那直接放代码吧 <!DOCTYPE html> <html> <head> <meta ch ...
- 设计模式六大原则(三):依赖倒置原则(Dependence Inversion Principle)
依赖倒置原则(DIP)定义: 高层模块不应该依赖低层模块,二者都应该依赖其抽象:抽象不应该依赖细节:细节应该依赖抽象. 问题由来: 类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码 ...