目錄
1.1 加載某個(gè)網(wǎng)頁(yè)
1.2 設(shè)置ua
1.3 獲取標(biāo)題
1.4 獲取當(dāng)前頁(yè)面URL
1.5 清除頁(yè)面緩存
1.6 停止加載
1.7 獲取Scheme
1.8 返回添加關(guān)閉按鈕
1.9 檢測(cè)頁(yè)面上的電話
1.10 webView 禁止?jié)L動(dòng)
1.11 獲取HTML高度
1.12 js調(diào)用oc方法
1.13 oc調(diào)用js方法
1.14 Html 代碼
1.1 加載頁(yè)面
1.加載某個(gè)URL
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:
[NSURL URLWithString:self.url]];
self.webView.scalesPageToFit = YES;
[self.webView loadRequest:request];
2.加載本地文件
NSURL* url = [NSURL fileURLWithPath:filePath]; // 需要加載的文件路徑
NSURLRequest* request = [NSURLRequest requestWithURL:url];
[webView loadRequest:request];
1.2 設(shè)置ua
//通過(guò)ua卵蛉,可以區(qū)分哪個(gè)應(yīng)用訪問(wèn)了當(dāng)前網(wǎng)頁(yè)闽撤。
//需求:移動(dòng)端隱藏H5頂部狀態(tài)欄,使用原生的NavgationBar戳稽,PC端正常顯示。
NSString *userAgent = [self.webView stringByEvaluatingJavaScriptFromString:
@"navigator.userAgent"];
NSString *executableFile = @"xxxx";
NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:
(NSString *)kCFBundleVersionKey];
NSString *ua = [NSString stringWithFormat:@"%@ %@ %@", executableFile,
version,userAgent];
[[NSUserDefaults standardUserDefaults]
registerDefaults:@{@"UserAgent" : ua, @"User-Agent" : ua}];
1.3 獲取標(biāo)題
self.webTitle = [webView stringByEvaluatingJavaScriptFromString:
@"document.title"];
[self setNavigationItemTitle:self.webTitle];
1.4 獲取當(dāng)前頁(yè)面URL
//分享時(shí)可能會(huì)需要,動(dòng)態(tài)URL途乃。
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request
navigationType:(UIWebViewNavigationType)navigationType
{
self.shareUrl = [request.URL description];
return YES;
}
1.5 清除頁(yè)面緩存
NSHTTPCookie *cookie;
NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (cookie in [storage cookies])
{
[storage deleteCookie:cookie];
}
1.6 停止加載
[self.mainWebView stopLoading];
1.7 獲取Scheme
需求:登錄頁(yè)面乖仇,自定義SSO協(xié)議,當(dāng)各app端拿到自己規(guī)定的scheme规哲,停止頁(yè)面加載跟啤,拿到對(duì)應(yīng)數(shù)據(jù)。
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
NSLog(@"%@",request.URL.scheme);
return YES;
}
1.8 返回添加關(guān)閉按鈕
需求:當(dāng)點(diǎn)擊進(jìn)入兩次以上網(wǎng)頁(yè)唉锌,想直接返回app隅肥,那么就需要一個(gè)關(guān)閉按鈕
- (void)leftBarButtonClick:(id)sender
{
if (self.webView.canGoBack)
{
[self.webView goBack];
[self showWebCloseButton];
}
else
{
[self popViewController];
}
}
1.9 檢測(cè)頁(yè)面上的電話
1.檢測(cè)網(wǎng)頁(yè)上的電話號(hào)碼,點(diǎn)擊可撥打
webView.detectsPhoneNumbers = YES;
2.自動(dòng)識(shí)別 網(wǎng)址袄简,電話等
webView.dataDetectorTypes = UIDataDetectorTypeAll;
1.10 webView 禁止?jié)L動(dòng)
當(dāng)把webView放在tableView上腥放,手勢(shì)會(huì)沖突,這時(shí)需要禁止webView滾動(dòng)
webView.scrollView.scrollEnabled=NO;
1.11 獲取HTML高度
獲取HTML高度后绿语,可以設(shè)置webView高度秃症,然后拼接在tableView上。
- (void)webViewDidFinishLoad:(UIWebView *)webView {
CGRect frame = webView.frame;
frame.size.height = webView.scrollView.contentSize.height;
webView.frame = frame;
self.tableView reloadData];
}
1.12 JS 調(diào)用 OC 方法
需求:一個(gè)H5抽獎(jiǎng)運(yùn)營(yíng)活動(dòng)吕粹,促進(jìn)老用戶升級(jí)到App最新版本种柑。
最新版本:1.4.0~
解決方案:oc 獲取到當(dāng)前App版本號(hào),H5調(diào)用判斷是否為1.4.0版本匹耕。
如果是聚请,用戶抽獎(jiǎng),否則提示升級(jí)稳其。
實(shí)戰(zhàn):規(guī)定
規(guī)定名稱:JSInterFace
規(guī)定方法:- (nonnull NSString *)getVersionName;
第一步:導(dǎo)入 JavaScriptCore.framework 驶赏,如圖1。
第二步:導(dǎo)入頭文件 #import <JavaScriptCore/JavaScriptCore.h>
第三步:創(chuàng)建webView既鞠,并加載到視圖母市。
第四步:建立 JSContext 橋梁。
@property (nonatomic, strong) JSContext *jsContext;
- (void)webViewDidFinishLoad:(UIWebView *)webView{
//建立連接
self.jsContext = (JSContext *)[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
self.jsContext.exceptionHandler = ^(JSContext *con, JSValue *exception) {
NSLog(@"%@", exception);
con.exception = exception;
};
//創(chuàng)建對(duì)象损趋,處理來(lái)自JS調(diào)用的類
JSInterFace *interFace = [[JSInterFace alloc] init];
self.jsContext[@"JSInterFace"]= interFace;
}
第五步:寫(xiě) JSInterFace類
JSInterFace.h
#import <Foundation/Foundation.h>
@class JSInterFace;
@import JavaScriptCore;
@protocol EPJSExport <JSExport>
- (nonnull NSString *)getVersionName;
@end
@interface JSInterFace : NSObject <EPJSExport>
@end
JSInterFace.m
#import "JSInterFace.h"
@implementation JSInterFace
- (nonnull NSString *)getVersionName
{
//這里打斷點(diǎn)就可以查看是否被調(diào)用了患久,
//如需回調(diào)到控制器實(shí)現(xiàn)功能椅寺,可選用block或者代理。
return (NSString *)[[NSBundle mainBundle]
objectForInfoDictionaryKey:@"CFBundleVersion"];
}
@end
如需Demo蒋失,請(qǐng)關(guān)注后聯(lián)系作者~
圖1
1.13 oc調(diào)用js方法
這個(gè)場(chǎng)景非常少見(jiàn)返帕,作者詢問(wèn)了幾個(gè)H5開(kāi)發(fā),基本都沒(méi)有用到這個(gè)場(chǎng)景篙挽。我能想到的就是App外殼包裝的H5荆萤,遇到異常的時(shí)候,做出相應(yīng)的提示而已铣卡。
第一步:導(dǎo)入 JavaScriptCore.framework 链韭,如圖1。
第二步:導(dǎo)入頭文件 #import <JavaScriptCore/JavaScriptCore.h>
第三步:創(chuàng)建webView煮落,并加載到視圖敞峭。
第四步:建立 JSContext 橋梁。
#import "ViewController.h"
#import <JavaScriptCore/JavaScriptCore.h>
#define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width //屏幕寬度
#define SCREEN_HEIGHT [UIScreen mainScreen].bounds.size.height //屏幕高度
@interface ViewController ()<UIWebViewDelegate>
@property (nonatomic , strong)UIWebView *mainWebView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.mainWebView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)];
self.mainWebView.delegate = self;
NSURL *url = [NSURL URLWithString:@"http://www.reibang.com/users/d10b02ea2d91/latest_articles"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
self.mainWebView.scalesPageToFit = YES;
[self.mainWebView loadRequest:request];
[self.view addSubview:self.mainWebView];
}
-(void)webViewDidFinishLoad:(UIWebView *)webView
{
//網(wǎng)頁(yè)加載完成調(diào)用此方法
//首先創(chuàng)建JSContext 對(duì)象
JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
OC 調(diào)用 JS alert 彈框
NSString *alertJS=@"alert('這個(gè)博客非常好')";
[context evaluateScript:alertJS];//通過(guò)oc方法調(diào)用js的alert
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script type="text/javascript">
function javacalljs(){
document.getElementById("content").innerHTML +=
"<br\>java調(diào)用了js函數(shù)";
}
function javacalljswithargs(arg){
document.getElementById("content").innerHTML +=
("<br\>"+arg);
}
</script>
</head>
<input type="button" value="傳遞分享信息" onClick="window.JSInterFace.ExitLogin()"/>
</body>
</html>