Если ваше приложение использует WKWebView
для отображения веб-контента, вам может потребоваться оптимизация поведения при нажатии по следующим причинам:
-
WKWebView
не поддерживает просмотр вкладок. Клики по рекламе, которые пытаются открыть новую вкладку, по умолчанию ничего не делают.
Клики по рекламе, которые открываются в той же вкладке, перезагружают страницу. Вы можете захотеть принудительно открыть клики по рекламе за пределами
WKWebView
, например, если вы размещаете игры H5 и хотите сохранить состояние каждой игры.AutoFill не поддерживает информацию о кредитных картах в
WKWebView
. Это может привести к снижению конверсий электронной коммерции для рекламодателей, что негативно скажется на монетизации веб-контента.
- Вход через Google не поддерживается в
WKWebView
.
В этом руководстве приведены рекомендуемые шаги по оптимизации поведения при нажатии в мобильных веб-представлениях с сохранением содержимого веб-представления.
Предпосылки
- Выполните руководство по настройке веб-просмотра .
Выполнение
Рекламные ссылки могут иметь атрибут href
target, установленный на _blank
, _top
, _self
или _parent
. Рекламные ссылки также могут содержать функции JavaScript, такие как window.open(url, "_blank")
.
В следующей таблице описано, как каждая из этих ссылок ведет себя в веб-просмотре.
атрибут цели href | Поведение щелчка WKWebView по умолчанию |
---|---|
target="_blank" | Ссылка не обрабатывается веб-представлением. |
target="_top" | Обновить ссылку в существующем веб-представлении. |
target="_self" | Обновить ссылку в существующем веб-представлении. |
target="_parent" | Обновить ссылку в существующем веб-представлении. |
Функция JavaScript | Поведение щелчка 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
или существующем веб-представлении. Фрагмент кода показывает, как открывать 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? {
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-адрес.
- При возврате в приложение счетчик тестовой страницы не сбрасывается на ноль для проверки сохранения состояния страницы.