網絡開發中,當公司已經使用 HTML5 技術實現同時適應 Android 和 iOS 等多個平臺的網頁時,這時往往需要我們 iOS 平臺能夠嵌入網頁并進行各種交互,
這里我們考慮的方案就是:使用 UIWebView 網頁控件
UIWebView是蘋果給我們提供展示網頁的一種控件。
我們一般這樣創建并加載一個服務器端的網頁:
像這樣加載一個本地網頁:
Html5的有很多優點,比如開發速度快,app上線也可以隨意修改免審核,跨平臺,效果也不錯。次聽說這個混合式開發還是自己在鉆研UIWebView的時候,那個時候才知道這樣開發也是有很多合適的地方的。Cordova和它的前身PhoneGap,國內的WebViewJavascriptBridge都是很好的混合開發解決方案。如果傳遞的參數比較簡單,功能不復雜的話,不用三方也可以很容易的實現。
可以使用webview調用如下代碼:
這個方法向UIWebView傳遞一段需要執行的JavaScript代碼后獲取執行結果。
比如做百思不得姐那個項目時,我需要點擊Native的button獲取網頁上的文字,用來當郵件內容:
實現點擊網頁上的按鈕,調用原生的方法需要用到webview的一個代理:
詳細說一下調用流程:
點擊按鈕要JS發送像這樣
然后app通過代理收到這個協議,就可以根據協議調用自身的方法了。
舉個栗子:
App端
Html端
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 之間的交互
Objective-C 調用 JavaScript
- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;
//getEmailContent();就是js的方法名 //body就是getEmailContent方法返回的文字信息 NSString * body =[self.webView stringByEvaluatingJavaScriptFromString:@"getEmailContent();"];
JavaScript 調用 Objective-C
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
yuefan://jump?invitingID=1 的一條協議給 native 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>
<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>
本站文章版權歸原作者及原出處所有 。內容為作者個人觀點, 并不代表本站贊同其觀點和對其真實性負責,本站只提供參考并不構成任何投資及應用建議。本站是一個個人學習交流的平臺,網站上部分文章為轉載,并不用于任何商業目的,我們已經盡可能的對作者和來源進行了通告,但是能力有限或疏忽,造成漏登,請及時聯系我們,我們將根據著作權人的要求,立即更正或者刪除有關內容。本站擁有對此聲明的最終解釋權。