- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2020-04-20T05:18:31+00:00","default:wikiwriter","wikiwriter")
#author("2022-10-19T07:17:11+00:00","default:src128","src128")
&tag(WKWebView);
*目次 [#l4917058]
#contents
*関連ページ [#q5a15af0]
*参考情報 [#r46145e6]
*基本 [#laee947f]
-iOSやmacOSで利用できるあらたなWeb Viewコンポーネント
-従来のUIWebViewと比較してクラッシュ率が低いらしい。
-ただし使用方法が結構異なるので注意が必要。
*Tips [#n092e4f7]
**キャッシュをクリアする [#eb29c891]
-SafariでうまくいってWKWebViewで上手くいかない場合キャッシュのせいかもしれない(CKEditorの高さが上手く調整できないとか)。
-手動でキャッシュをクリアする方法は不明。
-コードからは以下のようにしてクリアできる。
#pre{{
func clearCache() {
let websiteDataTypes = NSSet(array: [WKWebsiteDataTypeDiskCache, WKWebsiteDataTypeMemoryCache])
let date = Date(timeIntervalSince1970: 0)
WKWebsiteDataStore.default().removeData(ofTypes: websiteDataTypes as! Set<String>, modifiedSince: date, completionHandler:{ })
}
}}
**target="_blank"のリンクを開く [#m7500511]
**window.openやtarget="_blank"のリンクを開く [#m7500511]
-[[WKWebViewでtarget="_blank"なリンクが開かない時の対処法:https://qiita.com/ShingoFukuyama/items/b3a1441025a36ab7659c]]に解決策がある。
-UIWebViewの時と基本的な考え方は同じ。ようするにtarget="_blank"の場合新しくウィンドウを作成する必要があり、そのための処理を作り込む必要がある。
-WKNavigationDelegate のwebView(_:decidePolicyFor:decisionHandler:)を作成しその中で処理を行う。
-またはWKUIDelegateのwebView(_:createWebViewWith:for:windowFeatures:)を使用する。
-target="_blank"の場合webView(_:decidePolicyFor:decisionHandler:)が呼ばれるが、window.openの場合webView(_:createWebViewWith:for:windowFeatures:)しか呼ばれない。
-例えばckeditorを使っているアプリで、リンクを開きたい場合以下の処理が必要
#pre{{
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
guard let url = navigationAction.request.url else {
return nil
}
guard let targetFrame = navigationAction.targetFrame, targetFrame.isMainFrame else {
_ = parent.openLinkWithSafari(url: url)
return nil
}
return nil
}
}}
**SwiftUIで使う [#pd199d0f]
-AppKit/UIKitの場合とだいぶぶん同じ感覚でいけるが一部異なる。
-delegateの設定。Coordinatorを設定する。
#pre{{
func makeNSView(context: Context) -> WKWebView {
webView.navigationDelegate = context.coordinator
webView.uiDelegate = context.coordinator
loadServerUrl()
return webView
}
func makeCoordinator() -> Coordinator {
return Coordinator(self)
}
class Coordinator: NSObject, WKNavigationDelegate, WKUIDelegate {
let parent: WebView
}
(以下省略)
}}