iOS-WKWebViewとJavaScriptは相互作用します.
9106 ワード
モバイル端末の開発においては、開発効率を考慮して、ネイティブアプリケーションにWebインターフェースを統合することがあります.これはウェブ開発者が書き終わった後、原生はローディングだけでいいです.しかし、nativeとjsの相互作用の場合もあります.以下は私が相互作用の解決に使う方法と出会いの問題です.
オリジナルのローディングwebインターフェースでは、iOS 8の後に、私たちは2つの選択があります.一つはUICKitのUICBViewで、一つはWebKitのWKWebViewです.WKWebViewはiOS 8の後に発売された新しいwebディスプレイコントロールです.目的も明確です.WKWebViewメモリの消費量はUICWebViewよりかなり少ないです.対照的に、iOS 8の前のバージョンをサポートしていないなら、WKWebViewを選択したほうがいいかもしれません.
雑談は少なく言って、コードをつけて、Demoの中で2種類の方式を含んで、1種は3つの倉庫を借りないで、直接WKWebViewを使って、1種は3つの倉庫を借りるのです.また、本ページでは、
方式一:三方倉庫を借りずに、WKWebViewの関連代理を直接使用して、相互作用を行います.(参照demoの JSにOCで する を する OCは、JSに された を び します. が である. を する. は、まず を する.
OCにJSを するには び しが な JSは、OCに された を び し、 がある. のライブラリであれ、3つのライブラリであれ、 リンク:iOS-WKWebViewとJavaScriptの の な
オリジナルのローディングwebインターフェースでは、iOS 8の後に、私たちは2つの選択があります.一つはUICKitのUICBViewで、一つはWebKitのWKWebViewです.WKWebViewはiOS 8の後に発売された新しいwebディスプレイコントロールです.目的も明確です.WKWebViewメモリの消費量はUICWebViewよりかなり少ないです.対照的に、iOS 8の前のバージョンをサポートしていないなら、WKWebViewを選択したほうがいいかもしれません.
雑談は少なく言って、コードをつけて、Demoの中で2種類の方式を含んで、1種は3つの倉庫を借りないで、直接WKWebViewを使って、1種は3つの倉庫を借りるのです.また、本ページでは、
native
とJavascript
の間の相互作用の問題について述べただけで、WKWebView
の使用については、後の文章で引き続き更新される.demoアドレス方式一:三方倉庫を借りずに、WKWebViewの関連代理を直接使用して、相互作用を行います.(参照demoの
Native
フォルダ)html
コード(参照demo Native.html
ファイル)
WKWebViewDemo
native
び しjavascript
javascript
//JS OC
function OCCallJS(msg){
document.getElementById('div1').innerText = msg ? msg : ' OC '
// OC js , , return
return 'JS OC , '
}
OC
-(void)click {
//OC JS
[_wkWebView evaluateJavaScript:@"OCCallJS('JS ')" completionHandler:^(id _Nullable response, NSError * _Nullable error) {
//response js OCCallJS
NSLog(@"response:%@,error:%@",response,error);
}];
}
javascript
び しnative
OC
にJS
を するには、 び しを とする OC
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
self.wkWebView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 20, CGRectGetWidth(self.view.bounds), CGRectGetHeight(self.view.bounds)-120) configuration:config];
self.wkWebView.navigationDelegate = self;
[self.view addSubview:self.wkWebView];
// , HTML
WKUserContentController *userCC = self.wkWebView.configuration.userContentController;
//JSCallOC, javascript OC ,
[userCC addScriptMessageHandler:self name:@"JSCallOC"];
[self loadLocalHtmlWithFileName:@"Native"];
JS
は、OC
に された javascript
function btnClick() {
/**
* JS OC, OC , JS
* :window.webkit.messageHandlers..postMessage()
*/
window.webkit.messageHandlers.JSCallOC.postMessage('JS OC')
}
: を して、WebView JavascriptBridge(demoのJSBridge
フォルダを )を します.html
コード( demo JSBridge.html
ファイル)
WKWebViewDemo
native
び しjavascript
JS
でOC
に び される を する.JSBridge.js
でグローバル な //
var iosBridge = function (callback) {
if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }
if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }
window.WVJBCallbacks = [callback];
var WVJBIframe = document.createElement('iframe');
WVJBIframe.style.display = 'none';
WVJBIframe.src = 'https://__bridge_loaded__';
document.documentElement.appendChild(WVJBIframe);
setTimeout(function() {
document.documentElement.removeChild(WVJBIframe)
}, 0)
}
- `JSBridge.js` `OC` 。`OC` `JS` ,`JS` , :
1. `JS` `OC` , `OC`
/**
* :bridge.registerHandler("handlerName", function(data,responseData) { ... })
*@first param: 'OCCallJS', OC JS ,
*@second param: , data OC ‘OCCallJS’ , , ’responseCallBack‘ JS OC , ’responseCallBack‘ OC
*/
bridge.registerHandler('OCCallJS', function(data,responseCallBack){
console.log('js is called by oc,data from oc:' + data)
document.getElementById('div1').innerText = data + ' JS '
responseCallBack(' JS ')
})
2. `JS` `OC` , , , , `nil`
/**
*JS :bridge.registerHandler("handlerName", function(responseData) { ... })
*@first param: 'OCCallJS', OC JS ,
*@second param: , data OC ‘OCCallJS’ , , null
*/
bridge.registerHandler('OCCallJS', function (data){
document.getElementById('div1').innerText = data ? data : 'Objective-C JS , '
})
OC
は、JS
に された を び す(OC
において び し は、JS
に された パラメータと しなければならない.そうでなければエラーが する)OC
のエンドメソッドプロトタイプの3つがある.//1
[bridge callHandler:(NSString*)handlerName data:(id)data responseCallback:(WVJBResponseCallback)callback];
//2
[bridge callHandler:(NSString)handlerName data:(id)data
//3
[bridge callHandler:(NSString)handlerName]
1. `JS` 1
/** 1 `OC` , `OC` `callback`,`JS` .
*OC :[bridge callHandler:(NSString*)handlerName data:(id)data responseCallback:(WVJBResponseCallback)callback]
*@first param: 'OCCallJS', OC JS
*@second param data: OCCallJS , JS
*@third param responseCallback: JS , OC
*/
[self.bridge callHandler:@"OCCallJS" data:@"Objective-C JS " responseCallback:^(id responseData) {
NSLog(@"Objective-C JS ,%@",responseData);
self.label.text = [NSString stringWithFormat:@"Objective-C JS ,%@",responseData];
}];
2. `JS` 2
/**
* OC
*OC :[bridge callHandler:(NSString*)handlerName data:(id)data] or [bridge callHandler:(NSString*)handlerName]
* JS data , , null
*/
[self.bridge callHandler:@"OCCallJS" data:@"Objective-C JS , "];
[self.bridge callHandler:@"OCCallJS"];
javascript
び しnative
/**js , , JS
*OC - (void)registerHandler:(NSString *)handlerName handler:(WVJBHandler)handler
*@first param handlerName: 'JSCallOC', JS OC
*@second param handler: JS OC , JS data, OC JS 。
*/
[self.bridge registerHandler:@"JSCallOC" handler:^(id data, WVJBResponseCallback responseCallback) {
// data nil, JS , responseCallback(nil);
self.label.text = [NSString stringWithFormat:@"%@, Objective-C ",data];
responseCallback(@" Objective-C ");
}];
JS
にOC
のプロトタイプを び す と、3つの//1
bridge.callHandler("handlerName")
//2
bridge.callHandler("handlerName", data)
//3
bridge.callHandler("handlerName", data, function responseCallback(responseData)
の3つの の は、それぞれ の3つの に する.//1
bridge.callHandler('JSCallOC')
//2
bridge.callHandler('JSCallOC','JS Objective-C ')
//3, OC , , , js
bridge.callHandler('JSCallOC','JS Objective-C ',function(responseData){
document.getElementById('div1').innerText = 'JS Objective-C ,' + responseData
})
native
が び す があるjavascript
の は、HTML
に め しなければならないようです. に、 のページアプリケーションは、 のページアプリケーションが1つのHTML
しかないので、 は にコンポーネント されてレンダリングされています.javascript
が を び した も、 び し に する があります.