رفتار کلیک WKWebView را بهینه کنید

اگر برنامه iOS شماWKWebView برای نمایش محتوای وب استفاده می کند، ممکن است بخواهید به دلایل زیر رفتار کلیک را بهینه کنید:

  • WKWebView از مرور زبانه ای . کلیک‌های تبلیغاتی که سعی در باز کردن یک برگه جدید دارند به‌طور پیش‌فرض هیچ کاری انجام نمی‌دهند.

  • کلیک‌های تبلیغاتی که در همان برگه باز می‌شوند، صفحه را بارگیری مجدد می‌کنند. ممکن است بخواهید کلیک‌های تبلیغاتی را مجبور کنید که خارج از WKWebView باز شوند، برای مثال اگر میزبان بازی‌های H5 هستید و می‌خواهید وضعیت هر بازی را حفظ کنید.

  • تکمیل خودکار اطلاعات کارت اعتباری را در WKWebView پشتیبانی نمی کند. این می تواند منجر به تبدیل تجارت الکترونیک کمتر برای تبلیغ کنندگان شود و بر درآمدزایی محتوای وب تأثیر منفی بگذارد.

این راهنما مراحل توصیه شده را برای بهینه‌سازی رفتار کلیک در نمایش‌های وب تلفن همراه با حفظ محتوای نمای وب ارائه می‌کند.

پیش نیازها

پیاده سازی

پیوندهای تبلیغاتی می‌توانند ویژگی href target را روی _blank ، _top ، _self یا _parent تنظیم کنند.همچنین می توانند شامل توابع جاوا اسکریپت مانند window.open(url, "_blank") باشند.

جدول زیر نحوه عملکرد هر یک از این پیوندها را در یک نمای وب توضیح می دهد.

ویژگی هدف href رفتار کلیکی پیش فرض WKWebView
target="_blank" پیوند توسط نمای وب مدیریت نمی شود .
target="_top" بارگیری مجدد پیوند در نمای وب موجود.
target="_self" بارگیری مجدد پیوند در نمای وب موجود.
target="_parent" بارگیری مجدد پیوند در نمای وب موجود.
تابع جاوا اسکریپت رفتار کلیکی پیش فرض 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 یا نمای وب موجود باز کنید. قطعه کد نشان می دهد که چگونه با ارائه یک SFSafariViewController URL هایی را که از سایت دور می شوند باز کنید.

نمونه کد

قطعه کد زیر نحوه بهینه سازی رفتار کلیک در نمای وب را نشان می دهد. به عنوان مثال، بررسی می کند که آیا دامنه فعلی با دامنه هدف متفاوت است یا خیر. این فقط یک رویکرد است زیرا معیارهایی که استفاده می کنید ممکن است متفاوت باشد.

سریع

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

هدف-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 مورد نظر را باز می کند.
  • هنگام بازگشت به برنامه، شمارنده صفحه آزمایشی به صفر نمی رسد تا وضعیت صفحه حفظ شود.