手机的app分为,在线和单机,在线就是类似于C/S模式,能与服务器与他人共享数据的程序,单机就是在没有网络下可以玩转的app。

目前互联网盛行的时代,99%的程序都是联网环境下工作的。那么如何开发本地app并且能通过网络将数据上传至服务器共享成为了在线app的开发重点。

首先请理解B/S的工作模式,在web程序中,我们只是向http服务器请求了地址,服务器(无论是apache,tomcat,nginx这些都是实现了http socket的程序)返回给我们html文件,浏览器呢,对html进行解释,生成可视化的交互界面。

上面的图画的比较简易,也隐藏了大量的封装组件,事实上整个过程要比我们的图复杂的多,而作为初级开发者,我们只需要知道这些,无论是javaee,asp.net MVC,或者php类型网站的建设都有了基本的套路了!

笔者之前其实没有做过app的开发,更加没有接触过google的android sdk,虽然略知一二,但是对xml文件配置深深的厌恶感使我始终都不愿意走上原生android的开发

笔者这几年一直做的web开发,从LAMP环境到asp.net再到javaee,横跨三大平台,两大操作系统,可以说是web开发的钉子户,研究app的开发时,所以带有html5情结的我自然更加热衷于发挥html5+的开发能力

那么html5开发app和网站开发有什么区别呢?

可以说,本质上没有!你完全可以使用html5开发出与原生媲美的app,在html5不断优化的未来,html5移动开发必然是大势所趋,这得益于其快速高效的开发环境,简单易入门的特点。在线html5 app开发套路且看下图:

是不是感觉没变什么呀?确实,所以说本质上没什么区别,这就是为什么大部分网站开发者转行进入app开发更加的简单(一天不到的事情),只要你懂html5,js,css3以及些许前端框架就能动手了!

等等,请先知道一件事!

跨区请求

即,不在同一个域名下进行数据/文件的传输,当你使用浏览器浏览网页的时候并不会遇到这种问题,因为浏览器是从服务器下同一个域名下获取html,也是向这个网站返回数据文件的

但是,html5开发的app,文件是放在本地手机的,这是为了提高访问体验,手机不会向服务器请求完整的html文件,这就造成了要跨域交换数据的问题,即手机本地是一个域,服务器是另一个域!

这有什么问题吗?有啊,浏览器默认会阻止跨域请求的,没想到吧?为什么?为了安全啊!

万一有人发了一个帖子,帖子链接到别的网站下,而这个链接的js实现了将你在这个网站获取的个人资料传送到链接网站的功能,那么你点进去以后你登陆的个人资料会被另一个网站获取,这是不可能的,浏览器会使用同源策略阻止这个事情发生,毕竟这太危险了!

同理app请求的网站不应该把自己域的数据发送给另一个域(你的手机),浏览器认为数据给了别人!

解释清楚了,那么我们需要解决这个“bug”实现app与服务器的通信,其实默认的mui已经为我们解决了这个问题,用hbuilder打包的app并不存在同源策略问题,可以跨域请求数据,这种事情只会出现在浏览器访问罢了

早期,我在使用jquery mobile开发的时候,由于没有hbuilder这样的基架,不能及时打包app(开发过程都是在手机浏览器中测试写的html文件,每过一个阶段,上传到phonegap打包成本地app)

所以使用jquery mobile的朋友们,也许会遇到这样的问题,下面网上有一个小办法解决手机浏览器测试app并访问其他网站数据,这也是我以前使用的方法:

js之前,jquery.js之后)*/
$(document).on("mobileinit",function(){
//支持域名ajax加载
$.support.cors=true;
$.mobile.allowCrossDomainPages=true;
$.mobile.pushState=false;
});

这样在手机浏览器里测试h5 app就不成问题了,实际打包成phonegap之后,是不需要的,因为phonegap使用file协议来发送请求,并且本身不会有同源策略

Phonegap wiki里面说: ”The cross-domain security policy does not affect PhoneGap applications. Since the html files are called by webkit with the file:// protocol, the security policy does not apply.”

但是,根据我前年jquery mobile开发app的经验,jquery mobile根本不适合app的开发,这里没有黑jquery mobile,他本身的特性就是为wap而生的,就是适合手机页面开发,不适合打包为app,因为他没有完整的打包环境,即不好使用html5+!

且jquery mobile本身也比较臃肿!虽然功能强大,但是却不涉及5+,不能使用5+的app不是完整的app!所以以后我可能会用jqmobile开发wap页面,建议放在微信开发当中

app开发请使用mui,用了mui之后,请忘记上面说的各种问题,我们开门见山,直插主题,做联网的app!O(∩_∩)O

我们做联网app只需知道两点:

首先我们使用ajax和服务器进行通讯,mui.ajax()可以做到这一切

其次,数据交换使用json,商业项目请规定好固定的json格式!

使用ajax之前,请先对ajax进行封装,这样减少实际项目中代码量,我是这么做的:

新建一个app.js,每一个页面都用的公共类库

ajax的封装代码:

HTTP_DOMAIN = "http://192.168.31.130/dashen/public/index.php/app/";      //全局变量,域名以及常用路径
  //使用全局进度条
var progress = mui("body").progressbar();
//把通用的ajax请求打包起来
owner.request = function(ctl, act, dataObj, callback) {
//全局进度条
callback = callback || $.noop;
ctl = ctl;
act = act;
var url = HTTP_DOMAIN + ctl + "/" + act;
mui.ajax(url, {
data: dataObj,
dataType: 'json',
timeout: 5000,
type: 'post',
beforeSend: function(XMLHttpRequest) {
progress.show();
},
complete: function(XMLHttpRequest, textStatus) {
progress.hide();
},
success: function(response) {
return callback(response);
},
error: function(xhr, type, error) {
if(type === "timeout")
//不可以使用plus,需要使用mui的toast
mui.toast("连接超时,请检查网络");
else
mui.toast("未知网络错误,找不到服务器了,稍后试试呗");
}
});

注意到,我们找了一些请求的共同点,加载条和网络错误信息,这些都是每一个请求都需要的,就不必要在每个页面重新写一遍,这就是封装的意义

其中ajax有一些参数:

beforeSend:发送前的事件,我们可以打开加载进度条,使用的是mui自带的全局进度条

complete:这是ajax结束之后的事件,不管是失败还是成功最后会触发,所以关闭进度条是最合适的

success:请求成功了,这里的成功是指访问到了服务器并且服务器执行顺利返回了数据,我们放一个回掉函数,将获取的json数据回掉,这样我们就可以实现请求之后根据不同页面的不同需求执行不同的方法

error:这里统一报错,使用mui自带的提示功能

url:这个参数是请求的地址,这里使用一个全局变量+控制器类名+方法名的形式,以便访问不同的方法,需要的时候只需向request所在的闭包传入类名,方法名即可

注意开头的owner是闭包的名称,这个request方法放在一个js闭包中,防止与外部的同名方法冲突,实现类似于jquery,如下:

function($, owner) {
/*闭包中包含的各种公共方法*/
owner.request=function(){};
owner.xxx = function(){};
}(mui, window.app = {}));

现在可以调用这个已经封装好ajax的方法了:例

app.request('User', 'checkLogin', {}, function(res) {
if(res.status == 1 && res.data.token == state.token) {
//如果检测服务器存在且本地相对应不操作
plus.navigator.closeSplashscreen();
unfullscreen();
app.setUserInfo(res.data); //存储服务器获取的个人信息
update_head_info(); //刷新头部信息
} else {
plus.nativeUI.toast(res.info);
app.clearToken();
app.toLogin();
}
});

最后一个function就是传入的回掉函数callback

好了,这样一个联网的h5 app就这么简单的实现了,至于这个封装ajax的方法还可扩充适应不同场合,可以自行研究修改!

注意:服务器请返回json格式,请放弃古老的xml,给个我用的thinkphp5框架后端的示例:

        if($res && $id)
return ['status'=>1,'info'=>'注册成功'];  //json
else
return ['status'=>0,'info'=>'用户信息写入错误,稍后重试'];  //json

这段代码的前提是,配置thinkphp统一返回json而不是view()

  // app的默认输出都是json,需要按照规范输出到app客户端
'default_return_type' => 'json',
// 默认AJAX 数据返回格式,可选json xml ...
'default_ajax_return' => 'json',

其他后端框架,其他语言请使用各自的json返回配置,方法和函数

mui开发app之联网应用传输数据的更多相关文章

  1. mui开发app之js将base64转图片文件

    之前我已经做过一个利用cropper裁剪并且制作头像的功能.如何在mui app中实现相册或相机获取图片后裁剪做头像请看另一篇博客:mui开发app之cropper裁剪后上传头像的实现 但是当时裁剪后 ...

  2. mui开发app之cropper裁剪后上传头像的实现

    在大多数app项目中,都需要对用户头像的上传,之前做web开发的时候,我主要是通过input type=file的标签实现的,上传后,使用php对图片进行裁剪,这种方式比较传统简单. 此次app开发中 ...

  3. 利用 MUI开发app, 如何实现侧滑菜单及其主体部分上下滑动

     利用mui开发APP 之侧滑菜单主内容滚动问题 MUI作为开发者常用的框架之一,其号称最接近原生APP体验的高性能前端框架.因此利用mui开发移动APP,可以为开发者提供很大的便利和接近原生的体验. ...

  4. mui开发app前言(一)

    dcloud mui开发app前言 大一那会就听说html5快要发布了,前景无量,厉害到能写操作系统==|||(什么???蛤?) 似乎html5标准还没正式发布那会,使用hybrid模式开发app已经 ...

  5. MUI开发APP,scroll组件,运用到区域滚动

    最近在开发APP的过程中,遇到一个问题,就是内容有一个固定的头部和底部.         头部就是我们常用的header了,底部的话,就放置一个button,用来提交页面数据或者进入下一个页面等,效果 ...

  6. mui开发app之html5+,5+Runtime,5+sdk,native.js

    说说几个名词 html5:目前最新的html规范,w3c联盟制定,手机端主要由webkit实现规范,对用户来说就是浏览器实现了它 html5+:所谓"+",扩充了html5原本没有 ...

  7. mui开发app之webview是什么

    WebView(网络视图)能加载显示网页,可以将其视为一个浏览器,webview被封装在html5+,plus对象中,底层由java,OC实现. 先来谈谈我对webview的理解: 使用mui开发的a ...

  8. mui开发app之自定义事件以更新其他页内容

    我之前做过jquery mobile的开发,那还是前年的事情 在jquery mobile中,由于页面是存储在div[data-role=page]的dom中(jqmobile通过对data-role ...

  9. mui开发app之多图压缩与上传(仿qq空间说说发表)

    欲实现效果图 提出需求点: 用户可自由添加删除替换多张图片,并且显示相应缩略图,限制为8张 用户可选择压缩图或直接上传原图功能 返回提醒用户会丢失填写的信息 下面一个个实现上述需求,从简单到复杂: 需 ...

随机推荐

  1. 计算两个YUV420P像素数据的PSNR---高等算法

    PSNR是最基本的视频质量评价方法.本程序中的函数可以对比两张YUV图片中亮度分量Y的PSNR.函数的代码如下所示. /** * Calculate PSNR between 2 YUV420P fi ...

  2. 简单的add函数的N种写法

    最近在学习es6,看到for-of这里,就想自己写着练习一下,于是就准备写一个小函数add来求和.函数很简单,如add(1,2,3)这样.于是我开始着手 一开始我是这么写的 function add( ...

  3. Delphi的Hint介绍以及用其重写气泡提示以达到好看的效果

    Delphi中使用提示是如此简单,只需将欲使用Hint的控件作如下设置: ShowHint := True; Hint := ‘提示信息’; 不必写一行代码,相当方便. 但有时我们又想自己定制提示的效 ...

  4. TextRank:关键词提取算法中的PageRank

    很久以前,我用过TFIDF做过行业关键词提取.TFIDF仅仅从词的统计信息出发,而没有充分考虑词之间的语义信息.现在本文将介绍一种考虑了相邻词的语义关系.基于图排序的关键词提取算法TextRank [ ...

  5. WEB开发性能优化--核心定义介绍篇(1)

    推荐理由 随着 互联网的蓬勃发展,并且伴随着产品功能的越来越复杂,对于技术人员来说最大的挑战就是如何在保证业务快速发展的同时,也可保证不断复杂的业务对用户体验的影响,其中对用户来说最重要的体验指标是如 ...

  6. Unity 3D Framework Designing(8)——使用ServiceLocator实现对象的注入

    对象的 『注入』 是企业级软件开发经常听到的术语.如果你是一个 Java 程序员,一定对注入有着深刻的映像.不管是SSH框架还是SSM框架,Spring 全家桶永远是绕不过去的弯.通过依赖注入,可以有 ...

  7. POJ2352Stars【树状数组】

    Stars Description Astronomers often examine star maps where stars are represented by points on a pla ...

  8. 手机自动化测试:appium源码分析之bootstrap十六

    手机自动化测试:appium源码分析之bootstrap十六   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣 ...

  9. 5.Redis常用命令:Hash

    我们可以将Redis中的Hashes类型看成具有String Key和String Value的map容器.所以该类型非常适合于存储值对象的信息.如Username.Password和Age等.如果H ...

  10. Andorid自动读取短信验证码

    手机收到验证码短信后,程序自动识别验证码并填充验证码输入框. 思路是有了,实现的方式也有多种: 1.开启一个线程,隔一段时间就去查询收件箱是否有变化,有变化再读取出来做处理. 2.注册一个短信变化的广 ...