今天在做項目的時候,遇到了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>