اگر برنامهتان از
WKWebView برای نمایش محتوای وب استفاده میکند، شاید بخواهید
بهینهسازی رفتار کلیک را بهدلایل زیر درنظر بگیرید:
-
WKWebViewاز مرور زبانهای پشتیبانی نمیکند. کلیکهای آگهی که تلاش میکنند زبانه جدیدی باز کنند بهطور پیشفرض کاری انجام نمیدهند.
کلیکهای آگهی که در همان برگه باز میشوند، صفحه را مجدداً بار میکنند. ممکن است بخواهید کلیکهای آگهی را مجبور کنید تا خارج از
WKWebViewباز شوند، برای مثال اگر میزبان بازیهای H5 هستید و میخواهید وضعیت هر بازی را حفظ کنید.«تکمیل خودکار» از اطلاعات کارت اعتباری در
WKWebViewپشتیبانی نمیکند. این امر میتواند به تبدیلهای تجارت الکترونیک کمتری برای آگهیدهندگان منجر شود و بر درآمدزایی محتوای وب تأثیر منفی بگذارد.
- ورود به سیستم با Google
در
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، این مراحل را دنبال کنید:
WKUIDelegateرا در نمونهWKWebViewخود تنظیم کنید.webView(_:createWebViewWith:for:windowFeatures:)را پیادهسازی کنید.
WKNavigationDelegateرا در نمونهWKWebViewخود تنظیم کنید.webView(_:decidePolicyFor:decisionHandler:)را پیادهسازی کنید.
تعیین کنید که آیا رفتار نشانی وب کلیک بهینهسازی شود یا نه.
بررسی کنید که آیا ویژگی
navigationTypeدر شیءWKNavigationActionاز نوع کلیکی است که میخواهید بهینهسازی کنید. نمونه کد.linkActivatedرا بررسی میکند که فقط برای کلیک روی پیوند با مشخصهhrefاعمال میشود.خصوصیت
targetFrameرا در شیءWKNavigationActionبررسی کنید. اگرnilرا برگرداند، یعنی هدف پیمایش پنجره جدیدی است. چونWKWebViewنمیتواند آن کلیک را مدیریت کند، این کلیکها باید بهصورت دستی مدیریت شوند.
تصمیم بگیرید که نشانی وب در مرورگر خارجی،
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
به نمای وب شما. روی هریک از انواع مختلف پیوند کلیک کنید تا ببینید در برنامهتان چگونه عمل میکنند.
موارد زیر را بررسی کنید:
- هر پیوند نشانی وب موردنظر را باز میکند.
- هنگام بازگشت به برنامه، شمارنده صفحه آزمایشی به صفر بازنشانی نمیشود تا تأیید شود که وضعیت صفحه حفظ شده است.