1. 程式人生 > >iOS UIWebView中JS和OC互相呼叫

iOS UIWebView中JS和OC互相呼叫

最近做的專案中,是用html做的,我這邊直接用iOS原生的UIWebView進行載入顯示,在期間用到了jsOC的互相呼叫,這裡記錄下來

     JS呼叫OC方法:

        首先,什麼是JS呼叫OC方法,意思就是介面上有一個html的按鈕,我點選這個按鈕之後,要呼叫OC原聲的方法,這就是JS呼叫OC方法。我們專案裡面有一個點選登出按鈕返回原生登陸介面的例子

先impot標頭檔案

#import <JavaScriptCore/JavaScriptCore.h>

宣告一個

JSContext物件並初始化

@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方法去執行JSgetYuyinResult這個字串中getYuyinResultJS方法名,如果沒有引數就直接跟括號。

這就是UIWebViewJSOC的互調了,有說的不好和不對的地方,希望大家指正

最後獲取當前頁面的title- (void)webViewDidFinishLoad:(UIWebView *)webView這個方法裡去獲取當前頁面的title,這個方法是頁面載入完成之後執行的

self.title = [self.mWebView stringByEvaluatingJavaScriptFromString:@"document.title"]