文档章节

小蚂蚁学习APP接口开发(9)—— APP版本升级的接口实例

嗜学如命的小蚂蚁
 嗜学如命的小蚂蚁
发布于 2015/10/21 11:34
字数 1546
阅读 2877
收藏 10

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


© 著作权归作者所有

共有 人打赏支持
嗜学如命的小蚂蚁
粉丝 137
博文 161
码字总数 100864
作品 0
郑州
程序员
加载中

评论(1)

独行人945
version_id是大版本号,为什么判断版本要用它?客户端工程师不是拿到版本号是1.2或1.3或1.4这种吗?也就是version_code,version_id具体传的是什么
用PHP写APP接口,现在我也在学习中。。。

现在app这么火,作为一个phper,应该知道如何写app的接口,下面做一个讲解。Index: 第1章 APP接口简介 - 第2章 封装通信接口方法 2-1 JSON方式封装通信接口 (14:39) 2-2 PHP生成XML数据 (12:...

YSail
07/05
0
0
PHP 开发 APP 接口 学习笔记与总结 - APP 接口实例 [5] 版本设计分析及数据表设计

APP 版本升级以及 APP 演示 ① 版本升级分析以及数据表设计 ② 版本升级接口开发以及 APP 演示 /** version_upgrade 版本升级信息表 */CREATE TABLE ( smallint(4) unsigned NOT NULL AUTO_...

蜗牛奔跑
2016/10/15
69
0
小蚂蚁学习APP接口开发(1)—— json方式封装通信接口

前段时间,和公司的一个安卓程序员配合开发一款简单的APP,因为第一次写,时间也紧张,总感觉写的不是那么的完美,趁着这段时间好好总结一下经验。 对于APP的请求,服务器返回的数据类型一般...

嗜学如命的小蚂蚁
2015/10/13
985
0
开源框架使用指南

【Android】Retrofit 网络请求 Service,@Path、@Query、@QueryMap... 【Android】Retrofit 网络请求 Service,@Path、@Query、@QueryMap... 别再浪费时间搭框架了,可能最适合的 mvp 框架来...

掘金官方
2017/12/06
0
0
小蚂蚁学习APP接口开发(6)—— APP接口实例——首页数据接口的案例实现

读取数据的三种方式 读取数据库方式开发首页接口 从数据库获取数据——》封装——》生成接口数 优点:数据时效性比较高的系统 2. 读取缓存方式开发首页接口(用途非常广) 从数据库获取信息—...

嗜学如命的小蚂蚁
2015/10/18
805
0

没有更多内容

加载失败,请刷新页面

加载更多

你为什么在Redis里读到了本应过期的数据

一个事故的故事 晚上睡的正香突然被电话吵醒,对面是开发焦急的声音:我们的程序在访问redis的时候读到了本应过期的key导致整个业务逻辑出了问题,需要马上解决。 看到这里你可能会想:这是不...

IT--小哥
今天
2
0
祝大家节日快乐,阖家幸福! centos GnuTLS 漏洞

yum update -y gnutls 修复了GnuTLS 漏洞。更新到最新 gnutls.x86_64 0:2.12.23-22.el6 版本

yizhichao
昨天
5
0
Scrapy 1.5.0之选择器

构造选择器 Scrapy选择器是通过文本(Text)或 TextResponse 对象构造的 Selector 类的实例。 它根据输入类型自动选择最佳的解析规则(XML vs HTML): >>> from scrapy.selector import Sele...

Eappo_Geng
昨天
4
0
Windows下Git多账号配置,同一电脑多个ssh-key的管理

Windows下Git多账号配置,同一电脑多个ssh-key的管理   这一篇文章是对上一篇文章《Git-TortoiseGit完整配置流程》的拓展,所以需要对上一篇文章有所了解,当然直接往下看也可以,其中也有...

morpheusWB
昨天
5
0
中秋快乐!!!

HiBlock
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部