WKWebView 클릭 동작 최적화

앱에서 iOS WKWebView 웹 콘텐츠를 표시하려면 다음과 같은 이유로 클릭 행동 최적화를 고려해 보세요.

  • WKWebView 하지 않음 탭 탐색 새 탭을 열려고 시도하는 광고 클릭은 기본값입니다.

  • 같은 탭에서 열리는 광고를 클릭하면 페이지가 새로고침됩니다. kubectl 명령어 WKWebView 외부에서 열리는 광고 클릭(예: H5를 호스팅하는 경우) 하고 싶은 경우 각 게임의 상태를 유지할 수 있습니다

  • 자동완성 기능은 WKWebView의 신용카드 정보를 지원하지 않습니다. 이로 인해 광고주의 전자상거래 전환 감소로 이어져 웹 콘텐츠의 수익 창출입니다.

  • Google 로그인 <ph type="x-smartling-placeholder"> 아니 에서 지원 WKWebView됩니다.

이 가이드에서는 모바일에서 클릭 동작을 최적화하기 위한 권장 단계를 안내합니다. 웹 뷰 콘텐츠를 보존합니다.

기본 요건

구현

광고 링크의 href 타겟 속성은 _blank, _top, _self 또는 _parent입니다. 광고 링크에는 window.open(url, "_blank")입니다.

다음 표에서는 이러한 각 링크가 웹 보기에서 작동하는 방식을 설명합니다.

대상 속성 href 기본 WKWebView 클릭 동작
target="_blank" 웹 보기에서 링크가 처리되지 않습니다.
target="_top" 기존 웹 보기에서 링크를 새로고침합니다.
target="_self" 기존 웹 보기에서 링크를 새로고침합니다.
target="_parent" 기존 웹 보기에서 링크를 새로고침합니다.
JavaScript 함수 기본 WKWebView 클릭 동작
window.open(url, "_blank") 웹 보기에서 링크가 처리되지 않습니다.

다음 단계에 따라 캠페인에서 클릭 행동을 WKWebView 인스턴스:

  1. WKWebView에서 WKUIDelegate 설정 인스턴스를 만들 수 있습니다

  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으로 재설정되지 않고 검증하기만 하면 됩니다.