文档章节

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

嗜学如命的小蚂蚁
 嗜学如命的小蚂蚁
发布于 2015/10/21 11:34
字数 1546
阅读 2831
收藏 10
点赞 3
评论 1

    今天的笔记主要来记录最后两个知识要点之一,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
小蚂蚁学习APP接口开发(1)—— json方式封装通信接口

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

嗜学如命的小蚂蚁
2015/10/13
985
0
小蚂蚁学习APP接口开发(6)—— APP接口实例——首页数据接口的案例实现

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

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

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

掘金官方
2017/12/06
0
0
PHP 开发 APP 接口 学习笔记与总结 - APP 接口实例 [5] 版本设计分析及数据表设计

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

蜗牛奔跑
2016/10/15
69
0
巧用第三方快速开发Android App 热门第三方SDK及框架

巧用第三方快速开发Android App 热门第三方SDK及框架 历经大半年的时间,终于是把这门课程给录制出来了,也就在今天,正式在慕课网上上线了 项目地址:巧用第三方快速开发Android App 热门第三...

qq_26787115
2017/01/12
0
0
SpringCloud Eureka 源码解析 —— 应用实例注册发现(八)之覆盖状态

SpringCloud Eureka 源码解析 —— 应用实例注册发现(八)之覆盖状态 Harries Blog™2017-11-065 阅读 ACESpringAppcachecatAPIbuildActionb 摘要: 原创出处 http ://www. ioc oder.cn/ Eu...

Harries Blog™
2017/11/06
0
0
Android架构分层演进实践

起源 我们知道,软件开发项目是一个综合平衡的过程,要平衡时间、成本、范围、质量四个要素,在单个项目中,这四要素是非此即彼的:时间紧迫就要压缩需求范围,添加需求就要追加成本,确保质...

蓝灰_q
2017/11/16
0
0
小蚂蚁学习APP接口开发(8)—— APP接口实例——服务器定时缓存的方式开发接口

基本的思路:服务器只负责定时更新缓存。请求进来只需要读取缓存就可以了。 服务器定时执行生成缓存的代码: <?php /** crontab 定时生成缓存文件 /usr/bin/php /app/crontab.php* 学php的小...

嗜学如命的小蚂蚁
2015/10/20
229
0
iOS证书说明和发布内购流程整理

网上关于苹果证书的生成和设置的教程比较多,但大多数只是讲了相关流程和步骤,有的也只是简要进行了相关说明,总之介绍的不够详细,自己最初在接触的时候也是比较困惑,下面进行总结。请结合...

蛙牛
2015/05/19
0
9

没有更多内容

加载失败,请刷新页面

加载更多

下一页

SpringBoot | 第十章:Swagger2的集成和使用

前言 前一章节介绍了mybatisPlus的集成和简单使用,本章节开始接着上一章节的用户表,进行Swagger2的集成。现在都奉行前后端分离开发和微服务大行其道,分微服务及前后端分离后,前后端开发的...

oKong
今天
4
0
Python 最小二乘法 拟合 二次曲线

Python 二次拟合 随机生成数据,并且加上噪声干扰 构造需要拟合的函数形式,使用最小二乘法进行拟合 输出拟合后的参数 将拟合后的函数与原始数据绘图后进行对比 import numpy as npimport...

阿豪boy
今天
1
0
云拿 无人便利店

附近(上海市-航南路)开了家无人便利店.特意进去体验了一下.下面把自己看到的跟大家分享下. 经得现场工作人员同意后拍了几张照片.从外面看是这样.店门口的指导里强调:不要一次扫码多个人进入....

周翔
昨天
1
0
Java设计模式学习之工厂模式

在Java(或者叫做面向对象语言)的世界中,工厂模式被广泛应用于项目中,也许你并没有听说过,不过也许你已经在使用了。 简单来说,工厂模式的出现源于增加程序序的可扩展性,降低耦合度。之...

路小磊
昨天
163
1
npm profile 新功能介绍

转载地址 npm profile 新功能介绍 npm新版本新推来一个功能,npm profile,这个可以更改自己简介信息的命令,以后可以不用去登录网站来修改自己的简介了 具体的这个功能的支持大概是在6这个版...

durban
昨天
1
0
Serial2Ethernet Bi-redirection

Serial Tool Serial Tool is a utility for developing serial communications, custom protocols or device testing. You can set up bytes to send accordingly to your protocol and save......

zungyiu
昨天
1
0
python里求解物理学上的双弹簧质能系统

物理的模型如下: 在这个系统里有两个物体,它们的质量分别是m1和m2,被两个弹簧连接在一起,伸缩系统为k1和k2,左端固定。假定没有外力时,两个弹簧的长度为L1和L2。 由于两物体有重力,那么...

wangxuwei
昨天
0
0
apolloxlua 介绍

##项目介绍 apolloxlua 目前支持javascript到lua的翻译。可以在openresty和luajit里使用。这个工具分为两种模式, 一种是web模式,可以通过网页使用。另外一种是tool模式, 通常作为大规模翻...

钟元OSS
昨天
2
0
Mybatis入门

简介: 定义:Mybatis是一个支持普通SQL查询、存储过程和高级映射的持久层框架。 途径:MyBatis通过XML文件或者注解的形式配置映射,实现数据库查询。 特性:动态SQL语句。 文件结构:Mybat...

霍淇滨
昨天
2
0
开发技术瓶颈期,如何突破

前言 读书、学习的那些事情,以前我也陆续叨叨了不少,但总觉得 “学习方法” 就是一个永远在路上的话题。个人的能力、经验积累与习惯方法不尽相同,而且一篇文章甚至一本书都很难将学习方法...

_小迷糊
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部