#author("2022-10-19T07:16:53+00:00","default:src128","src128") #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:{ }) } }} **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 } (以下省略) }}