Se la tua iOS app utilizza
WKWebView
per visualizzare contenuti web, potresti voler
Prendi in considerazione l'ottimizzazione del comportamento dei clic per i seguenti motivi:
WKWebView
non supportano la la navigazione a schede. I clic sugli annunci che tentano di aprire una nuova scheda non generano alcun effetto. predefinito.
I clic sugli annunci che si aprono nella stessa scheda ricaricano la pagina. Potresti voler forzare clic sugli annunci per aprirsi all'esterno di
WKWebView
, ad esempio se ospiti H5 giochi e vuoi mantenere lo stato di ogni gioco.La compilazione automatica non supporta i dati della carta di credito in
WKWebView
. Questo potrebbe riducono le conversioni e-commerce per gli inserzionisti, con ripercussioni negative sul monetizzazione dei contenuti web.
- Accedi con Google
non è
supportato in
WKWebView
.
Questa guida fornisce i passaggi consigliati per ottimizzare il comportamento dei clic sui dispositivi mobili visualizzazioni web conservando i contenuti della visualizzazione web.
Prerequisiti
- Completa la procedura Configurare la vista web. guida.
Implementazione
I link degli annunci possono avere l'attributo target href
impostato su _blank
, _top
_self
o _parent
.
I link agli annunci possono contenere anche funzioni JavaScript come
window.open(url, "_blank")
.
Nella tabella seguente viene descritto il comportamento di ciascuno di questi link in una visualizzazione web.
Attributo target href |
Comportamento predefinito dei clic di WKWebView |
---|---|
target="_blank" |
Link non gestito dalla vista web. |
target="_top" |
Ricarica il link nella visualizzazione web esistente. |
target="_self" |
Ricarica il link nella visualizzazione web esistente. |
target="_parent" |
Ricarica il link nella visualizzazione web esistente. |
Funzione JavaScript | Comportamento predefinito dei clic di WKWebView |
window.open(url, "_blank") |
Link non gestito dalla vista web. |
Per ottimizzare il comportamento dei clic nel tuo
WKWebView
istanza:
Imposta la
WKUIDelegate
suWKWebView
in esecuzione in un'istanza Compute Engine.- Implementa
webView(_:createWebViewWith:for:windowFeatures:)
.
- Implementa
Imposta la
WKNavigationDelegate
sullaWKWebView
istanza.- Implementa
webView(_:decidePolicyFor:decisionHandler:)
.
- Implementa
Determina se ottimizzare il comportamento dell'URL di clic.
Controllare se la proprietà
navigationType
è attiva l'oggettoWKNavigationAction
è un tipo di clic da ottimizzare. Lo snippet di codice controlla per.linkActivated
che si applica solo ai clic su un link con un attributohref
.Controlla il
targetFrame
sull'oggettoWKNavigationAction
. Se restituiscenil
, significa che la destinazione della navigazione è una nuova finestra. PoichéWKWebView
non può gestire quel clic, questi clic devono essere gestiti manualmente.
Decidi se aprire l'URL in un browser esterno
SFSafariViewController
, o la vista web esistente. Lo snippet di codice mostra come aprire gli URL per uscire dalla pagina dal sito presentando unSFSafariViewController
.
Esempio di codice
Il seguente snippet di codice mostra come ottimizzare il comportamento dei clic nella vista web. Come un esempio, la verifica controlla se il dominio corrente è diverso dal dominio di destinazione. Questo è solo un approccio, in quanto i criteri da utilizzare potrebbero variare.
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;
}
Testare la navigazione nelle pagine
Per testare le modifiche alla navigazione nelle pagine, carica
https://webview-api-for-ads-test.glitch.me#click-behavior-tests
nella tua vista web. Fai clic su ciascuno dei diversi tipi di link per vederne comportarsi nella tua app.
Ecco alcuni aspetti da controllare:
- Ogni link apre l'URL previsto.
- Quando torni all'app, il contatore della pagina di test non viene reimpostato su zero su verificare che lo stato della pagina sia stato conservato.