作为程序员一定要保持良好的睡眠,才能好编程

手机客户端扫码下载遇到问题及代码

发布时间:2018-07-25


说明:

扫码下载,在苹果系统中、微信、浏览器下载,都会跳转到对应的地址。


如果是安卓,那么就要区分一下喽。


安卓 浏览器 直接下载 apk 文件是没有问题的,可以直接下载。


那么在微信端如何进行下载呢? 


如何确定是不是微信呢?  $_SERVER['HTTP_USER_AGENT']  判断里面有没有 MicroMessenger


MicroMessenger

如果包含,就是微信。



那么解决微信扫码下载肿么办?


解决方案有很多种,我选择了一种通用的方式:



如果是安卓,就先打开一个页面: 然后通过 右侧 的三个点 ,点击 在浏览器中打开。


下面图片自行做一张吧,呵呵,这里就不提供喽。


wx.png


然后重新访问到这个下载页后,会走到 android() 方法,

那么就能在浏览器直接下载apk文件了。




先上代码

<?php

defined('BASEPATH') OR exit('No allow direct access script.');

class Download extends qb_Controller {

  /**
   * 根据扫码进入下载
   */
  public function index() {
    errorLog('当前平台platform:' . $this->getPlatform());
    switch ($this->getPlatform()) {
      case 'ios':
        $this->ios();
        break;
      case 'android':
        $this->android();
        break;
      case 'android_wx':
        $this->android_wx();
        break;
      default:
        //显示页面
        goRedirect(302, 'home/index');
    }
  }
  private function android_wx() {
    $result = [];
    $this->smarty->view('download', $result);
  }

  /**
   * 安卓下载
   */
  private function android() {
    $result = $this->Download_model->downfile('android');
    if ($result['result']['appPackageUrl'])
      redirect($result['result']['appPackageUrl'], 'get', 302);
    else {
      $result = ['type' => 'android', 'message' => '下载文件未找到'];
      $this->smarty->view('download', $result);
    }
  }

  private function ios() {
	//如果已经存在,就跳转到这里  
	//redirect('https://itunes.apple.com/cn/app/id1322819356');
	
    $result = ['type' => 'ios', 'message' => '您好iOS客户端暂未上线,敬请期待。'];
    $this->smarty->view('download', $result);
  }

  private function getPlatform() {
    $this->load->library("User_agent");
    $platform = strtolower($this->agent->platform());
    $isWeixin = strpos(strtolower($this->agent->agent_string()), 'micromessenger') !== FALSE;
    if ($platform === 'android' && $isWeixin) {
      $platform = 'android_wx';
    }
    return $platform;
  }


}




 

Download_model.php

<?php

 
class Download_model extends Base_Model {

  const HEADER = [
    'imei' => 'xxxxxx', //选填
    'deviceToken' => 'xxxxxx',
    'version' => STATIC_DATE,
    'platform' => 'czccb',
    'content-type' => 'application/json'
  ];

  private $source = '';

  protected function _init() {
    $this->_host = APP_DOWNLOAD_URL;
  }

  /**
   * 请求远程地址
   * @link   
  public function downfile($platform) {
    $param = [];
    $this->source = $platform;
    $result = $this->fetchPost('/api/pub/v3/fp/getProductVersionByAppType', $param);
    return $result;
  }

  protected function fetchBefore($url, $data) {
    $header = [
      'source' => $this->source
    ];

    $this->setRequestHeader(self::HEADER + $header);
    return jsonencode(['content' => $data]);
  }

  protected function fetchAfter($url, $data) {
    if (!empty($data['result']) && is_string($data['result'])) {
      $data['result'] = jsondecode($data['result']);
    } else {
      show_error('Download请求错误');
    }
    return $data;
  }


  protected function fetchFinish($data) {
    if (!is_array($data)) {
      showError();
    }
    switch ($data['status']) {
      case '00000000' : //成功
        break;
      default:
        showError($data['message'] ?: API_FAILURE_MSG);
    }
    return $data;
  }


}



JS判断是不是微信

if(ua.match(/MicroMessenger/i) == 'micromessenger'){ 
	return true; 
}else{ 
	return false; 
}








或者上传到微信云

上传到腾讯微云。这个方法也是一个变相改变路径的过程,将我们的程序上传到腾讯的微云上