使用Appcan客戶(hù)端自動(dòng)更新PHP版本號(hào)(全)
在項(xiàng)目開(kāi)發(fā)過(guò)程中遇到app端自動(dòng)更新,查閱了相關(guān)資料然后把Appcan客戶(hù)端自動(dòng)更新PHP版本號(hào)的方法整理出來(lái),具體代碼講解如下。
服務(wù)端文件:update.php、version.php、version.xml
update.php 內(nèi)容:
PHP
<?php define('CIN', true); $oldver = $_REQUEST['ver'];//客戶(hù)端傳過(guò)來(lái)的版本號(hào) $platform = $_REQUEST['platform'];//客戶(hù)端的平臺(tái) $info = simplexml_load_file('version.xml'); $iphone_filename=$info->news['iphone_filename']; //iphone下載文件 $android_filename=$info->news['android_filename']; //androiad下載文件 $version=$info->news['version']; //版本號(hào) if ($version>$oldver) { switch ($platform) { case "0"://iphone echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>"; echo "<results>"; echo "<updateFileName>i2ty</updateFileName>";//客戶(hù)端名字 echo "<updateFileUrl>itunesURL</updateFileUrl>";//返回給客戶(hù)端的下載地址 echo "<fileSize>0</fileSize>";//文件大小 echo "<version>".$version."</version>";//版本信息 echo "</results>"; break; case "1"://android echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>"; echo "<results>"; echo "<updateFileName>i2ty</updateFileName>";//客戶(hù)端名字 echo "<updateFileUrl>http://i2ty.com/app/".$android_filename."</updateFileUrl>";//返回給客戶(hù)端的下載地址 echo "<fileSize>0</fileSize>";//文件大小 echo "<version>".$version."</version>";//版本信息 echo "</results>"; break; } } ?>
version.php 內(nèi)容:
PHP
<?php define('CIN', true); $result['vtitle']="更新"; $result['vcontent']="新版本有更新喔!~新增功能修復(fù)各種錯(cuò)誤"; print_r(json_encode($result)); ?> version.xml 內(nèi)容: PHP <?xml version="1.0" encoding="utf-8" ?> <root desc="Login"> <news version="00.00.0001" iphone_filename="i2ty.ipa" android_filename="i2ty.apk" /> </root> index.html 客戶(hù)端: PHP window.uexOnload = function(type){ if (!type) { update(); } var flag_sdcard = 1; var updateurl = '';//下載新apk文件地址 var filepath2 = "/sdcard/";//保存到sd卡 var fileName = '';//新版本文件名 var platform = '';//平臺(tái)版本 function update() { //安卓版 ,顯示下載進(jìn)度 (step:7) uexDownloaderMgr.onStatus = function(opId, fileSize, percent, status) { if (status == 0) { // 下載中... Log('download percent ' + percent + '%'); uexWindow.toast('1', '5', '正在下載'+localStorage.app_title+'新版,請(qǐng)稍后。進(jìn)度:' + percent + '%', ''); } else if (status == 1) {// 下載完成. uexWindow.closeToast(); uexDownloaderMgr.closeDownloader('14');//關(guān)閉下載對(duì)象 uexWidget.installApp(filepath2+fileName);// 安裝下載apk文件 } else { uexWindow.toast('1', '5', '下載出錯(cuò),請(qǐng)關(guān)閉'+localStorage.app_title+'再次運(yùn)行.', ''); } }; //安卓版 ,創(chuàng)建下載對(duì)象回調(diào)函數(shù)(step:6) uexDownloaderMgr.cbCreateDownloader = function(opId, dataType, data) { Log('uexDownloaderMgr.cbCreateDownloader data='+data); if (data == 0) { //updateurl是通過(guò)調(diào)用cbCheckUpdate回調(diào)后,放入全局變量的 uexDownloaderMgr.download('14', updateurl, filepath2+fileName, '0');//開(kāi)始下載apk文件 } else if (data == 1) { ; } else { ; } }; //提示更新模態(tài)框按鈕事件回調(diào)函數(shù),判斷用戶(hù)選擇更新還是取消 (step:5) uexWindow.cbConfirm = function(opId, dataType, data) { Log('uexWindow.cbConfirm '); //調(diào)用對(duì)話框提示函數(shù) if (data == 0) { //用戶(hù)點(diǎn)擊稍后按鈕,不進(jìn)行更新 } else { //用戶(hù)點(diǎn)擊確定按鈕,進(jìn)行更新 if (platform == 0) { //蘋(píng)果版更新,通過(guò)瀏覽器加載appstore路徑 uexWidget.loadApp(updateurl,'',''); //uexWidget.loadApp("", "", updateurl);//舊方法 已經(jīng)不可以使用了。 } else if (platform == 1) { //安卓版更新,通過(guò)創(chuàng)建下載對(duì)象進(jìn)行下載 uexDownloaderMgr.createDownloader("14"); } else { ; } } }; //調(diào)用檢查更新回調(diào)函數(shù),請(qǐng)求成功后,彈出模態(tài)框讓用戶(hù)選擇是否現(xiàn)在更新(step:4) uexWidget.cbCheckUpdate = function(opCode, dataType, jsonData) { Log('jsonData='+jsonData); var obj = eval('(' + jsonData + ')'); if (obj.result == 0) { // tips = "更新地址是:" + obj.url + "<br>文件名:" + obj.name + "<br>文件大小:" + // obj.size + "<br>版本號(hào):" + obj.version; updateurl = obj.url; fileName = obj.name+".apk"; getVersionContent(); // var value = "稍后;更新"; // var mycars = value.split(";"); // uexWindow.confirm('', '當(dāng)前有新版本,是否更新?', mycars);//彈出提示框,是否確定更新 } else if (obj.result == 1) { //蘋(píng)果 //alert("更新地址是:" + obj.url + "<br>文件名:" + obj.name + "<br>文件大?。? + //obj.size + "<br>版本號(hào):" + obj.version) ;// tips = "當(dāng)前版本是最新的";alert(tips); } else if (obj.result == 2) { ;// tips = "未知錯(cuò)誤";alert(tips); } else if (obj.result == 3) { ;// tips = "參數(shù)錯(cuò)誤";alert(tips); } }; //檢查是否已經(jīng)存在sd卡的回調(diào)函數(shù)(step:3) uexFileMgr.cbIsFileExistByPath = function(opCode, dataType, data) { Log('uexFileMgr.cbIsFileExistByPath flag_sdcard='+flag_sdcard+' , data='+data); if (flag_sdcard == 0) { if (data == 0) { Log('sdcard不存在,根據(jù)具體情況處理'); } else { //執(zhí)行檢查更新 uexWidget.checkUpdate();//根據(jù)config.xml里面配置的檢查更新地址發(fā)起http請(qǐng)求 } flag_sdcard = 1; } }; //獲取平臺(tái)版本回調(diào)函數(shù),確定是客戶(hù)端是那個(gè)平臺(tái)的客戶(hù)端 (step:2) uexWidgetOne.cbGetPlatform = function(opId, dataType, data) { Log('uexWidgetOne.cbGetPlatform '); //獲取系統(tǒng)版本信息回調(diào)函數(shù) platform = data; Log('platform= '+platform); if (data == 0) { // 是iphone uexWidget.checkUpdate();// 直接調(diào)用檢查更新,檢查更新地址在config.xml里面有配置 } else if (data == 1) { // 是android flag_sdcard = 0; uexFileMgr.isFileExistByPath('/sdcard/');//先判斷是否存在sd卡,再調(diào)用checkUpdate來(lái)進(jìn)行更新 } else { // 是平臺(tái) } }; uexWidgetOne.getPlatform();//獲取平臺(tái)版本 (step:1) } function Log(s) { uexLog.sendLog(s); } function getVersionContent(){ var url = web_url+"version.php"; uexXmlHttpMgr.onData = getvSuccess; uexXmlHttpMgr.open(777, "get", url,""); uexXmlHttpMgr.send(777); } function getvSuccess(opid,status,result){ if (status == -1) { uexWindow.toast("0","5","連接不上網(wǎng)絡(luò)^_^哦","3000"); } if(status==1){ uexXmlHttpMgr.close(777); uexWindow.closeToast(); if(result=="[]"){uexWindow.toast("0","5","無(wú)","2000");} else{ var con=eval('(' + result + ')') var value = "稍后;更新"; var mycars = value.split(";"); uexWindow.confirm(con.vtitle, con.vcontent, mycars);//彈出提示框,是否確定更新 } } }
最后app 的 config.xml 文件配置更新地址填寫(xiě)為:
http://www.i2ty.com/update.php
APP端更新提示:
彈窗內(nèi)容根據(jù) version.php 文件內(nèi)容可以自定義。
以上內(nèi)容就是本文講解使用Appcan客戶(hù)端自動(dòng)更新PHP版本號(hào)的方法,希望對(duì)大家有所幫助。
- 利用PHP如何寫(xiě)APP接口詳解
- 淺談使用 PHP 進(jìn)行手機(jī) APP 開(kāi)發(fā)(API 接口開(kāi)發(fā))
- 傻瓜化配置PHP環(huán)境——Appserv
- php微信支付之APP支付方法
- 基于AppServ,XAMPP,WAMP配置php.ini去掉警告信息(NOTICE)的方法詳解
- 用php實(shí)現(xiàn)像JSP,ASP里Application那樣的全局變量
- PHP中auto_prepend_file與auto_append_file用法實(shí)例分析
- php和asp利用Shell.Application來(lái)執(zhí)行程序的代碼
- PHP編寫(xiě)簡(jiǎn)單的App接口
相關(guān)文章
thinkphp3.2框架中where條件查詢(xún)用法總結(jié)
這篇文章主要介紹了thinkphp3.2框架中where條件查詢(xún)用法,總結(jié)分析了thinkphp3.2中where條件查詢(xún)中常用的各種查詢(xún)條件、以及各種復(fù)合查詢(xún)實(shí)現(xiàn)方法,需要的朋友可以參考下2019-08-08使用php方法curl抓取AJAX異步內(nèi)容思路分析及代碼分享
怎樣抓取AJAX網(wǎng)站的內(nèi)容?這是一個(gè)熱門(mén)的問(wèn)題,也是一個(gè)棘手的問(wèn)題。但實(shí)際上呢,抓取ajax異步內(nèi)容的頁(yè)面和抓普通的頁(yè)面區(qū)別不大。ajax只不過(guò)是做了一次異步的http請(qǐng)求,只要使用firebug類(lèi)似的工具,找到請(qǐng)求的后端服務(wù)url和傳值的參數(shù),然后對(duì)該url傳遞參數(shù)進(jìn)行抓取即可2014-08-08Laravel框架實(shí)現(xiàn)定時(shí)發(fā)布任務(wù)的方法
這篇文章主要介紹了Laravel框架實(shí)現(xiàn)定時(shí)發(fā)布任務(wù)的方法,結(jié)合實(shí)例形式分析了使用Linux的cronTab功能實(shí)現(xiàn)定時(shí)發(fā)布任務(wù)的相關(guān)設(shè)置與操作技巧,需要的朋友可以參考下2018-08-08php注冊(cè)審核重點(diǎn)解析(數(shù)據(jù)訪問(wèn))
這篇文章主要為大家解析了php注冊(cè)審核重點(diǎn),數(shù)據(jù)進(jìn)行訪問(wèn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05laravel配置Redis多個(gè)庫(kù)的實(shí)現(xiàn)方法
這篇文章主要介紹了laravel配置Redis多個(gè)庫(kù)的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04Codeigniter通過(guò)SimpleXML將xml轉(zhuǎn)換成對(duì)象的方法
這篇文章主要介紹了Codeigniter通過(guò)SimpleXML將xml轉(zhuǎn)換成對(duì)象的方法,涉及Codeigniter操作XML文件的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-03-03PHP迭代器的內(nèi)部執(zhí)行過(guò)程詳解
下面我們來(lái)了解如何實(shí)現(xiàn)一個(gè)自定義的迭代器,然后再開(kāi)始慢慢理解迭代器的內(nèi)部工作原理。先來(lái)看一個(gè)官方的例子2013-11-11PHP上傳Excel文件導(dǎo)入數(shù)據(jù)到MySQL數(shù)據(jù)庫(kù)示例
這篇文章主要介紹了PHP上傳Excel文件導(dǎo)入數(shù)據(jù)到MySQL數(shù)據(jù)庫(kù)示例,可以將Excel的數(shù)據(jù)寫(xiě)入到MySQL數(shù)據(jù)庫(kù)中,感興趣的同學(xué)可以了解一下。2016-10-10