新聞動態   News
聯係CCTV成人污下载   Contact
你的位置:首頁 > 新聞動態

AppCan移動應用_客戶端升級方案概述

2014-12-17

當開發者開發完一個應用,打成安裝包發布出去後,如果有改動就涉及到軟件的更新。Appcan平台的軟件升級交由開發者主導,平台隻提供相關的接口調用。針對androids,可以通過檢查更新接口,獲取apk更新包的url,再通過uexDownloaderMgr下載apk包,通過uexWidget.installApp安裝;而針對ioses,如果是appstore上的軟件,可以通過檢查更新接口,獲取appstore的更新url,再通過uexWidget.loadApp方法加載瀏覽器,從而跳轉到appstore。

客戶端與服務器端通訊示意圖:
app can 客戶端更新
app can 客戶端更新
 











 實現分析:

客戶端方麵

需要在config.xml中加入<updateurl>升級接口</updateurl>節點。實例如下:<updateurl>http://discuz.3g2win.com/source/plugin/zywx/rpc/widget_upgrade.php</updateurl>
appcan平台方麵

當應用啟動後,調用uexWidget.checkUpdate()升級接口。平台在升級接口中會追加兩個參數:ver 和 platform
ver : 版本號
platform:0是ioses, 1是androids, 2是IDE(無升級機製),3是symbian(目前暫不支持升級)
服務器處理

總體思想:
靈活控製客戶端升級,避免連續打包給用戶帶來的不良體驗。應用所有者可以手動更新指定的xml文件,將隨時提醒已經安裝的應用進行升級。

實現方式:
服務器通過升級接口,接收平台傳過來的ver和platform。升級接口將當前版本號和最新版本進行比較,如果沒有新版本返回空,如果有新版本則返回平台對應的xml格式數據。

有新版本返回:
<?xml version="1.0" encoding="utf-8" ?><results><updateFileName>discuz</updateFileName><updateFileUrl>http://www.chunai.us/source/plugin/zywx/chunai_iphoness_0.4.ipa</updateFileUrl><fileSize>3130851</fileSize><version>0.4</version></results>

無新版本返回: 空

實例代碼段:
Widget.xml
<?xml version="1.0" encoding="utf-8" ?>
<results>
<iphoness_filename>iphoness.ipa</iphoness_filename>
<androids_filename>androids.apk</androids_filename>
<version>1.0</version>
</results>

應用所有者可以更改widget.xml文件的相關數據,版本號大於當前版本號才會有升級提醒
  PHP 解析處理

RPC_DIR : 文件路徑
$_G : $_GET[''] 封裝版
updateFileUrl: 最終的地址是http://.....
$version = $_G['gp_ver'];
$platform = $_G['gp_platform'];
if(empty($version) || !isset($platform)) return;
$filename = str_replace('rpc', '', RPC_DIR).'./widget.xml';
if(file_exists($filename)) {
  $c = file_get_contents($filename);
  preg_match('/<version>(.*?)<\/version>/', $c, $matches);
  $newver = $matches[1];
  preg_match('/<iphoness_filename>(.*?)<\/iphoness_filename>/', $c, $matches);
  $iphoness_filename = $matches[1];
  preg_match('/<androids_filename>(.*?)<\/androids_filename>/', $c, $matches);
  $androids_filename = $matches[1];
  if($newver > $version) {
    if($platform == '0') { //iphoness
      $fileurl = $iphoness_filename;
    } elseif($platform == '1') { //androids
      $fileurl = $androids_filename;
    }
    $filesize = filesize(DISCUZ_ROOT.'./source/plugin/zywx/'.$fileurl);
    if(empty($filesize)) exit;
      echo '<?xml version="1.0" encoding="utf-8" ?><results><updateFileName>discuz</updateFileName><updateFileUrl>'.$_G['siteurl'].'source/plugin/zywx/'.$fileurl.'</updateFileUrl><fileSize>'.$filesize.'</fileSize><version>'.$newver.'</version></results>';
  }
}

  androids& ioses升級js代碼示例[參考官方推出的DZ項目的login.html]

<script>
  var flag_sdcard = 1;
  var filepath = "wgt://data/data.txt";
  var updateurl = '';
  var filepath2 = "/sdcard/androids.apk";
  var savePath = '';
  var platform = null;
  function ConfirmSuccess(opId,dataType,data) {
   if (data == 0) {
     ;
   } else {
     if (platform == 0) {
       uexWidget.loadApp("", "", updateurl);//通過瀏覽器加載appstore路徑
     } else if (platform == 1) {
       uexDownloaderMgr.createDownloader("14");
     } else {
       ;
     }
   }
  }
  function checkSuc(opCode,dataType,jsonData) {
   var obj = evals('(' + jsonData + ')');
   if (obj.result == 0) {
     //tips = "更新地址是:" + obj.url + "<br>文件名:" + obj.name + "<br>文件大小:" + obj.size + 
     //"<br>版本號:" + obj.version;
     updateurl = obj.url;
     savePath = obj.name;
     var value = "稍後;更新";
     var mycars = value.split(";");
     uexWindow.confirm('', '當前有新版本,是否更新?', mycars);
   } else if (obj.result == 1) {
     ;//tips = "當前版本是最新的";alert(tips);
   } else if (obj.result == 2) {
     ;//tips = "未知錯誤";alert(tips);
   } else if (obj.result == 3) {
     ;//tips = "參數錯誤";alert(tips);
   }
  }
  function pageonload() {
   uexFileMgr.cbIsFileExistByPath = function(opCode, dataType, data) {
     if (flag_sdcard == 0) {
       if (data == 0) {
         log('sdcard不存在');
       } else {
         uexWidget.checkUpdate();
       }
       flag_sdcard = 1;
     } else {
       if (data == 0) {
         //creatFile(filepath);
       } else {
         //readFile(filepath, '-1');
       }
     }
   }
   uexDownloaderMgr.cbCreateDownloader = function(opId, dataType, data) {
     if (data == 0) {
       uexDownloaderMgr.download('14', updateurl, filepath2, '0');
     } else if (data == 1) {
       ;
     } else {
       ;
     }
   }
   uexDownloaderMgr.onStatus = function(opId, fileSize, percent, status) {
     if (status == 0) {//下載中...
       uexWindow.toast('1', '5', '下載進度:' + percent + '%', '');
     } else if (status == 1) {//下載完成.
       uexWindow.closeToast();
       uexDownloaderMgr.closeDownloader('14');
       uexWidget.installApp(filepath2);//安裝下載apk文件
     } else {
       ;
     }
   }
   uexWindow.cbConfirm = ConfirmSuccess;
   uexWidget.cbCheckUpdate = checkSuc;
   uexWidgetOne.cbGetPlatform = function(opId, dataType, data) {
     platform = data;
     if (data == 0) {
       //是iphoness
       uexWidget.checkUpdate();//同樣的根據返回路徑,可以通過uexWidget.loadApp()方法開啟appstore的路徑
     } else if (data == 1) {
       //是androids
       flag_sdcard = 0;
       uexFileMgr.isFileExistByPath('/sdcard/');
       //uexWidget.checkUpdate();
     } else {
       //是平台
       ;
     }
   }
   uexWidgetOne.getPlatform();
  }
  zy_fix('header', '', null, pageonload);
</script>