最佳化 WKWebView 點擊行為

如果您的應用程式 iOS 使用 WKWebView 來顯示網路內容 考慮最佳化點擊行為的原因如下:

  • WKWebView 不會 支援 分頁瀏覽。試圖開啟新分頁的廣告點擊沒有任何作用 預設值。

  • 在同一個分頁中開啟的廣告點擊,請重新載入網頁。您可能會想 要在 WKWebView 以外開啟的廣告點擊 (舉例來說,如果您代管 H5) 遊戲 維持每個遊戲的狀態

  • 自動填入功能不支援WKWebView中的信用卡資訊。這麼做 廣告主的電子商務轉換次數減少,對 提高網路內容的收益

本指南提供建議的步驟,協助您改善行動裝置上的點擊行為 網頁檢視,同時保留網頁檢視內容。

必要條件

  • 完成「設定網頁檢視畫面」 指南。

導入作業

廣告連結「href」目標屬性可設為「_blank」、「_top」、 _self_parent。 此外,廣告連結也可以包含各種 JavaScript 函式,例如 window.open(url, "_blank")

下表說明這些連結在網頁檢視畫面中的行為。

href 個目標屬性 預設WKWebView點擊行為
target="_blank" 網頁檢視畫面未處理連結。
target="_top" 在現有的 Web 檢視畫面中重新載入連結。
target="_self" 在現有的 Web 檢視畫面中重新載入連結。
target="_parent" 在現有的 Web 檢視畫面中重新載入連結。
JavaScript 函式 預設WKWebView點擊行為
window.open(url, "_blank") 網頁檢視畫面未處理連結。

請按照下列步驟,將網站上的點擊行為最佳化 WKWebView 執行個體:

  1. 在您的 WKWebView 上設定 WKUIDelegate 執行個體。

  2. 在您的 WKNavigationDelegateWKWebView 執行個體。

    ,瞭解如何調查及移除這項存取權。
  3. 決定是否要改善點擊網址的行為。

    • 檢查是否已啟用 navigationType 屬性 WKNavigationAction 物件是 按一下您要最佳化的點擊類型程式碼片段會檢查 客戶:.linkActivated 這項屬性僅適用於含有 href 屬性的連結點擊次數。

    • 查看 targetFrame WKNavigationAction 物件的另一個屬性。如果傳回 nil,則表示 導覽目標為新視窗。因為 WKWebView 無法處理 這類點擊必須手動處理

  4. 決定是否要在外部瀏覽器中開啟網址、 SFSafariViewController、 或現有的 Web 檢視畫面程式碼片段顯示如何開啟使用者瀏覽的頁面 顯示 SFSafariViewController

程式碼範例

下列程式碼片段說明如何最佳化網頁瀏覽點擊行為。阿斯 舉例來說,這項工具會檢查目前的網域是否和目標網域不同。 這只是一種方法,因為您使用的條件各有不同。

Swift

import GoogleMobileAds
import SafariServices
import WebKit

class ViewController: UIViewController, WKNavigationDelegate, WKUIDelegate {

  override func viewDidLoad() {
    super.viewDidLoad()

    // ... Register the WKWebView.

    // 1. Set the WKUIDelegate on your WKWebView instance.
    webView.uiDelegate = self;
    // 2. Set the WKNavigationDelegate on your WKWebView instance.
    webView.navigationDelegate = self
  }

  // Implement the WKUIDelegate method.
  func webView(
      _ webView: WKWebView,
      createWebViewWith configuration: WKWebViewConfiguration,
      for navigationAction: WKNavigationAction,
      windowFeatures: WKWindowFeatures) -> WKWebView? {
    guard let url = navigationAction.request.url,
        let currentDomain = webView.url?.host,
        let targetDomain = url.host else { return nil }

    // 3. Determine whether to optimize the behavior of the click URL.
    if didHandleClickBehavior(
        url: url,
        currentDomain: currentDomain,
        targetDomain: targetDomain,
        navigationAction: navigationAction) {
      print("URL opened in SFSafariViewController.")
    }

    return nil
  }

  // Implement the WKNavigationDelegate method.
  func webView(
      _ webView: WKWebView,
      decidePolicyFor navigationAction: WKNavigationAction,
      decisionHandler: @escaping (WKNavigationActionPolicy) -> Void)
  {
    guard let url = navigationAction.request.url,
        let currentDomain = webView.url?.host,
        let targetDomain = url.host else { return decisionHandler(.cancel) }

    // 3. Determine whether to optimize the behavior of the click URL.
    if didHandleClickBehavior(
        url: url,
        currentDomain: currentDomain,
        targetDomain: targetDomain,
        navigationAction: navigationAction) {
      return decisionHandler(.cancel)
    }

    decisionHandler(.allow)
  }

  // Implement a helper method to handle click behavior.
  func didHandleClickBehavior(
      url: URL,
      currentDomain: String,
      targetDomain: String,
      navigationAction: WKNavigationAction) -> Bool {
    // Check if the navigationType is a link with an href attribute or
    // if the target of the navigation is a new window.
    guard navigationAction.navigationType == .linkActivated ||
      navigationAction.targetFrame == nil,
      // If the current domain does not equal the target domain,
      // the assumption is the user is navigating away from the site.
      currentDomain != targetDomain else { return false }

    // 4.  Open the URL in a SFSafariViewController.
    let safariViewController = SFSafariViewController(url: url)
    present(safariViewController, animated: true)
    return true
  }
}

Objective-C

@import GoogleMobileAds;
@import SafariServices;
@import WebKit;

@interface ViewController () <WKNavigationDelegate, WKUIDelegate>

@property(nonatomic, strong) WKWebView *webView;

@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];

  // ... Register the WKWebView.

  // 1. Set the WKUIDelegate on your WKWebView instance.
  self.webView.uiDelegate = self;
  // 2. Set the WKNavigationDelegate on your WKWebView instance.
  self.webView.navigationDelegate = self;
}

// Implement the WKUIDelegate method.
- (WKWebView *)webView:(WKWebView *)webView
  createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration
             forNavigationAction:(WKNavigationAction *)navigationAction
                  windowFeatures:(WKWindowFeatures *)windowFeatures {
  NSURL *url = navigationAction.request.URL;
  NSString *currentDomain = webView.URL.host;
  NSString *targetDomain = navigationAction.request.URL.host;

  // 3. Determine whether to optimize the behavior of the click URL.
  if ([self didHandleClickBehaviorForURL: url
      currentDomain: currentDomain
      targetDomain: targetDomain
      navigationAction: navigationAction]) {
    NSLog(@"URL opened in SFSafariViewController.");
  }

  return nil;
}

// Implement the WKNavigationDelegate method.
- (void)webView:(WKWebView *)webView
    decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction
                    decisionHandler:
                        (void (^)(WKNavigationActionPolicy))decisionHandler {
  NSURL *url = navigationAction.request.URL;
  NSString *currentDomain = webView.URL.host;
  NSString *targetDomain = navigationAction.request.URL.host;

  // 3. Determine whether to optimize the behavior of the click URL.
  if ([self didHandleClickBehaviorForURL: url
      currentDomain: currentDomain
      targetDomain: targetDomain
      navigationAction: navigationAction]) {

    decisionHandler(WKNavigationActionPolicyCancel);
    return;
  }

  decisionHandler(WKNavigationActionPolicyAllow);
}

// Implement a helper method to handle click behavior.
- (BOOL)didHandleClickBehaviorForURL:(NSURL *)url
                       currentDomain:(NSString *)currentDomain
                        targetDomain:(NSString *)targetDomain
                    navigationAction:(WKNavigationAction *)navigationAction {
  if (!url || !currentDomain || !targetDomain) {
    return NO;
  }

  // Check if the navigationType is a link with an href attribute or
  // if the target of the navigation is a new window.
  if ((navigationAction.navigationType == WKNavigationTypeLinkActivated
      || !navigationAction.targetFrame)
      // If the current domain does not equal the target domain,
      // the assumption is the user is navigating away from the site.
      && ![currentDomain isEqualToString: targetDomain]) {

     // 4.  Open the URL in a SFSafariViewController.
    SFSafariViewController *safariViewController =
        [[SFSafariViewController alloc] initWithURL:url];
    [self presentViewController:safariViewController animated:YES
        completion:nil];
    return YES;
  }

  return NO;
}

測試網頁瀏覽

如要測試網頁導覽變更,請載入

https://webview-api-for-ads-test.glitch.me#click-behavior-tests

顯示在網頁檢視畫面中按一下各種連結類型,即可瞭解連結方式 在應用程式中的行為。

建議您確認以下事項:

  • 每個連結都會開啟目標網址。
  • 返回應用程式時,測試頁面的計數器不會重設為零至 並確認網頁狀態是否已保留。