iOS UIWebView中JS和OC互相呼叫
阿新 • • 發佈:2018-11-06
最近做的專案中,是用html做的,我這邊直接用iOS原生的UIWebView進行載入顯示,在期間用到了js和OC的互相呼叫,這裡記錄下來
JS呼叫OC方法:
首先,什麼是JS呼叫OC方法,意思就是介面上有一個html的按鈕,我點選這個按鈕之後,要呼叫OC原聲的方法,這就是JS呼叫OC方法。我們專案裡面有一個點選登出按鈕返回原生登陸介面的例子
先impot標頭檔案
#import <JavaScriptCore/JavaScriptCore.h>
宣告一個
@property (strong, nonatomic) JSContext *context; //初始化content self.context = [self.mWebView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; // 列印異常,由於JS的異常資訊是不會在OC中被直接列印的,所以我們在這裡新增列印異常資訊, self.context.exceptionHandler = ^(JSContext *context, JSValue *exceptionValue) { context.exception = exceptionValue; };
然後註冊JS呼叫的OC方法
//登出登入 self.context[@"loginOut"] = ^() { UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"登出登陸" message:@"是否登出登入" preferredStyle:UIAlertControllerStyleAlert]; [alertController addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) { }]]; [alertController addAction:[UIAlertAction actionWithTitle:@"確定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { [self loginOut];//OC的登出方法 }]]; [self presentViewController:alertController animated:YES completion:nil]; };
這樣,在點選登出的按鈕之後就會執行對應的OC方法了
OC呼叫JS方法:
什麼是OC呼叫JS方法,意思就是點選了原生的按鈕之後需要再呼叫JS的方法進行資料回傳或者其他操作,我們專案裡面有一個獲取百度語音結果呼叫JS方法將結果回傳給後臺的例子
//百度語音結果回撥
-(void)results:(NSString *)results {
//初始化content
self.context = [self.mWebView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
// 列印異常,由於JS的異常資訊是不會在OC中被直接列印的,所以我們在這裡新增列印異常資訊,
self.context.exceptionHandler =
^(JSContext *context, JSValue *exceptionValue)
{
context.exception = exceptionValue;
};
NSString *getYuyinResult = @"getYuyinResult('inputAllSearch','你好你好')";
[self.context evaluateScript:getYuyinResult];
}
這樣就可以呼叫JS方法啦,主要就是呼叫evaluateScript方法去執行JS,getYuyinResult這個字串中getYuyinResult是JS方法名,如果沒有引數就直接跟括號。
這就是UIWebView中JS和OC的互調了,有說的不好和不對的地方,希望大家指正
最後獲取當前頁面的title在- (void)webViewDidFinishLoad:(UIWebView *)webView這個方法裡去獲取當前頁面的title,這個方法是頁面載入完成之後執行的
self.title = [self.mWebView stringByEvaluatingJavaScriptFromString:@"document.title"]