今天的笔记主要来记录最后两个知识要点之一,APP客户端版本升级的接口开发。
APP的开发主要由伟大而神圣的用户来更新,更新的流程应该是这样的:
开启APP——请求初始化接口init.php——检测是否需要更新---否——首页
---是——更新
在初始化接口的时候,需要客户端发送几个数据:
app_id 客户端id,比如: 1,安卓手机 2,iphone手机
version_id 大版本号id
version_mini 小版本号id
did 用户客户端信息(客户端工程师会获取这个数据)
encrypt_did did加密后的字符串(did 加上 APP设备数据表中的key,然后md5)
使用一个html表单来模拟一下APP客户端post发送过来的请求数据:
<!doctype html> <html> <head> <title> 模拟手机APP提交的POST数据,用户请求初始化接口init.php </title> </head> <body> <form action="./init.php" method="post"> app_id <input type="text" name='app_id' ><br/> version_id <input type="text" name="version_id"><br/> <!--did客户端的开发工程师会获取到--> did <input type="text" name="did" value="123"><br/> version_mini <input type="text" name="version_mini"><br/> encrypt_did <input type="text" name="encrypt_did" value="e10adc3949ba59abbe56e057f20f883e"><br/> <input type="submit" /> </form> </body> </html>
忘了说还需要数据库表了,这里需要两张表。一张是记录升级版本信息的表,记录着设备的id,版本号信息,下载地址等。另外一张表是记录的设备的信息,比如安卓手机的信息,安卓pad的信息等等,版本信息表中有一个外键app_id,关联的就是设备信息表的主键。
设备信息表,记录了各种客户端的信息 CREATE TABLE IF NOT EXISTS `app_table` ( `app_id` smallint(6) NOT NULL AUTO_INCREMENT COMMENT '主键', `name` varchar(10) NOT NULL COMMENT '设备名称', `is_encryption` tinyint(1) NOT NULL COMMENT '是否加密', `key` varchar(10) NOT NULL COMMENT '加密key', `image_size` text NOT NULL COMMENT '按照json来存储', `create_time` int(11) NOT NULL COMMENT '添加时间', `update_time` int(11) NOT NULL COMMENT '修改时间', `status` tinyint(1) NOT NULL COMMENT '状态 1正常0删除', PRIMARY KEY (`app_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='app设备表' AUTO_INCREMENT=2 ; 版本升级信息表,存放了各种版本的信息 CREATE TABLE IF NOT EXISTS `version_upgrade` ( `id` smallint(4) NOT NULL AUTO_INCREMENT COMMENT '主键', `app_id` smallint(4) NOT NULL COMMENT '客户端设备id', `version_id` smallint(4) NOT NULL COMMENT '大版本号id', `version_mini` mediumint(8) NOT NULL COMMENT '小版本号', `version_code` varchar(10) NOT NULL COMMENT '版本标识1.2', `type` tinyint(4) NOT NULL COMMENT '是否升级1是0否', `apk_url` varchar(255) NOT NULL COMMENT '下载链接地址', `upgrade_point` varchar(255) NOT NULL COMMENT '升级提示', `status` tinyint(4) NOT NULL, `create_time` int(11) NOT NULL COMMENT '添加时间', `update_time` int(11) NOT NULL COMMENT '修改时间', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='软件升级信息表' AUTO_INCREMENT=2 ;
为处理请求的init.php创建一个基础类,在基础类的方法check()中,进行各种判断,比如:该客户端设备是否存在,是否需要加密处理,是否有权限更新等等。
<?php /*********************************** * * 版本升级接口开发的基础类 * 学php的小蚂蚁 * 博客 http://my.oschina.net/woshixiaomayi/blog * ************************************/ //载入之前写好的接口响应类 //代码内容请参考 http://my.oschina.net/woshixiaomayi/blog/517384 require_once('./response.php'); //载入之前写好的db类 //代码内容请参考 http://my.oschina.net/woshixiaomayi/blog/518295 require_once('./db.php'); class common{ //post提交过来的数据 public $param; //该客户端设备的信息详情 public $app; //数据库连接资源 public $connect; //确认设备的版本信息,权限等 public function check(){ //post提交过来的数据整合,一行太长了,分开来写\(^o^)/~ $app_id = isset($_POST['app_id'])?$_POST['app_id']:''; $this -> param['app_id'] = $app_id; $version_id = isset($_POST['version_id'])?$_POST['version_id']:''; $this -> param['version_id'] = $version_id; $did = isset($_POST['did'])?$_POST['did']:''; $this -> param['did'] = $did; $version_mini = isset($_POST['version_mini'])?$_POST['version_mini']:''; $this -> param['version_mini'] = $version_mini; $encrypt_did = isset($_POST['encrypt_did'])?$_POST['encrypt_did']:''; $this -> param['encrypt_did'] = $encrypt_did; //判断app_id和version_id数据类型是否正确 if(!is_numeric($app_id) or !is_numeric($version_id)){ return Response::show(400,'数据不合法'); } //判断是否需要加密处理 $this->app=$this->getApp(); if(!$this->app){ return Response::show(400,'该app不存在'); } /* 判断是否有权限,判断权限的方式,1,是否需要加密处理 2,发送过来的encrypt_did是否和服务端生成的值一致 */ if($this->app['is_encryption'] && $this->param['encrypt_did'] != md5($did . $this->app['key'])){ return Response::show(405,'你没有权限'); } } //获取该设备信息 public function getApp(){ //这几天这一段都写烂了,就不写注释了 try{ $this->connect = Db::getInstance()->connect(); }catch(Exception $e){ //返回给APP的错误提示 return Response::show(400,'mysql not connect'); } $sql="select * from app_table where app_id=".$this->param['app_id']; $result=mysql_query($sql,$this->connect); return mysql_fetch_assoc($result); } //获取新版本信息 public function getVersionUpgrade($app_id){ $sql="select * from version_upgrade where app_id=".$app_id." order by create_time desc limit 1"; $result=mysql_query($sql,$this->connect); $result=mysql_fetch_assoc($result); return $result; } } ?>
创建init.php,将数据发送到这个脚本做处理即可,最后返回的数据可以确定,该客户端是否需要/能够升级版本。
<?php /******************************** * * 版本升级接口逻辑 * 学php的小蚂蚁 * 博客 http://my.oschina.net/woshixiaomayi/blog * ***************************/ //载入基础类,进行版本判断 require_once('./common.php'); class Init extends Common{ public function index(){ //本方法在基类中,确实数据的正确性 $this->check(); /* 获取新版本信息,和APP发送过来的版本信息进行对比 如果是最新版本,不升级 如果是老版本,升级 */ $version_grade=$this->getVersionUpgrade($this->param['app_id']); //检测是否拿到版本信息 if($version_grade){ /* 判断type类型看能否升级,并且判断客户端是不是最新版本 如果可以更新,添加键值is_upload = 1 不能更新,is_upload = 0 APP工程师根据返回的is_upload的值进行相应的操作 */ if ($version_grade['type'] && $this->param['version_id'] < $version_grade['version_id']) { $version_grade['is_upload']=$version_grade['type']; }else{ $version_grade['is_upload']=0; } return Response::show(200,'获取版本成功',$version_grade); }else{ return Response::show(400,'获取新版本失败'); } } } $obj = new Init(); $obj -> index(); ?>
APP客户端版本升级的接口,基本上就完成了,明天再把APP客户端错误日志接口的笔记写一下,APP接口开发的内容就结束了。学习这个也花费了不少时间 (~ ̄▽ ̄)~