1. 程式人生 > >IOS WebView中JS和OC相互呼叫

IOS WebView中JS和OC相互呼叫

  現在有很多專案中都涉及到HTML5,在一個普通的APP裡面嵌入HTML5網頁,嵌入的這些網頁在伺服器把頁面修改之後同樣也能跟著修改,這樣就能很方便的修改程式的展示內容。如果使用tabelView或者其他的控制元件展示內容的話,當展示的內容的樣式需要發生改變的時候必須修改程式本身才能夠達到修改的效果。所以,在APP裡面HTML5的嵌入可以更加方便的維護程式的內容,但是由於現在受網速啊,手機效能等因素的影響導致HTML5的使用者體驗沒有系統原生程式碼修改的APP好,所以針對這個JS和OC的專案呼叫,這裡只是簡單的講講,方便大家以後的學習和使用。

1.JS調OC

  在JS呼叫OC的時候,其實我使用的是取巧的辦法,當我們使用webView載入網頁的時候,每一次請求都會被webView的

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;

代理方法捕捉到,然後我們就可以在該代理方法裡面進行相應的操作,這裡我們先看看我寫的一個簡單測試程式碼,首先看測試網頁的原始碼:

<html>
    <head lang="en">
        <meta charset="UTF-8">
        <title
>
</title> </head> <body> <br/><br/> <button onclick="fn_call();">打電話</button> <br/><br/> <button onclick="fn_getmethon();">獲取引數</button> <script type="text/javascript"> function fn_call(){ window.location.href='sn://call'
; } function fn_getmethon(){ window.location.href='sn://getValue'; } function fn_alertMsg(msg){ alert(msg); }
</script> </body> </html>

在這個頁面裡面,有兩個按鈕,按鈕點選之後分別呼叫兩個方法,在方法裡面使用window.location.href='sn://getValue'傳送一個請求,但是這個請求的協議不是http所以頁面不會進行跳轉;接著我們在webView的代理方法裡面捕捉事件。

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    NSString *url = request.URL.absoluteString;
    NSLog(@"列印請求的URL-->%@", url);
    NSRange range = [url rangeOfString:@"sn://"];
    NSUInteger location = range.location;
    if (location != NSNotFound) {
        NSString *methon = [url substringFromIndex:location + range.length];
        SEL fn = NSSelectorFromString(methon);
        [self performSelector:fn withObject:nil];
    }

    return YES;
}

- (void)call {
    NSLog(@"呼叫打電話");
}

當我們按了”打電話”這個按鈕之後,控制檯就會出現
這裡寫圖片描述
這裡我們就可以對得到的URL進行簡單的擷取啊,判斷等操作,然後再執行需要執行的OC程式碼,我這裡是呼叫了call()這個方法,這樣就完成了JS對OC的呼叫。

2.OC調JS

  前面講了JS對OC的呼叫,在這裡OC呼叫JS的原理其實差不多,在最開始的html頁面裡面有一個”獲取值”的按鈕點選之後就會呼叫js方法,然後在OC裡面捕捉到對應的方法

- (void)getValue {
    NSLog(@"呼叫獲取值");
    NSMutableString *js = [NSMutableString string];
    [js appendString:[NSString stringWithFormat:@"fn_alertMsg('%@');", @"這是測試傳值"]];
    [self.webView stringByEvaluatingJavaScriptFromString:js];
}

這這個方面裡面我們主要記住要在webView執行js程式碼就要呼叫- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;這個方法,我們只需要傳入需要執行的JS程式碼然後就可以在webView裡面執行。先看看執行的效果:
執行結果通過上面提到的的程式碼就完成了OC對JS的呼叫,在用OC對JS呼叫的時候我們要先測試JS程式碼的正確性,這樣能提高我們的開發效率。

  好了,webView中JS和OC呼叫,以及OC和JS的呼叫就寫到這裡了,有不足的地方希望大家多提提,最後附上完整的程式碼,webView控制元件使用故事版拖的

@interface ViewController () <UIWebViewDelegate>
@property (strong, nonatomic) IBOutlet UIWebView *webView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle].resourcePath stringByAppendingPathComponent:@"test.html"]];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    self.webView.delegate = self;
    [self.webView loadRequest:request];
}

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    NSString *url = request.URL.absoluteString;
    NSLog(@"列印請求的URL-->%@", url);
    NSRange range = [url rangeOfString:@"sn://"];
    NSUInteger location = range.location;
    if (location != NSNotFound) {
        NSString *methon = [url substringFromIndex:location + range.length];
        SEL fn = NSSelectorFromString(methon);
        [self performSelector:fn withObject:nil];
    }

    return YES;
}

- (void)getValue {
    NSLog(@"呼叫獲取值");
    NSMutableString *js = [NSMutableString string];
    [js appendString:[NSString stringWithFormat:@"fn_alertMsg('%@');", @"這是測試傳值"]];
    [self.webView stringByEvaluatingJavaScriptFromString:js];
}

- (void)call {
    NSLog(@"呼叫打電話");
}

@end

相關推薦

IOS WebViewJSOC相互呼叫

  現在有很多專案中都涉及到HTML5,在一個普通的APP裡面嵌入HTML5網頁,嵌入的這些網頁在伺服器把頁面修改之後同樣也能跟著修改,這樣就能很方便的修改程式的展示內容。如果使用tabelView或者其他的控制元件展示內容的話,當展示的內容的樣式需要發生改變的

iOS UIWebViewJSOC互相呼叫

最近做的專案中,是用html做的,我這邊直接用iOS原生的UIWebView進行載入顯示,在期間用到了js和OC的互相呼叫,這裡記錄下來      JS呼叫OC方法:         首先,什麼是JS呼叫O

iOS原生WebViewJavaScriptOC互動

在iOS開發中很多時候我們會和UIWebView打交道,目前國內的很多應用都採用了UIWebView的混合程式設計技術,最常見的是微信公眾號的內容頁面。前段時間在做微信公眾平臺相關的開發,發現很多應用場景都是利用HTML5和UIWebView來實現的。 注意事項 (

介紹了webkit到webengine的webenginejsC++互相呼叫的方法

pro檔案 檔案中需要加入”QT += core gui webenginewidgets”這句話,不然提示找不到檔案 QT += core gui QT += core gui webenginewidgets greaterThan(QT_MAJOR

C# 用XiliumCefGlue做瀏覽器,JSC#相互呼叫

目錄: XiliumCefGlue初始化,最精簡Demo 1.解壓壓縮包得到下列檔案。選擇需要的檔案複製到自己工程【pdb為除錯生成檔案不需要】,之後將【Xilium.CefGlue】和【Xilium.CefGlue.WindowsForm

WebViewjsandroid互動遇到的坑

js呼叫Android程式碼 //android程式碼 private int load_state = -1;//記錄當前的載入狀態 private WebView mWebView; @SuppressLint("JavascriptInterface"

iOS js oc相互呼叫(JavaScriptCore)

從iOS7開始 蘋果公佈了JavaScriptCore.framework 它使得JS與OC的互動更加方便了。 下面我們就簡單瞭解一下這個框架 首先我匯入framework 方法如下 點選Linked Frameworks and Libraries 的

fragmentactivity的控制元件相互呼叫

1.在activity中獲取fragment中的控制元件: v4包: getSupportFragmentManager().findFragmentById(R.id.xxfragment).getView().findViewById(R.id.xx); 非v4包: getFragmentMan

22.WebBrowserJSC++程式碼互相呼叫

利用WebBrowser控制元件我們可以利用各種Web介面庫做出高大上的介面和炫酷的動畫,擴充套件性也好,甚至可以實現介面實時升級。但是有一點問題,在WebBrowser內嵌的網頁中如何訪問本地計算機硬體呢?實時上,WebBrowser內嵌的網頁中JS與本地C++程式碼可以

iOSNSDateNSString相互轉換

本文來源地址:http://www.osjoin.com  今天給大家分享一些關於NSDate和NSString相互轉換。 日期轉成字串。這個雖然簡單,但是我相信很多朋友初次遇到肯定束手無策。腦

iOSJSOC互相呼叫(三)--MessageHandler

使用WKWebView的時候,如果想要實現JS呼叫OC方法,除了攔截URL之外,還有一種簡單的方式。那就是利用WKWebView的新特性MessageHandler來實現JS呼叫原生方法。 MessageHandler 是什麼? WKWebView 初始

iOS WebViewJS互動

前言: 一段時間了,手頭的工作照常進行中,之前有好幾個主題一直想寫,但又擱置了,主要是主題有點大,看樣子路還是要一步一步走的; 前幾天,收到了一份面試通知,一家比較大的網際網路企業吧,想想自己也沒什麼面試經驗,總想著要換個環境,也想換個角度審視一下自己,所以就去了,真心是沒

JSOC互相呼叫的一百種方法(包括WKWebViewUIWebView)

/** * 根據webView、navigationAction相關資訊決定這次跳轉是否可以繼續進行,這些資訊包含HTTP傳送請求,如頭部包含User-Agent,Accept,refer * 在傳送請求之前,決定是否跳轉的代理 * @param webView * @param naviga

iOSJSOC互相呼叫(八)--Cordova詳解+實戰

扯兩句,可以跳過 由於專案中Cordova相關功能一直是同事在負責,所以也沒有仔細的去探究Cordova到底是怎麼使用的,又是如何實現JS 與 OC 的互動。所以我基本上是從零開始研究和學習Cordova的使用,從上篇在官網實現命令列建立工程,到工程執行起來,

iOSJSOC互相呼叫(四)--JavaScriptCore

前面講完攔截URL的方式實現JS與OC互相呼叫,終於到JavaScriptCore了。它是從iOS7開始加入的,用 Objective-C 把 WebKit 的 JavaScript 引擎封裝了一下,提供了簡單快捷的方式與JavaScript互動。 關於JavaScriptCore的使用有兩篇很好的文章:N

iOSJSOC互相呼叫(六)-->WKWebView + WebViewJavascriptBridge

上一篇文章介紹了UIWebView 如何通過WebViewJavascriptBridge 來實現JS 與OC 的互相呼叫,這一篇來介紹一下WKWebView 又是如何通過WebViewJavascriptBridge 來實現JS 與OC 的互相呼叫的。WKWebView

Android呼叫WebViewJSJS呼叫Android的方法

① Android呼叫WebView的JS 第一步,開啟JS呼叫 WebSettings settings = webview.getSettings(); //設定與Js互動的許可權 settings.setJavaScriptEnable

JSOC互調,JS開啟系統相機,JS獲取iOS系統圖片,iOSJS調OC

廢話不多說,直接進入正題 1.首先在在viewController中實現JavaScript代理 我直接把.m檔案中的內容全部貼上了,看註釋,大家懂得 #import "ViewController.h"#import <JavaScriptCore/JavaS

iOSJSOC互相呼叫(七)--Cordova 基礎

Cordova 簡介 在介紹Cordova之前,必須先提一下PhoneGap。PhoneGap 是Nitobi軟體公司2008年推出的一個框架,旨在彌補web 和iOS 之間的不足,使得web 和 iPhone SDK 之間的互動更容易。後來又加入了Android SDK 和BlackBerry SDK,再

Android BitmapDrawable相互轉換的方法

canvas board null height .com factory oar tool pla 1、Drawable --> Bitmap [java] view plain copy Bitmap drawable2Bitmap(Drawabl