1.UIWebView的使用
CGRect bounds = [UIScreen mainScreen].bounds;
UIWebView *webview = [[UIWebView alloc]initWithFrame:bounds];
webview.delegate = self;
webview.scalesPageToFit = YES;
webview.dataDetectorTypes = UIDataDetectorTypePhoneNumber;
self.webView = webview;
[self.view addSubview:webview];
NSURL *url = [NSURL URLWithString:@"https://www.baidu.com/"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[webview loadRequest:request];
常用代理方法
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
- (void)webViewDidStartLoad:(UIWebView *)webView;
- (void)webViewDidFinishLoad:(UIWebView *)webView;
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error;
2.OC調用JS
NSString *sendJsStr=[NSString stringWithFormat:@"alert(123)"];
[webView stringByEvaluatingJavaScriptFromString:sendJsStr];
JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
NSString *alertJS=@"alert('test js OC')"; //準備執行的js代碼
[context evaluateScript:alertJS];//通過oc方法調用js的alert
3.JS調用OC
使用JSContext,js調用OC
ctx[@"bizmateIOSTokenInvalid"] = ^() {
block();
};
4.遇到的問題
js頁面有二級頁面的時候,第一級頁面的OC可以正常調取js中的方法傳遞進參數,二級頁面的時候就獲取不到,原因:
UIWebView里面的JavaScriptContext這個對象,每個頁面一個,發生跳轉的時候會把前頁面的JavaScriptContext釋放掉,加載新頁面,然后為新頁面再創建一個JavaScriptContext。也就是JavaScriptContext與UIWebView對象無關,與當前加載的網頁有關。JavaScriptContext創建時機apple沒有在UIWebViewDelegate提供,一個UIWebView在第一次價載網頁的時候,可以在webViewDidFinishLoad等事件里賦值,js也可以獲取的到,但在同一個UIWebView做跳轉的化久顯得有點詭異,明明獲取了JavaScriptContext并設置了我們的值,為神馬js獲取不到,這些都是apple沒有公開JavaScriptContext創日記的原因,我們第二次獲取的可能是前頁面的,而不是新頁面的。UIWebView多次頁面跳轉,有些資源是供用的,有些不是。JavaScriptContext就不是,什么時候創建的不知道。
解決方式:
使用UIWebViewTS_JavaScriptContext
獲取JavaScriptContext 創建之后的回調
#pragma mark - TSWebViewDelegate
/*!
* JavaScriptContext創建的時候回調
*/
- (void)webView:(UIWebView *)webView didCreateJavaScriptContext:(JSContext *)ctx
{
dispatch_async(dispatch_get_main_queue(), ^{
self.jContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
self.jContext[@"toApp"] = _helper;
});
}
參考:
http://www.lxweimin.com/p/be956be922b4
http://www.lxweimin.com/p/9513d101e582