服務項目

需求溝通

h5 app開發

  現在移動端 web 應用,很多時候都需要與原生 app 進行交互、溝通(運行在 webview中),比如微信的 jssdk,通過 window.wx 對象調用一些原生 app 的功能。所以,這次就來捋一捋 h5 與原生 app 交互的原理。

  h5 與原生 app 的交互,本質上說,就是兩種調用:

  app 調用 h5 的代碼

  h5 調用 app 的代碼

  1. app 調用 h5 的代碼

  因為 app 是宿主,可以直接訪問 h5,所以這種調用比較簡單,就是在 h5 中曝露一些全局對象(包括方法),然后在原生 app 中調用這些對象。

  javascript:

  window.sdk = { double = value => value * 2, triple = value => value * 3,};

  android:

  webview.evaluateJavascript('window.sdk.double(10)', new ValueCallback() { @Override public void onReceiveValue(String s) { // 20 }});

  ios:

  NSString *func = @"window.sdk.double(10)";NSString *str = [webview stringByEvaluatingJavaScriptFromString:func]; // 20

  2. h5 調用 app 的代碼

  因為 h5 不能直接訪問宿主 app,所以這種調用就相對復雜一點。

  這種調用常用有兩種方式:

  由 app 向 h5 注入一個全局 js 對象,然后在 h5 直接訪問這個對象

  由 h5 發起一個自定義協議請求,app 攔截這個請求后,再由 app 調用 h5 中的回調函數

  2.1 由 app 向 h5 注入一個全局 js 對象

  這種方式溝通機制簡單,比較好理解,并且對于 h5 來說,沒有新的東西,所以是比較推薦的一種方式。但這種方式可能存在安全隱患,詳細查看 你不知道的 Android WebView 使用漏洞。

  android:

  webview.addJavascriptInterface(new Object() { @JavascriptInterface public int double(value) { return value * 2; } @JavascriptInterface public int triple(value) { return value * 3; }}, "appSdk");

  ios:

  @interface AppSdk : NSObject{}- (int) double:(int)value;- (int) triple:(int)value;@[email protected] AppSdk- (int) double:(int)value { return value * 2;}- (int) triple:(int)value { return value * 3;}@endJSContext *context=[webview valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];AppSdk *appSdk = [AppSdk new];context[@"appSdk"] = appSdk;

  javascript:

  window.appSdk.double(10); // 20

  2.2 由 h5 發起一個自定義協議請求

  這種方式要稍復雜一點,因為需要自定義協議,這對很多前端開發者來說是比較新的東西。所以一般不推薦這種方式,可以作為第一種方式的補充。

  大致需要以下幾個步驟:

  由 app 自定義協議,比如 sdk://action?params

  在 h5 定義好回調函數,比如 window.bridge={getDouble:value=>{},getTriple:value=>{}}

  由 h5 發起一個自定義協議請求,比如 location.href='sdk://double?value=10'

  app 攔截這個請求后,進行相應的操作,獲取返回值

  由 app 調用 h5 中的回調函數,比如 window.bridge.getDouble(20);

  javascript:

  window.bridge = { getDouble: value => { // 20 }, getTriple: value => { // more }};location.href = 'sdk://double?value=10';

  android:

  webview.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // 判斷如果 url 是 sdk:// 打頭的就攔截掉 // 然后從 url sdk://action?params 中取出 action 與params Uri uri = Uri.parse(url); if ( uri.getScheme().equals("sdk")) { // 比如 action = double, params = value=10 webview.evaluateJavascript('window.bridge.getDouble(20)'); return true; } return super.shouldOverrideUrlLoading(view, url); }});

  ios:

  - (BOOL)webview:(UIWebView *)webview shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { // 判斷如果 url 是 sdk:// 打頭的就攔截掉 // 然后從 url sdk://action?params 中取出 action 與params NSString *urlStr = request.URL.absoluteString; if ([urlStr hasPrefix:@"sdk://"]) { // 比如 action = double, params = value=10 NSString *func = @"window.bridge.getDouble(20)"; [webview stringByEvaluatingJavaScriptFromString:func]; return NO; } return YES;}
 

選擇一家app定制的軟件開發公司,最重要的是程序員的素質和綜合能力,仟源科技專業從事軟件開發,服務行業范圍非常之廣,匯聚了JAVA,NET,前端,APP應用,PHP,軟件測試等多方面的開發工程師,也有平面設計,產品設計與運營,網絡建設與運維等方面的專業人才,有多年的企業級軟件開發的經驗。

  仟源科技有限公司始終堅持以創業服務創業,以創新服務創新”的宗旨,做軟件開發,游戲開發和系統開發核心業務,實現前瞻性投資,為優秀創業者做一站式扶持,并建立“大服務、大扶持、大未來”的目標。仟源科技堅持以客戶需求為中心,打造企業品牌助力企業成長!那么最后說一句,如果您有軟件開發的需求,請馬上關注聯系我們吧。

上一篇:h5開發 下一篇:h5小游戲開發
文章標簽:
文章評論:

專業的游戲開發/系統開發、品牌設計/網站建設,選仟源!

選擇專業的企業服務公司,服務更靠譜!

立即點擊咨詢>
客服圖標
客服圖標
118旺角心水论坛