天天看點

混合開發基礎

1.混合開發的解決方案

  • 方案一:dcloud(hbuilder)國内一款通用的架構,性能比phonegap高
  • 方案二:phonegap(Adobe公司所出的将phonegap捐獻給了Apache),cordova最經典的一款混合開發的架構
  • 方案三:APICloud 編寫都是在本地 打包在雲端
  • 方案四:react native 國外比較火
  • 方案五:WEX5
  • 方案六:微信裡面做混合開發

2.混合開發原理

a:什麼是混合開發?

使用寫web方式去寫原生

b:有哪些優勢?

  1. 開發周期短(寫一次就可以運作在各個手機版本上面)
  2. 跨平台(寫一次的内容 可以同時跑在安卓和ios裝置上面)
  3. lib豐富性(資源豐富,比如各種js庫)

c:有哪些缺點?

  1. 打包後資源 偏大
  2. 性能低
  3. css+js相容,以及提供更好的api,相容性差距不大

d:怎麼做到的(原理)?

  • 為什麼可以使用html+css進行建構頁面
    原因是原生應用給我們目前開發中提供了一個webview(原生提供的浏覽器), 我們可以再webview上面寫css,html,來建構頁面。
  • 為什麼可以使用js方式就可以調用原生的api

    js寫在webview裡面,而java程式在應用啟動的時候,将一些原生的api定制成了js可以調用的api,注入到webview裡面去,就可以在webview中調用原生。

将注入到webview裡面的js叫做 橋接js jsBridge .

  • 為什麼寫一次就可以在不同的平台上面進行運作?
    通過js方式調用原生,通過橋接的js
  • 橋接js作用
    1. 将一些原生的api注入到目前頁面裡面去,可以在目前頁面調用(js形式注入進來的)
    2. 在html頁面裡面通過js調用原生

隻要原生注入到webview裡面的橋接js規範和接口都是統一的,直接調用就可以實作一次編寫多次使用。

歸納:==安卓和ios同時對上提供了統一标準的接口,可以直接在webview中通過橋接js的方式進行調用==

3.基于dcloud實作的一個混合開發的案例

文檔位址:www.dcloud.io

document.addEventListener('plusready', function(){
//console.log("所有plus api都應該在此事件發生後調用,否則會出現plus is undefined。"

    });
           
  • 注意點:
    1. 确定使用dcloud進行開發的時候,頁面中一定要存在一個事件,plusready,

      plusready實際上是原生将橋接js注入到頁面中的容器,進行任何方法調用的時候都在plusready之後。

    2. 所有api方法全部都托管在了一個plus對象中。

      使用文法plus.子產品名稱.具體方法(參數,callback)

第一個案例:在真機下,實作拍照功能

var btn = document.getElementsByTagName('button');
    btn[].addEventListener('touchend',function(){
        //調用原生API
        //擷取camera子產品  plus.camera;  擷取攝像頭 getCamera
        var _camera = plus.camera.getCamera();
        //captureImage拍照方法  參數:成功回調函數,失敗回調函數,配置{config}
        _camera.captureImage(function(path){
            alert('拍照成功,傳回的路徑是'+path);
            // 參數path是相對路徑
            //plus.io.convertLocalFileSystemURL(path);将目前路徑轉換成本地路徑
            var _io = plus.io;
            var _path = _io.convertLocalFileSystemURL(path);
            var img = document.createElement('img');
            img.style.display='block';
            img.style.width = '18rem';
            img.style.height = '10rem';
            img.src=_path;
            document.body.appendChild(img)
        },function(){},{})
    })
           

拍攝小視訊:

//錄像
    btn[].addEventListener('touchend',function(){
        //擷取攝像頭
        var _camera = plus.camera.getCamera();
        //startVideoCapture:調用攝像頭進行攝像操作
        _camera.startVideoCapture(function(path){
            alert('拍攝成功,視訊路徑為:'+path);
            //将目前路徑轉換成本地路徑
            var _path = plus.io.convertLocalFileSystemURL(path);
            var video = document.createElement('video');
            //controls 屬性規定浏覽器應該為視訊提供播放控件。
            video.controls="controls";
            video.autoplay="autoplay";
            video.style.display='block';
            video.style.width = '18rem';
            video.style.height = '10rem';
            video.src = _path;
            document.body.appendChild(video);
        },function(){},{})
    });
           

app如何進行打包 — 打包成apk檔案

- 登入hbulid - manifest.json—點選雲端擷取appid—右鍵項目—發行—發行為原生安裝包—打包

打開相冊

- Gallery子產品管理系統相冊,支援從相冊中選擇圖檔或視訊檔案、儲存圖檔或視訊檔案到相冊等功能。通過plus.gallery擷取相冊管理對象。

//打開相冊選擇一張照片
    btn[].addEventListener('touchend',function(){
        //plus.gallery擷取相冊管理對象
        var _gallery = plus.gallery;
        //pick方法:從系統相冊選擇檔案(圖檔或視訊)
        _gallery.pick(function(path){
            alert('選擇圖檔的路徑為'+path);
        var _path = plus.io.convertLocalFileSystemURL(path);
        var img = document.createElement('img');
            img.style.display='block';
            img.style.width = '18rem';
            img.style.height = '10rem';
            img.src=_path;
        document.body.appendChild(img);
        },function(){},{})
    });
           

打開多個圖檔

//從相冊打開多張照片
    btn[].addEventListener('touchend',function(){
        var _gallery = plus.gallery;
        var img='';
        _gallery.pick(
            function(path){
                alert('圖檔的路徑'+JSON.stringify(path));
                var _files= path.files;
                for(var i in _files){
                    img +='<img src="'+_files[i]+'"/>'
                }
                document.getElementById('img_cxt').innerHTML = img;
            },
            function(){},
            {   
                multiple:true,
                maximum:,
                system:false
            }
        )
    })
           

4.熟練dcloud中常用的api(混合開發的api)

  1. 打開相冊plus.gallery.pick進行打開

    選取多個圖檔{multiple:true,maximum:9,system:false}

  2. device子產品裡面 震動

    3.webview index.html 相當于一個webview

    當從一個頁面切換到另一個頁面的時候,切換的時候伴随着一些動畫

    open close currentWebView()//擷取目前webview的id

    4.nativeUI alert(”);

    就是原生控件