iOS原生和H5的相互調用


為什么現在越來越多的APP中開始出現H5頁面?

1,H5頁面開發效率更高,更改更加方便;

2,適當縮小APP安裝包的大小;

3,蹭熱點更加方便,比如五一,十一,雙十一搞活動;

那么為什么說H5無法取代原生的APP,只能處在一個共存的例子呢?

1,這個是由系統的底層決定的,極端例子,所有的應用都通過H5展示,那么你是否需要一個瀏覽器?

2,涉及龐大的功能,涉及復雜的邏輯結構,涉及安全性的要求,H5可以勝任嗎?

所以,H5和原生的融合會出現動態的調和,最終會找到一個平衡。

那么接下來就說下iOS開發中原生和H5的相互調用。

原生頁面優勢:(1)運行速度比較快(2)能使用設備的底層功能,如攝像頭、方向傳感器、重力傳感器、撥號、GPS、語音、短信、藍牙等(3)在界面設計、功能模塊、操作邏輯等層面相較web更易

做到App的便捷性和舒適性,功能更加強大(4)節省流量

劣勢:(1)不同的操作系統(如Android和iOS)需要獨立的進行開發,使用其各自的開發包、開發工具和控件(2)每次有更新,都需要重新打包一次發布到應用平台上,且每次要向各個應用商店進行

提交審核。之后用戶需要手動進行點擊更新安裝(安裝成本較高)(3)開發成本比較高,尤其需要適配各種機型時(如Android應用,需要適配各種Android手機)

H5頁面優勢:(1)由於是運行在瀏覽器上,所以只需要開發一次便可以在不同的操作系統上顯示(2)迭代版本時,不需要打包便可以發布(實時更新、快速迭代),與雲端實現實時數據交互(3)開發

成本相對較低,對瀏覽器的適配較簡單,且發布門檻相對較低

劣勢:(1)每次打開頁面,都得重新加載,獲取數據...(2)過於依賴網絡,速度無法保證。特別在弱網環境下,不僅耗費流量而且加載緩慢,就算是WiFi情況下也不容樂觀(3)只能使用有限的設備底

層功能(無法使用攝像頭、方向傳感器、重力傳感器、撥號、GPS、語音、短信、藍牙等功能)(4)仍處於發展階段,部分功能無法在基於現有技術的瀏覽器基礎上實現,且無法全面的顯示最完美的用戶

體驗,只能用現有技術去彌去找最佳解決方案

 

原生與H5的相互調用,其實也可以簡單理解為Webview跟JavaScript的相互調用。

====================Webview調用JS(應用場景較少)=========================

// 網頁加載完調用JS彈窗

- (void)webViewDidFinishLoad:(UIWebView *)webView{

    //webView 調用 js

    NSString *result = [webView stringByEvaluatingJavaScriptFromString:@"javascript:add(3,5);"];

     NSLog(@"%@",result);

}

====================JS調用WebView(最常見)========================= 

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{

    /**

     <!-- 自定義協議與OC進行交互 -->

       // 網頁上的一個鏈接,點擊這個鏈接出發以下反應。。。

      <a href="protocol:///showMessage:/晚上小樹林見面,有驚喜!!!:D">女神</a>

     */

    //在此方法中截取下一個請求的URL,通過自定義協議頭,截取要執行的方法和參數

     if ([request.URL.scheme isEqualToString:@"protocol"]) {

        //調用oc的方法做事

        //工作中用下面的

        NSArray *pathComponents = [request.URL pathComponents];

       //獲取到方法名的字符串

        NSString *methodName = pathComponents[1];

       //獲取到的參數的字符串

        NSString *param= pathComponents[2];

        //SEL

        SEL method = NSSelectorFromString(methodName);

        //調用方法

        if ([self respondsToSelector:method]) {

         [self performSelector:method withObject:param];

   }

            return NO;

 }

     return YES;

}

// OC的方法   

- (void)showMessage:(NSString *)param{

    NSLog(@"showMessage---%@",param);

    UIViewController *nvshen = [[UIViewController alloc] init];

    nvshen.view.backgroundColor = [UIColor yellowColor];

    nvshen.title = @"女神經";

    [self.navigationController pushViewController:nvshen animated:YES];

}

當然,還有更好的方法,有一個第三方的框架可以用。 

在這里推薦一個比較好的第三方庫即:WebViewJavascriptBridge 

地址:https://github.com/marcuswestin/WebViewJavascriptBridge

通過使用該庫可以輕松實現JS與原生交互。

//初始化WebViewJavascriptBridge方法

_bridge= [WebViewJavascriptBridge bridgeForWebView:self.BookWebView webViewDelegate:self handler:^(id data,WVJBResponseCallback responseCallback) {}];

//原生與JS約定接口名為“testObjcCallback”,data是JS傳遞過來的信息,responseCallback來將信息傳遞給JS

[_bridge registerHandler:@"testObjcCallback" handler:^(id  data,WVJBResponseCallback responseCallback) {

responseCallback("postInfomationToJS")

}];

------------------------------------------------------------------------------------------------------------------------------ 

購買阿里雲服務優惠鏈接:

https://chuangke.aliyun.com/invite?userCode=ff3mpiie


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM