اگر برنامه شما از WKWebView برای نمایش محتوای وب استفاده می کند، ممکن است بخواهید به دلایل زیر رفتار کلیک را بهینه کنید:
- WKWebView از مرور زبانهها پشتیبانی نمیکند. کلیکهای تبلیغاتی که سعی در باز کردن یک برگه جدید دارند بهطور پیشفرض هیچ کاری انجام نمیدهند.
- کلیکهای تبلیغاتی که در همان برگه باز میشوند، صفحه را بارگیری مجدد میکنند. ممکن است بخواهید کلیکهای تبلیغاتی را مجبور کنید که خارج از - WKWebViewباز شوند، برای مثال اگر میزبان بازیهای H5 هستید و میخواهید وضعیت هر بازی را حفظ کنید.
- تکمیل خودکار اطلاعات کارت اعتباری را در - WKWebViewپشتیبانی نمی کند. این می تواند منجر به تبدیل تجارت الکترونیک کمتر برای تبلیغ کنندگان شود و بر درآمدزایی محتوای وب تأثیر منفی بگذارد.
-  ورود به سیستم Google در WKWebViewپشتیبانی نمیشود.
این راهنما مراحل توصیه شده را برای بهینهسازی رفتار کلیک در نمایشهای وب تلفن همراه با حفظ محتوای نمای وب ارائه میکند.
پیش نیازها
- راهنمای تنظیم نمای وب را کامل کنید.
پیاده سازی
 پیوندهای تبلیغاتی میتوانند ویژگی href target را روی _blank ، _top ، _self یا _parent تنظیم کنند. با Ad Manager می توانید با تنظیم تبلیغات برای باز شدن در یک برگه یا پنجره جدید، ویژگی هدف را کنترل کنید که _blank یا _top باشد. پیوندهای تبلیغاتی همچنین می توانند شامل توابع جاوا اسکریپت مانند window.open(url, "_blank") باشند.
جدول زیر نحوه عملکرد هر یک از این پیوندها را در یک نمای وب توضیح می دهد.
| ویژگی هدف href | رفتار کلیکی پیش فرض WKWebView | 
|---|---|
| target="_blank" | پیوند توسط نمای وب مدیریت نمی شود . | 
| target="_top" | بارگیری مجدد پیوند در نمای وب موجود. | 
| target="_self" | بارگیری مجدد پیوند در نمای وب موجود. | 
| target="_parent" | بارگیری مجدد پیوند در نمای وب موجود. | 
| تابع جاوا اسکریپت | رفتار کلیکی پیش فرض WKWebView | 
| window.open(url, "_blank") | پیوند توسط نمای وب مدیریت نمی شود . | 
 این مراحل را برای بهینه سازی رفتار کلیک در نمونه WKWebView دنبال کنید:
- WKUIDelegateرا در نمونه- WKWebViewخود تنظیم کنید.-  webView(_:createWebViewWith:for:windowFeatures:)پیاده سازی کنید.
 
-  
- WKNavigationDelegateرا روی نمونه- WKWebViewخود تنظیم کنید.-  webView(_:decidePolicyFor:decisionHandler:)پیاده سازی کنید.
 
-  
- تعیین کنید که آیا رفتار URL کلیک را بهینه کنید. - بررسی کنید که آیا ویژگی - navigationTypeدر شیء- WKNavigationActionیک نوع کلیک است که می خواهید بهینه سازی کنید. مثال کد- .linkActivatedرا بررسی می کند که فقط برای کلیک روی پیوندی با ویژگی- hrefاعمال می شود.
- ویژگی - targetFrameرا در شیء- WKNavigationActionبررسی کنید. اگر- nilبرگرداند، به این معنی است که هدف پیمایش یک پنجره جدید است. از آنجایی که- WKWebViewنمی تواند آن کلیک را مدیریت کند، این کلیک ها باید به صورت دستی انجام شوند.
 
- تصمیم بگیرید که آیا 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? {
    // 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
  }
}
هدف-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 {
  // 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 مورد نظر را باز می کند.
- هنگام بازگشت به برنامه، شمارنده صفحه آزمایشی به صفر نمی رسد تا وضعیت صفحه حفظ شود.