今天的筆記主要來記錄最後兩個知識要點之一,APP客戶端版本升級的接口開發。
php
APP的開發主要由偉大而神聖的用戶來更新,更新的流程應該是這樣的:
html
開啓APP——請求初始化接口init.php——檢測是否須要更新---否——首頁mysql
---是——更新sql
在初始化接口的時候,須要客戶端發送幾個數據:數據庫
app_id 客戶端id,好比: 1,安卓手機 2,iphone手機
json
version_id 大版本號id
app
version_mini 小版本號id
iphone
did 用戶客戶端信息(客戶端工程師會獲取這個數據)
post
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接口開發的內容就結束了。學習這個也花費了很多時間 (~ ̄▽ ̄)~