h5實(shí)現(xiàn)混合app開發(fā)(app h5框架)
今天給各位分享h5實(shí)現(xiàn)混合app開發(fā)的知識(shí),其中也會(huì)對(duì)app h5框架進(jìn)行解釋,如果能碰巧解決你現(xiàn)在面臨的問題,別忘了關(guān)注本站,現(xiàn)在開始吧!
APP原生開發(fā)和H5開發(fā)以及APP混合開發(fā)三者有什么區(qū)別?
這個(gè)如果詳細(xì)說(shuō),那就是很復(fù)雜了,但是可以以口語(yǔ)方式簡(jiǎn)單的說(shuō)
APP原生開發(fā):就是安卓版,IOS版,和后臺(tái),最起碼為3個(gè)人制作,3個(gè)不同的人掌握不同的技術(shù),也就是說(shuō),這個(gè)成本最高。
H5開發(fā):就是HTML5的網(wǎng)頁(yè)制作,也可以理解為網(wǎng)頁(yè)制作,然后加個(gè)殼打包,這個(gè)殼和打包對(duì)于外行也是比較模糊的概念,你只需要理解為最簡(jiǎn)單的html5制作就行,這個(gè)沒有什么技術(shù)含量,也最便宜。一個(gè)人可以搞定。
APP混合開發(fā):這個(gè)是介于原生開發(fā)和H5開發(fā)之間的,難度也是居中,相對(duì)來(lái)說(shuō),技術(shù)上由2個(gè)人完成,一個(gè)前臺(tái)一個(gè)后臺(tái),APP上有H5的制作內(nèi)容,也有原生開發(fā)的制作內(nèi)容,所以叫混合開發(fā),或者說(shuō)也有WEB開發(fā)的痕跡,這個(gè)是不能一句話說(shuō)清楚的。
從價(jià)格來(lái)說(shuō)這樣排列:最貴原生開發(fā),居中混合開發(fā),最便宜H5開發(fā)。
H5+APP混合開發(fā)上傳圖片
mui.init()
??var page=null;
? page={
? ? ? imgUp:function(){
? ? ? ? ? plus.nativeUI.actionSheet({cancel:"取消",buttons:[
? ? ? ? ? ? ? {title:"拍照"},
? ? ? ? ? ? ? {title:"從相冊(cè)中選擇"}
? ? ? ? ? ]}, function(e){//1 是拍照? 2 從相冊(cè)中選擇
? ? ? ? ? ? ? switch(e.index){
? ? ? ? ? ? ? ? ? case 1:appendByCamera();break;
? ? ? ? ? ? ? ? ? case 2:appendByGallery();break;
? ? ? ? ? ? ? }
? ? ? ? ? });
? ? ? }
function appendByCamera(){
// 拍照上傳圖片,調(diào)用攝像頭
? ? ? plus.camera.getCamera().captureImage(function(e){
? ? ? ? ? plus.io.resolveLocalFileSystemURL(e, function(entry) {
? ? ? ? // 將路徑轉(zhuǎn)為網(wǎng)絡(luò)路徑進(jìn)行圖片預(yù)覽
? ? ? ? ? var path = entry.toRemoteURL();
? ? ? ? ? document.getElementById('preview').src = path
? ? ? ? ? $('.previewimage')[0].style.display = 'block'
? ? ? ? ? ? $('.imageBox')[0].style.display = 'none'
? ? ? ? ? }, function(e) {
? ? ? ? ? ? ? mui.toast("讀取拍照文件錯(cuò)誤:" + e.message);
? ? ? ? ? });
? ? ? });
? }
// 從相冊(cè)選取文件
function appendByGallery(){
? ? ? ? ? plus.gallery.pick(function(e){
? ? ? ? ? ? ?// 將本地路徑轉(zhuǎn)為相對(duì)路徑,然后再將相對(duì)路徑轉(zhuǎn)為網(wǎng)絡(luò)路徑,進(jìn)行圖片的預(yù)覽
? ? ? ? ? ? plus.io.resolveLocalFileSystemURL(plus.io.convertLocalFileSystemURL(e), function(entry) {
? ? ? ? ? ? ? var path = entry.toRemoteURL();
? ? ? ? ? ? ? document.getElementById('preview').src = path
? ? ? ? ? ? ? $('.previewimage')[0].style.display = 'block'
? ? ? ? ? ? ? ? $('.imageBox')[0].style.display = 'none'
? ? ? ? ? ? ? }, function(e) {
? ? ? ? ? ? ? ? ? mui.toast("讀取拍照文件錯(cuò)誤:" + e.message);
? ? ? ? ? ? ? });
? ? ? });
? }
var?ImgList = []
function getfiles() {
? ? ? ? var imageurl = document.getElementById("preview").src
? ? ? ? var p = new Promise(function (resolve, reject) {
? ? ? ? ? ? // 將網(wǎng)絡(luò)路徑轉(zhuǎn)為本地的路徑,再將本地的路徑轉(zhuǎn)為file?
? ? ? ? ? ? plus.io.resolveLocalFileSystemURL( plus.io.convertLocalFileSystemURL(imageurl), function( entry ) {
? ? ? ? ? ? // 可通過entry對(duì)象操作文件
? ? ? ? ? ? entry.file( function(file){
? ? ? ? ? ? ? ? ImgList.push(file)? ?
? ? ? ? ? ? ? ? resolve(ImgList[0])
? ? ? ? ? ? });
? ? ? ? ? ? }, function ( e ) {
? ? ? ? ? ? ? ? alert( "Resolve file URL failed: " + e.message );
? ? ? ? ? ? })
? ? ? ? })
? ? ? return p
? ? }
// 調(diào)用轉(zhuǎn)換路徑的函數(shù)
? ? ? ? getfiles()
? ? // 等待轉(zhuǎn)化完成進(jìn)行上傳
? ? ? ? .then(res ={
? ? ? ? ? ? //? 上傳的地址
? ? ? ? ?//?plus.uploader.createUpload('url',{},function(){}) ?
? ? ? // 只能是http://或者是https://開頭的地址,{}上傳的方式,function(){} 回調(diào)函數(shù)
? ? ? ? ? ? var task = plus.uploader.createUpload( "url",
? ? ? ? ? ? ? ? { method:"POST"},
? ? ? ? ? ? ? ? function ( t, status ) {
? ? ? ? ? ? ? ? ? ? // 上傳完成
? ? ? ? ? ? ? ? ? ? if ( status == 200 ) {
? ? ? ? ? ? ? ? ? // 圖片上傳完成,可進(jìn)行下一步的操作
? ? ? ? ? ? ? ? ? ? ? ? alert( "Upload success: " + t.url );
? ? ? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? ? ? alert( "Upload failed: " + status );
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? );
? ? ? ? ? ? // 要上傳的文件file,也可以是本地路徑的
? ? ? ? ? ? task.addFile( res, {key:"img"} ); ? //類似fromData.append('img',document.getElementById('submitImage').files[0])
? ? ? ? ? ? // 加上文件上傳的其他參數(shù)
? ? ? ? ? ? task.addData( "task_id", taskID );
? ? ? ? ? ? // 設(shè)置請(qǐng)求頭,若服務(wù)器需要校驗(yàn)請(qǐng)求頭
? ? ? ? ? ? task.setRequestHeader("Authorization",localStorage.getItem('mytoken'))
? ? ? ? ? ? //task.addEventListener( "statechanged", onStateChanged, false );
? ? ? ? ? ? // 開始上傳
? ? ? ? ? ? task.start()
? ? ? ? })
H5 手機(jī) App 開發(fā)入門:技術(shù)篇
手機(jī) App 的技術(shù)??梢苑殖扇?/p>
原生技術(shù)棧指的是,只能用于特定手機(jī)平臺(tái)的開發(fā)技術(shù)。比如,安卓平臺(tái)的 Java 技術(shù)棧,iOS 平臺(tái)的 Object-C 技術(shù)棧或 Swift 技術(shù)棧。
混合技術(shù)棧指的是開發(fā)混合 App 的技術(shù),也就是把 Web 網(wǎng)頁(yè)放到特定的容器中,然后再打包成各個(gè)平臺(tái)的原生 App。所以,混合技術(shù)棧其實(shí)是 Web 技術(shù)棧 + 容器技術(shù)棧,典型代表是 PhoneGap、Cordova、Ionic 等框架。
跨平臺(tái)技術(shù)棧指的是使用一種技術(shù),同時(shí)支持多個(gè)手機(jī)平臺(tái)。它與混合技術(shù)棧的區(qū)別是,不使用 Web 技術(shù),即它的頁(yè)面不是 HTML5 頁(yè)面,而是使用自己的語(yǔ)法寫的 UI 層,然后編譯成各平臺(tái)的原生 App。
這個(gè)技術(shù)棧就是純粹的容器技術(shù)棧,React Native、Xamarin、Flutter 都屬于這一類。學(xué)習(xí)時(shí),除了學(xué)習(xí)容器的 API Bridge,還要學(xué)習(xí)容器提供的 UI 層,即怎么寫頁(yè)面
總結(jié):H5 開發(fā)主要用在混合技術(shù)棧。但是,跨平臺(tái)技術(shù)棧的某些容器也會(huì)用到(比如 React Native),因?yàn)樗鼈兊?UI 層借鑒了 Web 模型。
另外,混合技術(shù)棧和跨平臺(tái)技術(shù)棧的基礎(chǔ),都是原生技術(shù)棧,因?yàn)樽罱K都要編譯成原生App。所以,不管使用哪一種技術(shù)棧,多多少少要了解一些各平臺(tái)的原生技術(shù)。
不管什么技術(shù),最終在 App 里面顯示網(wǎng)頁(yè),一定需要一個(gè)網(wǎng)頁(yè)引擎,這樣才能解析網(wǎng)頁(yè)。通常情況下,App 內(nèi)部會(huì)使用 WebView 控件作為網(wǎng)頁(yè)引擎。這是系統(tǒng)自帶的控件,專門用來(lái)顯示網(wǎng)頁(yè)。應(yīng)用程序的界面,只要放上 WebView,就好像內(nèi)嵌了瀏覽器窗口,可以顯示網(wǎng)頁(yè)。不同的 App 技術(shù)棧要顯示網(wǎng)頁(yè),區(qū)別僅僅在于怎么處理 WebView 這個(gè)原生控件。
不同系統(tǒng)的 WebView 控件名稱不一樣,安卓系統(tǒng)就叫 WebView,iOS 系統(tǒng)有較老的 UIWebView,也有較新的 WKWebView,作用都是一樣的,差異在于功能的強(qiáng)弱。
關(guān)于h5實(shí)現(xiàn)混合app開發(fā)和app h5框架的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。