#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
    }

(以下省略)
}}

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS