今天的笔记主要来记录最后两个知识要点之一,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接口开发的内容就结束了。学习这个也花费了不少时间 (~ ̄▽ ̄)~
来源:oschina
链接:https://my.oschina.net/u/1423209/blog/519783