เพิ่มประสิทธิภาพพฤติกรรมการคลิก WKWebView

หาก iOS แอปของคุณใช้ WKWebView เพื่อแสดงเนื้อหาเว็บ คุณอาจต้องการ พิจารณาเพิ่มประสิทธิภาพพฤติกรรมการคลิกด้วยเหตุผลต่อไปนี้

  • WKWebView ไม่ได้ รองรับ การเรียกดูแบบแท็บ การคลิกโฆษณาที่พยายามเปิดแท็บใหม่จะไม่ดำเนินการใดๆ "ค่าเริ่มต้น"

  • การคลิกโฆษณาที่เปิดในแท็บเดียวกันจะโหลดหน้าเว็บซ้ำ คุณอาจต้องบังคับใช้ การคลิกโฆษณาเพื่อเปิดนอก WKWebView เช่น หากคุณโฮสต์ H5 เกมและต้องการที่จะ รักษาสถานะของแต่ละเกม

  • การป้อนอัตโนมัติไม่สนับสนุนข้อมูลบัตรเครดิตใน WKWebView การดำเนินการนี้อาจ ทําให้ผู้ลงโฆษณามี Conversion ของอีคอมเมิร์ซน้อยลง และส่งผลเสียต่อ การสร้างรายได้ของเนื้อหาเว็บ

คู่มือนี้แสดงขั้นตอนที่แนะนำในการเพิ่มประสิทธิภาพพฤติกรรมการคลิกในอุปกรณ์เคลื่อนที่ เว็บในขณะที่คงเนื้อหาของมุมมองเว็บไว้

ข้อกำหนดเบื้องต้น

การใช้งาน

ลิงก์โฆษณาอาจตั้งค่าแอตทริบิวต์เป้าหมาย href เป็น _blank, _top, _self หรือ _parent เมื่อใช้ Ad Manager คุณจะควบคุมแอตทริบิวต์เป้าหมายเป็น _blank หรือ _top ได้ โดยการตั้งค่าโฆษณาให้เปิดในแท็บใหม่ หรือ ชั่วคราว ลิงก์โฆษณายังมีฟังก์ชัน JavaScript เช่น window.open(url, "_blank")

ตารางต่อไปนี้อธิบายการทำงานของแต่ละลิงก์ในมุมมองเว็บ

แอตทริบิวต์เป้าหมาย href รายการ พฤติกรรมการคลิก WKWebView เริ่มต้น
target="_blank" ลิงก์ไม่ได้จัดการโดยข้อมูลพร็อพเพอร์ตี้เว็บ
target="_top" โหลดลิงก์ซ้ำในมุมมองเว็บที่มีอยู่
target="_self" โหลดลิงก์ซ้ำในมุมมองเว็บที่มีอยู่
target="_parent" โหลดลิงก์ซ้ำในมุมมองเว็บที่มีอยู่
ฟังก์ชัน JavaScript พฤติกรรมการคลิก WKWebView เริ่มต้น
window.open(url, "_blank") ลิงก์ไม่ได้จัดการโดยข้อมูลพร็อพเพอร์ตี้เว็บ

ทำตามขั้นตอนต่อไปนี้เพื่อเพิ่มประสิทธิภาพพฤติกรรมการคลิกใน WKWebView อินสแตนซ์:

  1. ตั้งค่า WKUIDelegate ใน WKWebView ของคุณ อินสแตนซ์

  2. ตั้งค่า WKNavigationDelegate ใน WKWebView

  3. พิจารณาว่าจะเพิ่มประสิทธิภาพพฤติกรรมของ URL การคลิกหรือไม่

    • ตรวจสอบว่าพร็อพเพอร์ตี้ navigationType เปิดอยู่หรือไม่ ออบเจ็กต์ WKNavigationAction คือ ประเภทคลิกที่ต้องการเพิ่มประสิทธิภาพ การตรวจสอบข้อมูลโค้ด สำหรับ .linkActivated ซึ่งจะมีผลกับการคลิกลิงก์ที่มีแอตทริบิวต์ href เท่านั้น

    • ดูtargetFrame ในออบเจ็กต์ WKNavigationAction หากแสดงผล nil หมายความว่า เป้าหมายของการนำทางคือหน้าต่างใหม่ เนื่องจาก WKWebView จัดการไม่ได้ ที่คลิกนั้น คุณจะต้องจัดการคลิกเหล่านี้ด้วยตนเอง

  4. ตัดสินใจว่าจะเปิด URL ในเบราว์เซอร์ภายนอกหรือไม่ SFSafariViewController หรือมุมมองเว็บที่มีอยู่ ข้อมูลโค้ดแสดงวิธีเปิด URL ที่ออกจากหน้าไป จากเว็บไซต์ด้วยการนำเสนอ 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

ลงในมุมมองเว็บ คลิกลิงก์แต่ละประเภทเพื่อดูว่าลิงก์เหล่านั้นเป็นอย่างไร ทำงานในแอป

โปรดตรวจสอบสิ่งต่อไปนี้

  • แต่ละลิงก์จะเปิด URL ที่ต้องการ
  • เมื่อกลับไปยังแอปพลิเคชัน ตัวนับของหน้าทดสอบจะไม่รีเซ็ตเป็น 0 เป็น ตรวจสอบว่าสถานะหน้าเว็บยังคงอยู่