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

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

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

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

  • قابلیت تکمیل خودکار (AutoFill) در 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 یا نمای وب موجود باز کنید. قطعه کد زیر نحوه باز کردن URLها را در حالت خارج از سایت با ارائه SFSafariViewController نشان می‌دهد.

مثال کد

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

سویفت

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? {
    // 3. Determine whether to optimize the behavior of the click URL.
    if didHandleClickBehavior(
        currentURL: webView.url,
        navigationAction: navigationAction) {
      print("URL opened in SFSafariViewController.")
    }

    return nil
  }

  // Implement the WKNavigationDelegate method.
  func webView(
      _ webView: WKWebView,
      decidePolicyFor navigationAction: WKNavigationAction,
      decisionHandler: @escaping (WKNavigationActionPolicy) -> Void)
  {
    // 3. Determine whether to optimize the behavior of the click URL.
    if didHandleClickBehavior(
        currentURL: webView.url,
        navigationAction: navigationAction) {
      return decisionHandler(.cancel)
    }

    decisionHandler(.allow)
  }

  // Implement a helper method to handle click behavior.
  func didHandleClickBehavior(
      currentURL: URL,
      navigationAction: WKNavigationAction) -> Bool {
    guard let targetURL = navigationAction.request.url else {
      return false
    }

    // Handle custom URL schemes such as itms-apps:// by attempting to
    // launch the corresponding application.
    if navigationAction.navigationType == .linkActivated {
      if let scheme = targetURL.scheme, !["http", "https"].contains(scheme) {
        UIApplication.shared.open(targetURL, options: [:], completionHandler: nil)
        return true
      }
    }

    guard let currentDomain = currentURL.host,
      let targetDomain = targetURL.host else {
      return false
    }

    // 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 == .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 {
      // 4. Open the URL in a SFSafariViewController.
      let safariViewController = SFSafariViewController(url: targetURL)
      present(safariViewController, animated: true)
      return true
    }

    return false
  }
}

هدف-سی

@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 {
  // 3. Determine whether to optimize the behavior of the click URL.
  if ([self didHandleClickBehaviorForCurrentURL: webView.URL
      navigationAction: navigationAction]) {
    NSLog(@"URL opened in SFSafariViewController.");
  }

  return nil;
}

// Implement the WKNavigationDelegate method.
- (void)webView:(WKWebView *)webView
    decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction
                    decisionHandler:
                        (void (^)(WKNavigationActionPolicy))decisionHandler {
  // 3. Determine whether to optimize the behavior of the click URL.
  if ([self didHandleClickBehaviorForCurrentURL: webView.URL
      navigationAction: navigationAction]) {
    decisionHandler(WKNavigationActionPolicyCancel);
    return;
  }

  decisionHandler(WKNavigationActionPolicyAllow);
}

// Implement a helper method to handle click behavior.
- (BOOL)didHandleClickBehaviorForCurrentURL:(NSURL *)currentURL
                    navigationAction:(WKNavigationAction *)navigationAction {
  NSURL *targetURL = navigationAction.request.URL;

  // Handle custom URL schemes such as itms-apps:// by attempting to
  // launch the corresponding application.
  if (navigationAction.navigationType == WKNavigationTypeLinkActivated) {
    NSString *scheme = targetURL.scheme;
    if (![scheme isEqualToString:@"http"] && ![scheme isEqualToString:@"https"]) {
      [UIApplication.sharedApplication openURL:targetURL options:@{} completionHandler:nil];
      return YES;
    }
  }

  NSString *currentDomain = currentURL.host;
  NSString *targetDomain = targetURL.host;

  if (!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:targetURL];
    [self presentViewController:safariViewController animated:YES
        completion:nil];
    return YES;
  }

  return NO;
}

پیمایش صفحه خود را آزمایش کنید

برای آزمایش تغییرات ناوبری صفحه، موارد زیر را بارگذاری کنید:

https://google.github.io/webview-ads/test/#click-behavior-tests

به نمای وب خود. روی هر یک از انواع مختلف پیوند کلیک کنید تا ببینید چگونه در برنامه شما رفتار می‌کنند.

در اینجا مواردی برای بررسی وجود دارد:

  • هر لینک، آدرس اینترنتی (URL) مورد نظر را باز می‌کند.
  • هنگام بازگشت به برنامه، شمارنده صفحه آزمایشی برای تأیید حفظ وضعیت صفحه، به صفر بازنشانی نمی‌شود.