بهینه‌سازی عملکرد کلیک

پلاتفرم را انتخاب کنید: Android iOS Android (قدیمی)

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

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

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

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

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

پیش‌نیازها

پیاده‌سازی

پیوندهای آگهی می‌توانند مشخصه هدف href را روی _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. تعیین کنید که آیا رفتار نشانی وب کلیک بهینه‌سازی شود یا نه.

    • بررسی کنید که آیا ویژگی navigationType در شیء WKNavigationAction از نوع کلیکی است که می‌خواهید بهینه‌سازی کنید. نمونه کد .linkActivated را بررسی می‌کند که فقط برای کلیک روی پیوند با مشخصه href اعمال می‌شود.

    • خصوصیت targetFrame را در شیء WKNavigationAction بررسی کنید. اگر nil را برگرداند، یعنی هدف پیمایش پنجره جدیدی است. چون WKWebView نمی‌تواند آن کلیک را مدیریت کند، این کلیک‌ها باید به‌صورت دستی مدیریت شوند.

  4. تصمیم بگیرید که نشانی وب در مرورگر خارجی، SFSafariViewController، یا نمای وب موجود باز شود. این تکه‌کد نشان می‌دهد که چگونه می‌توان نشانی‌های وب را که از سایت خارج می‌شوند با ارائه 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? {
    // 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

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

موارد زیر را بررسی کنید:

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