最近在做一個項目唆铐,里面用到了與H5的交互爹耗,準(zhǔn)確的說是JS端要調(diào)用本地的代碼,這里要說一下潭兽,wkWebView的JS交互與普通的UIWebView是不一樣的,而且在JS端代碼的編寫也是有所不同的斗遏,希望大家能跟后臺人員做良好的溝通。 廢話不多說诵次,直接上代碼枚碗。。铸本。。
- 先說說wkWebView與JS交互的方法吧
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
[config.userContentController addScriptMessageHandler:self name:@"與后臺約定的方法名"];
//創(chuàng)建webView
WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:config];
webView.navigationDelegate = self;
在上面的這個方法里面去創(chuàng)建一個webView箱玷,并且約定方法名稱。
執(zhí)行本地的方法時候調(diào)用下面的這個方法
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
//message.body 可以打印JS端給你傳過來的數(shù)據(jù)锡足,可以根據(jù)數(shù)據(jù)去執(zhí)行相應(yīng)的方法
}
你以為JS調(diào)用本地的方法就完事了嗎?
舶得。
掰烟。
扩灯。
媚赖。
。
錯誤珠插,你會發(fā)現(xiàn)這樣調(diào)用方法之后惧磺,內(nèi)存根本不釋放。也就是說dealloc方法不會執(zhí)行捻撑。
前方高能磨隘,請仔細(xì)查看。顾患。番捂。。
問題就出現(xiàn)在
[config.userContentController addScriptMessageHandler:self name:@"與后臺約定的方法名"];
這句代碼上面江解,準(zhǔn)確的說是“self”的身上设预。
那么怎么解決呢?
我們可以把self換掉犁河,就是說用其他換掉self鳖枕,這里面就要新建一個類
在.h里面是這樣的
#import <WebKit/WebKit.h>
@interface XLWeakScriptMessageDelegate : NSObject<WKScriptMessageHandler>
@property (nonatomic,weak)id<WKScriptMessageHandler> scriptDelegate;
- (instancetype)initWithDelegate:(id<WKScriptMessageHandler>)scriptDelegate;
@end
在.m里面是這樣的
#import "XLWeakScriptMessageDelegate.h"
@implementation XLWeakScriptMessageDelegate
- (instancetype)initWithDelegate:(id<WKScriptMessageHandler>)scriptDelegate{
self = [super init];
if (self) {
_scriptDelegate = scriptDelegate;
}
return self;
}
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
[self.scriptDelegate userContentController:userContentController didReceiveScriptMessage:message];
}
@end
新建的類我都寫在這里了,大家可以拿過去直接用桨螺。
下面說的是最重要的改動宾符,就是把
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
[config.userContentController addScriptMessageHandler:self name:@"與后臺約定的方法名"];
這里面的代碼改造成
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
[config.userContentController addScriptMessageHandler:[[XLWeakScriptMessageDelegate alloc] initWithDelegate:self] name:@"callback"];
//創(chuàng)建webView
WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:config];
webView.navigationDelegate = self;
這樣以來,你就會發(fā)現(xiàn)灭翔,內(nèi)存釋放了魏烫,dealloc的方法可以快快樂樂的執(zhí)行了。
第一次發(fā)簡書,寫的不好大家多多見諒哄褒,如有什么問題給我留言稀蟋,我看到一定第一時間給大家回復(fù)。
能幫到你呐赡,才是我最大的成就:巍!72铡!绎谦!