WKWebView js通訊的記憶體洩露問題

2021-08-18 02:45:24 字數 1591 閱讀 8344

蘋果在wkwebview上做的最讚的事兒就是顯式的支援了js通訊。用法很簡單:

乙個協議:wkscriptmessagehandler 

乙個類:

wkusercontentcontroller

建立乙個例項a,該例項遵循

wkscriptmessagehandler

協議,並將例項a與wkwebview繫結(有乙個共同的物件持有他們倆即可),這樣,例項a便可以獲得與wkwebview對應的

wkusercontentcontroller例項b(wkwebview.

configuration

.usercontentcontroller

)。例項b的方法:

- (void)addscriptmessagehandler:(id )scriptmessagehandler name:(nsstring *)name;
通過這個方法將例項a傳給

scriptmessagehandler,然後自定義乙個

name

。後續h5就可以通過一套標準的介面找到js處理的響應器。

window.webkit.messagehandlers.name.postmessage();
而wkscriptmessagehandler協議只有乙個方法:

/*! @abstract adds a script message handler.

@param scriptmessagehandler the message handler to add.

@param name the name of the message handler.

@discussion adding a scriptmessagehandler adds a function

window.webkit.messagehandlers..postmessage() for all

frames.

*/- (void)addscriptmessagehandler:(id )scriptmessagehandler name:(nsstring *)name;

例項a中實現這個方法,它會從wkscriptmessage物件中拿到所有h5傳遞過來的資訊,你只要處理即可。

是不是用著很爽??????

但是這裡有個坑,一不小心就會造成記憶體洩露。

這裡webkit對你傳入的scriptmessagehandler是乙個強引用。當確定自己的webview不需要接受js訊息時(如自己的webview將要釋放),就要把scriptmessagehandler移除。方法很簡單:

與前面addscriptmessagehandler對應的,有乙個remove方法:

/*! @abstract removes a script message handler.

@param name the name of the message handler to remove.

*/- (void)removescriptmessagehandlerforname:(nsstring *)name;

呼叫即可。

WKWebView JS呼叫OC的方法

1.在wkwebview中oc和js互動也非常簡單,webkit的庫中有個 wkscriptmessagehandler就是專門來做互動的。wkscriptmessagehandler其實就是乙個遵循的協議,它能讓網頁通過js把訊息傳送給oc。其中協議方法。void usercontentcontr...

MediatR 程序內的訊息通訊框架

mediatr是一款程序內的訊息訂閱 發布框架,提供了send方法用於發布到單個處理程式 publish方法發布到多個處理程式,使用起來非常方便。目前支援 net framework4.5 net stardand1.3 net stardand2.0等版本,可跨平台使用。要在專案中使用mediat...

MediatR 程序內的訊息通訊框架

mediatr是一款程序內的訊息訂閱 發布框架,提供了send方法用於發布到單個處理程式 publish方法發布到多個處理程式,使用起來非常方便。目前支援 net framework4.5 net stardand1.3 net stardand2.0等版本,可跨平台使用。要在專案中使用mediat...