1 ? WKScriptMessageHandler
? ? 1.1 WKScriptMessageHandler協(xié)議
? ?WKScriptMessageHandler 是一個(gè)遵循的協(xié)議楚堤,它能讓網(wǎng)頁(yè)通過(guò)JS把消息發(fā)送給 ?OC笆凌。其中協(xié)議方法。
/*! @abstract Invoked when a script message is received from a webpage.
@param userContentController The user content controller invoking the
delegate method.
@param message The script message received.
1.1.1 - (void)userContentController:(WKUserContentController*)userContentController didReceiveScriptMessage:(WKScriptMessage*)message;(JS和OC交互的主要方法)
這個(gè)協(xié)議可以看出這里使用了兩個(gè)類(lèi)WKUserContentController和WKScriptMessage钦无。WKUserContentController 為web和OC的協(xié)調(diào)器,WKScriptMessage則是JS傳給OC攜帶的數(shù)據(jù)虽另。
1.2現(xiàn)在先說(shuō)WKUserContentController怎么使用和方法
? ? ?WKUserContentController有兩個(gè)核心方法丐巫,也是它的核心功能。
? ??1.2.1斤斧、 (void)addUserScript:(WKUserScript *)userScript;
? ? ? ? -------> js注入早抠,即向網(wǎng)頁(yè)中注入我們的js方法,這是一個(gè)非常強(qiáng)大的功能撬讽,開(kāi)發(fā)中要慎用蕊连。
? ? 1.2.2、(void)addScriptMessageHandler:(id )scriptMessageHandler name:(NSString *)name;
? ? ------->?添加供js調(diào)用oc的橋梁游昼。這里的name對(duì)應(yīng)WKScriptMessage中的name甘苍,我們可以認(rèn)為它就是方法名。(是通過(guò)獲取JS的方法名一樣的并取JS傳回來(lái)數(shù)據(jù)的標(biāo)識(shí)[self.userContentController addScriptMessageHandler:self name:@"JSCall"]酱床,注冊(cè)完了羊赵,在1.1.1獲取JS數(shù)據(jù),就可以通過(guò)[message.name isEqualToString:@"JSCall"] 判斷了)
1.3 WKScriptMessage
? ? ?WKScriptMessage就是js通知oc的數(shù)據(jù)扇谣。其中有兩個(gè)核心屬性用的很多昧捷。
? ? ?1.3.1?@property (nonatomic, readonly, copy) NSString *name;?
?? ? (void)addScriptMessageHandler:(id )scriptMessageHandler name:(NSString *)name;添加的name」拚看1.2.2
? ? 1.3.2 @property (nonatomic, readonly, copy) id body;:攜帶的核心數(shù)據(jù)靡挥。
? ?web H5那邊js調(diào)用時(shí)只需
? ?window.webkit.messageHandlers.name(OC添加的Name).postMessage({
? ?JS端要傳給OC端的數(shù)據(jù)
? ? })這里的name就是我們添加的name?下面我們就來(lái)具體實(shí)現(xiàn)。
? 2 JS調(diào)用OC
? ? ? 2.1 配置WKUserContentController
? ? ?使用WKUserContentController為web頁(yè)面添加橋梁鸯绿,只需配置到 WKWebViewConfiguration就行跋破。
- (WKWebView*)webView {
? if(_webView ==nil)?
? ?{
? ? // js配置
?? ? ? WKUserContentController*userContentController = [[WKUserContentControlleralloc] init]; ? ? ??
? ? [userContentController addScriptMessageHandler:selfname:@"JSCall"];
// WKWebView的配置
?WKWebViewConfiguration*configuration = [[WKWebViewConfigurationalloc] init]; ? ? ? ? ? ? configuration.userContentController = userContentController;
? ? ?// 顯示?
? ? ? ? WKWebView_webView = [[WKWebViewalloc] initWithFrame:self.view.frame ? configuration:configuration]; ?
? ? ? ? _webView.UIDelegate =self;
? ? ? ?// 設(shè)置WKUIDelegate代理
? ? ? ?[self.view addSubview:_webView];? ??
? ? ? ? ?}
? ? ? return_webView;
}
2.2 實(shí)現(xiàn)WKScriptMessageHandler
在當(dāng)前頁(yè)面引入WKScriptMessageHandler簸淀,并實(shí)現(xiàn)WKScriptMessageHandler協(xié)議。
- (void)userContentController:(WKUserContentController*)userContentController didReceiveScriptMessage:(WKScriptMessage*)message?
{
NSLog(@"方法名:%@", message.name);
NSLog(@"參數(shù):%@", message.body);
// 方法名
? NSString*methods = [NSStringstringWithFormat:@"%@:", message.name]; ??
? ? ?這里你可以根據(jù)需求寫(xiě)相關(guān)的方法OC實(shí)現(xiàn)
web端寫(xiě)法
? ? 使用了window.webkit.messageHandlers.JSCall.postMessage(dict);通知oc毒返,"JSCall"?這個(gè)屬性就是前面我們通過(guò)WKUserContentController注入的租幕。
3 ?OC調(diào)用JS
? ?3.1 OC通知JS
? ? 只需WKWebView調(diào)用
? ?- (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^ __nullable)(__nullable id, NSError * __nullable error))completionHandler;方法即可。
4 WKUserScript JS注入
4.1 WKUserScript核心方法
在WebKit框架中拧簸,我們還可以預(yù)先添加JS方法劲绪,供其他人員調(diào)用。WKUserScript就是幫助我們完成JS注入的類(lèi)盆赤,它能幫助我們?cè)陧?yè)面填充前或js填充完成后調(diào)用贾富。核心方法。
/*! @abstract Returns an initialized user script that can be added to a @link WKUserContentController @/link.
@param source The script source.
@param injectionTime When the script should be injected.
@param forMainFrameOnly Whether the script should be injected into all frames or just the main frame.
*/
- (instancetype)initWithSource:(NSString *)source injectionTime:(WKUserScriptInjectionTime)injectionTime forMainFrameOnly:(BOOL)forMainFrameOnly;
4.2 WKUserScriptInjectionTime枚舉
? ? ?在WKUserScriptInjectionTime枚舉中有兩個(gè)狀態(tài)牺六。
? ? ? WKUserScriptInjectionTimeAtDocumentStart:js加載前執(zhí)行颤枪。
? ? ?WKUserScriptInjectionTimeAtDocumentEnd:js加載后執(zhí)行。
4.3 js注入
WKUserScript的運(yùn)行需依托WKUserContentController淑际,接下來(lái)我們就為WKWebView注入一個(gè)js執(zhí)行完畢后執(zhí)行的alert方法畏纲。
方法
- (WKWebView*)webView?
? ?{?
? ? if(_webView ==nil)
? ? ? {// js配置
? ?WKUserContentController*userContentController = [[WKUserContentControlleralloc] init];? ? ??
? ?[userContentController addScriptMessageHandler:selfname:@"JSCall"];// js注入,注入一個(gè)alert方法春缕,頁(yè)面加載完畢彈出一個(gè)對(duì)話(huà)框霍骄。
NSString*javaScriptSource =@"alert(\"WKUserScript注入js\");";
WKUserScript*userScript = [[WKUserScriptalloc] initWithSource:javaScriptSource injectionTime:WKUserScriptInjectionTimeAtDocumentEndforMainFrameOnly:YES];// forMainFrameOnly:NO(全局窗口),yes(只限主窗口)
[userContentController addUserScript:userScript];// WKWebView的配置WKWebViewConfiguration*configuration = [[WKWebViewConfigurationalloc] init];? ? ? ? configuration.userContentController = userContentController;// 顯示W(wǎng)KWebView_webView = [[WKWebViewalloc] initWithFrame:self.view.frame configuration:configuration];? ??
? ? [self.view addSubview:_webView];? ??
}
return_webView;
}
總結(jié):一路學(xué)習(xí)淡溯,一路分享,同時(shí)也感慨現(xiàn)在技術(shù)越來(lái)越好用簿训,越來(lái)越成熟咱娶。
參考的學(xué)習(xí)鏈接:http://www.reibang.com/p/ca7eb797c8a0