iT邦幫忙

2021 iThome 鐵人賽

DAY 21
0
Mobile Development

轉職App開發打怪雜記系列 第 21

Webview問題集(上)-另開分頁

緣由:

WKWebkit是APP開發中非常常用的元件,但常常會有一些不是很順利的疑難雜症,
只能一直查資料,這邊我有做了一些小筆記,提醒自己下次遇到的時候不要再犯一樣的錯誤,
希望也能幫上一樣遇到相同問題的人,這邊會單就網頁需要另開分頁時會遇上的問題來說~
網頁另開分頁有兩種方法
一種為HTML5的target="_blank"
另一種為JS的window.open('')
若不另外設定,則我們將打不開此頁面(無反應),以下是分別的解決辦法~

解決方法:

第一種是target="_blank"開啟分頁的解法
這個方法的解釋是這樣的,當網頁跳轉遇到target="_blank"(targetFrame == nil)時,停止預設行為,直接在原頁開啟

 func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
       // 若 target="_blank",targetFrame 會 = nil
       if navigationAction.targetFrame == nil {
           // 傳入 .cancel 停止 navigation 預設的行為
           decisionHandler(.cancel)
           webView.load(navigationAction.request)
           return
       }
       //.allow 則是預設的行為
       decisionHandler(.allow)
    }

第二種window.open開啟分頁的解法
window.open是js新開頁面的一種方法,會用新開視窗的方法去完成載入頁面,WKWebView假如沒有處理,點擊後也一樣會沒反應,所以需要在WKUIDelegate代理中的createWebViewWith新開一個WebView,當targetFrame == niltargetFrame?.isMainFrame == nil時,處理return nil,這裡return nil是不開新的webview,而就在原頁加載

 func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
        if navigationAction.targetFrame == nil || navigationAction.targetFrame?.isMainFrame == nil {
            webView.load(navigationAction.request)
        }

        return nil
    }

以上就可以解決WebView跳轉URL時,遇到需要另開新分頁的狀況~~


上一篇
接API
下一篇
Webview問題集(下)-常用功能
系列文
轉職App開發打怪雜記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言