成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

混合應(yīng)用中的javascript實踐

Flink_China / 3470人閱讀

摘要:混合應(yīng)用在幾年前便進(jìn)入大眾視野,近來更是越發(fā)風(fēng)生水起,深受人民群眾的喜愛?;旌戏绞饺缤钭钟袔追N寫法一般,構(gòu)建混合應(yīng)用也有不同的方式。機型則會比較悲劇,使用方案或許是個正確的選擇。所以在開發(fā)中一定要做好可用性檢測,減少出現(xiàn)的幾率。

混合應(yīng)用(hybird app) 在幾年前便進(jìn)入大眾視野,近來更是越發(fā)風(fēng)生水起,深受人民群眾的喜愛。

概念 什么是混合應(yīng)用

混合應(yīng)用(hybird app) 顧名思義,便是將web app與native app混合在一起,既享受html快速開發(fā)、快速版本迭代帶來的便利,也能使用原生app調(diào)用系統(tǒng)接口和第三方SDK的強大擴展能力。

混合方式

如同茴字有幾種寫法一般,構(gòu)建混合應(yīng)用也有不同的方式。其中一種是主要使用靜態(tài)html,用 phonegapcordova 加殼的方式打包成app。另一種則是小部分webview直接引入服務(wù)端渲染的html,其他功能都是原生app開發(fā)。
其中前一種方式最為出名的解決方案便是使用 angular.js + cordova 的 ionic,而使用后一種方式的app則數(shù)不勝數(shù)。
但是無論使用哪一種方式,都面臨一個問題,html和app的交互。html自己不會動起來,本文將淺談javascript如何交互app和html。

交互 方法注入

常見的app和html交互有 使用url互相調(diào)用方法 兩種方式。
使用url 這種方式比較簡單,通過 location.href = "url" ,即可將方法和參數(shù)傳遞給app,但是無法傳遞復(fù)雜的數(shù)據(jù)。
互相調(diào)用方法 這種方式則較為復(fù)雜,除了需要app端寫好調(diào)用的方法注入到 window 對象之外,還需要JavaScript暴露方法給app使用。以常見的評論交互為例:

// 點擊“發(fā)表評論”,js需要調(diào)用app的評論框
$(".js-comment").click(function(){
  window.appMethod.comment();
});

// app端在用戶點擊“發(fā)送”按鈕時,再調(diào)用javascript的插入評論方法(我不會app開發(fā),以下是偽代碼)
function comment(){
  TEXTAREA.OPEN();
}
SUBMIT_BUTTON.CLICK(function(){
  NSString * result = [self.webView stringByEvaluatingJavaScriptFromString:@"window.jsMethod.comment()"];
})

其中 window.appMethod 這個方法,是一個從 iOS 和 android 方法中提取而來的方法,根據(jù)手機系統(tǒng)不同,使用不同策略,例如:

var window.appMethod = null;

var androidMethod = {
  comment: function(){
    window.android.comment();
  }
};

var iOSMethod = {
  comment: function(){
    location.href = "ios://comment?"
  }
};


window.appMethod = iOS_DEVICE ? iOSMethod : androidMethod;

相比方法的注入點,策略處理,方法的調(diào)用時機更為重要。在js中調(diào)用一個不存在方法,會發(fā)生錯誤從而導(dǎo)致代碼無法繼續(xù)向下執(zhí)行。
比如進(jìn)入頁面時,app需要告訴html一些登錄信息,以初始化點贊,收藏等組件。如果由app直接調(diào)用js方法去通知,那么很可能頁面還沒加載完,而發(fā)生上面提到的錯誤。
所以好的時機是讓js主動去向app發(fā)起請求,示例:

// 不和諧:app直接通知js更新用戶登錄狀態(tài),可能會發(fā)生錯誤
eval("window.jsMethod.setUser();")


// 和諧:js主動去向app發(fā)起請求
$(function(){
  window.appMethod.getUser();
})

// app端在接收到getUser方法后,調(diào)用js方法(我不會app開發(fā),以下是偽代碼)
function getUser(){
  // 獲取user狀態(tài),然后執(zhí)行
  NSString * result = [self.webView stringByEvaluatingJavaScriptFromString:@"window.jsMethod.setUser()"];
}
參數(shù)傳遞

以上的示例中的方法并沒有進(jìn)行參數(shù)傳遞,是為了留到這里。
相比JavaScript,在android和iOS方法中傳遞參數(shù)顯得極為嚴(yán)格,除了要指定參數(shù)個數(shù),還要指定參數(shù)類型。
雖然可以通過數(shù)組的方式進(jìn)行不定個數(shù)參數(shù)的傳遞,但是指定參數(shù)類型還是挺煩人的。所以建議始終使用 String 類型作為參數(shù)進(jìn)行傳遞,復(fù)雜的json格式參數(shù)使用 JSON.stringify。使用url傳遞則需要對參數(shù)進(jìn)行 encode 編碼。
以上面的發(fā)表評論為例:

# 本段代碼使用了jquery

// js給app傳參
var androidMethod = {
  comment: function(params){
    window.android.comment( JSON.stringify(params) );
  }
};

var iOSMethod = {
  comment: function(params){
    location.href = "ios://comment?"+$.param(params)
  }
};

... ... 

$(".js-comment").click(function(){
  var params = {
    "user_id": 30,
    "article_id": 958,
    "article_type": "news"
  };
  window.appMethod.comment(params);
});


// app給js傳參
SUBMIT_BUTTON.CLICK(function(){
   var params = {
    "comment_id": 5484,
    "comment_content": "我不會寫app,姑且用js寫偽代碼"
  };
  NSString * result = [self.webView stringByEvaluatingJavaScriptFromString:@"window.jsMethod.comment( JSON.stringify(params) )"];
})
方法監(jiān)聽

這里的方法監(jiān)聽指的是app對js方法的單向監(jiān)聽。
因為需要app監(jiān)聽的js方法,都是顯示的調(diào)用了app方法,或是跳轉(zhuǎn)到了一個url。調(diào)用app的方法自不待言,url的監(jiān)聽卻有多種。
一種是a鏈接的 http GET 請求的監(jiān)聽,多見于 下一篇文章 , 相關(guān)文章 等跳轉(zhuǎn)頁面的方法。一般來說不用帶參數(shù)。還有一種是自定義的 schema 監(jiān)聽,使用這種方式一般是不帶或帶較少的參數(shù),比如 myiOS://mymethod?。

資源加載

把資源加載放到交互里面,我也不知道合不合適。對于 第一種混合方式 來說,可以把更多的靜態(tài)資源放到本地,然后通過app接口加載。對于第二種,更多的還是從服務(wù)端渲染并加載資源。
對于一些交互類的數(shù)據(jù),而非資源,既可以選擇存放在瀏覽器的localStorge中,也可以選擇存放于app本地文件,這取決于哪一方進(jìn)行操作運算了。

調(diào)試

html的移動端調(diào)試時很困難的,嵌入app的html調(diào)試更是難上加難。因為js和app的方法相互調(diào)用,任何一方出錯,都會導(dǎo)致程序不按套路運行。
除了仔細(xì)的約定兩端的方法和檢查代碼的錯誤外,還需要一個強力的工具。在這里推薦使用 vConsole ,可以比較直觀的定位到錯誤。

vConsole 截圖

vConsole

其他 兼容性

html在app中的兼容性取決于app內(nèi)嵌瀏覽器內(nèi)核。iOS系統(tǒng)默認(rèn)的瀏覽器是safari,而andriod系統(tǒng)默認(rèn)的瀏覽器則五花八門。

如果選擇系統(tǒng)默認(rèn)瀏覽器作為內(nèi)嵌瀏覽器的話,ios一般兼容性較好,能取得和PC端一致的效果。android機型則會比較悲劇,使用 crosswalk方案 或許是個正確的選擇。

特性啟用

在內(nèi)嵌瀏覽器中,html5的某些特性默認(rèn)是關(guān)閉的,比如 localStorge , 需要app端手動去開啟。所以在開發(fā)中一定要做好可用性檢測,減少出現(xiàn)bug的幾率。

局部視圖

當(dāng)html作為webview的局部視圖被加載時,由于app雖然可以獲取到頁面加載后的高度,但是無法獲取動態(tài)改變后的高度,使得局部滾動失效。
所以在作為局部視圖加載時,如果需要頁面高度會根據(jù)比如評論,動畫效果而發(fā)生改變的話,需要及時通知app更新webview高度。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/79789.html

相關(guān)文章

  • 【譯】前端練級攻略

    摘要:由于系統(tǒng)變得越來越復(fù)雜,人們提出了稱為預(yù)處理器和后處理器的工具來管理復(fù)雜性。后處理器在由預(yù)處理器手寫或編譯后對應(yīng)用更改。我之前建議的文章,,也涵蓋了預(yù)處理器相關(guān)的知識。 譯者:前端小智 原文:medium.freecodecamp.org/from-zero-t… medium.freecodecamp.org/from-zero-t… 我記得我剛開始學(xué)習(xí)前端開發(fā)的時候。我看到了很多文章及...

    wuyumin 評論0 收藏0
  • 前端練級攻略(第二部分)

    摘要:是文檔的一種表示結(jié)構(gòu)。這些任務(wù)大部分都是基于它。這個實踐的重點是把你在前端練級攻略第部分中學(xué)到的一些東西和結(jié)合起來。一旦你進(jìn)入框架部分,你將更好地理解并使用它們。到目前為止,你一直在使用進(jìn)行操作。它是在前端系統(tǒng)像今天這樣復(fù)雜之前編寫的。 本文是 前端練級攻略 第二部分,第一部分請看下面: 前端練級攻略(第一部分) 在第二部分,我們將重點學(xué)習(xí) JavaScript 作為一種獨立的語言,如...

    BWrong 評論0 收藏0
  • 混合式app開發(fā)框架

    摘要:混合式開發(fā)做出的手機應(yīng)用無論在性能還是易用性方面都很接近原生應(yīng)用。下面介紹幾個流行的混合式開發(fā)框架。相比于其他開發(fā)框架,更加輕量,體積小巧。 目前混合式開發(fā)已經(jīng)逐漸成熟,混合式app開發(fā)只需要要求開發(fā)者會使用css和js前端代碼就可以實現(xiàn)手機app應(yīng)用的開發(fā),而不需要再去學(xué)習(xí)安卓或蘋果開發(fā),降低了app開發(fā)的門檻?;旌鲜介_發(fā)做出的手機應(yīng)用無論在性能還是易用性方面都很接近原生app應(yīng)用。...

    hot_pot_Leo 評論0 收藏0
  • 混合式app開發(fā)框架

    摘要:混合式開發(fā)做出的手機應(yīng)用無論在性能還是易用性方面都很接近原生應(yīng)用。下面介紹幾個流行的混合式開發(fā)框架。相比于其他開發(fā)框架,更加輕量,體積小巧。 目前混合式開發(fā)已經(jīng)逐漸成熟,混合式app開發(fā)只需要要求開發(fā)者會使用css和js前端代碼就可以實現(xiàn)手機app應(yīng)用的開發(fā),而不需要再去學(xué)習(xí)安卓或蘋果開發(fā),降低了app開發(fā)的門檻?;旌鲜介_發(fā)做出的手機應(yīng)用無論在性能還是易用性方面都很接近原生app應(yīng)用。...

    darkbug 評論0 收藏0
  • 前端每周清單半年盤點之 PWA 篇

    摘要:前端每周清單專注前端領(lǐng)域內(nèi)容,以對外文資料的搜集為主,幫助開發(fā)者了解一周前端熱點分為新聞熱點開發(fā)教程工程實踐深度閱讀開源項目巔峰人生等欄目。 前端每周清單專注前端領(lǐng)域內(nèi)容,以對外文資料的搜集為主,幫助開發(fā)者了解一周前端熱點;分為新聞熱點、開發(fā)教程、工程實踐、深度閱讀、開源項目、巔峰人生等欄目。歡迎關(guān)注【前端之巔】微信公眾號(ID:frontshow),及時獲取前端每周清單;本文則是對于...

    崔曉明 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<