淺談UIWebView,HTML5與Native的混合開發


今天在做項目的時候,遇到了UIWebView的問題,所以今天順便總結一下,同時也簡單的談了一下Native與H5的混合開發,關於混合開發這塊,研究的不算太好,希望廣大博友指正~~

網絡開發中,當公司已經使用 HTML5 技術實現同時適應 Android 和 iOS 等多個平台的網頁時,這時往往需要我們 iOS 平台能夠嵌入網頁並進行各種交互,

這里我們考慮的方案就是:使用 UIWebView 網頁控件

UIWebView是蘋果給我們提供展示網頁的一種控件。

UIWebView的基本用法

我們一般這樣創建並加載一個服務器端的網頁:

-(UIWebView *)webview
{
    if (!_webview) {
        
        _webview = [[UIWebView alloc] init];
        _webview.scalesPageToFit = YES;
        _webview.delegate = self;
        
        NSURL *url =[NSURL URLWithString:self.urlString];
        NSURLRequest *request =[NSURLRequest requestWithURL:url];
        [_webview loadRequest:request];

    }
    return _webview;
}

像這樣加載一個本地網頁:

- (UIWebView *)webView
{
    if (!_webView) {
        
        _webView = [[UIWebView alloc] init];
        _webView.scalesPageToFit = YES;
        _webView.delegate = self;
        
        NSString *resourcePath = [[[NSBundle mainBundle] bundlePath] stringByAppendingString:@"/LocalWeb"];
        NSString *filePath = [resourcePath stringByAppendingPathComponent:@"index.html"];
        NSString *htmlstring=[[NSString alloc] initWithContentsOfFile:filePath  encoding:NSUTF8StringEncoding error:nil];
        [_webView loadHTMLString:htmlstring baseURL:[NSURL fileURLWithPath:resourcePath]];
    }
    return _webView;
}

iOS Native 與 HTML5 之間的交互

Html5的有很多優點,比如開發速度快,app上線也可以隨意修改免審核,跨平台,效果也不錯。第一次聽說這個混合式開發還是自己在鑽研UIWebView的時候,那個時候才知道這樣開發也是有很多合適的地方的。Cordova和它的前身PhoneGap,國內的WebViewJavascriptBridge都是很好的混合開發解決方案。如果傳遞的參數比較簡單,功能不復雜的話,不用三方也可以很容易的實現。

Objective-C 調用 JavaScript

可以使用webview調用如下代碼:

- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;

這個方法向UIWebView傳遞一段需要執行的JavaScript代碼最后獲取執行結果。

比如做百思不得姐那個項目時,我需要點擊Native的button獲取網頁上的文字,用來當郵件內容:

//getEmailContent();就是js的方法名
//body就是getEmailContent方法返回的文字信息

NSString * body =[self.webView stringByEvaluatingJavaScriptFromString:@"getEmailContent();"];

JavaScript 調用 Objective-C

實現點擊網頁上的按鈕,調用原生的方法需要用到webview的一個代理:

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

詳細說一下調用流程:

點擊按鈕要JS發送像這樣 yuefan://jump?invitingID=1 的一條協議給 native app,

然后app通過代理收到這個協議,就可以根據協議調用自身的方法了。

舉個栗子:

App端

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSURL * url = [request URL];
    if ([[url scheme] isEqualToString:@"yuefan"]) {
        if ([[url host] isEqualToString:@"jump"]) {
            
            ShopDetailViewController * issuedVC = [[ShopDetailViewController alloc] init];
            issuedVC.shopID = [[url valueForParameter:@"shopID"] intValue];
            [self.navigationController pushViewController:issuedVC animated:YES];
        }
    }
    
    return YES;
}

Html端

<html>
    <head>
        <meta http-equiv="content-type" content="text/html;charset=utf-8" />
        <title>測試網頁</title>
    </head>
    <body>
        <a href="yuefan://jump?invitingID=1">點擊發送</a>
    </body>
</html>

 


免責聲明!

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



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