رفتار کلیکی WebView را بهینه کنید

اگر برنامه Android شماWebView برای نمایش محتوای وب استفاده می کند، ممکن است بخواهید به دلایل زیر رفتار کلیک را بهینه کنید:

  • WebView از مرور زبانه ای پشتیبانی نمی کند. با کلیک روی یک پیوند، محتوا در مرورگر وب پیش‌فرض باز می‌شود. مرور زبانه‌دار
  • WebView از طرح‌های URL سفارشی پشتیبانی نمی‌کند که اگر مقصد کلیک در یک برنامه جداگانه باشد، می‌توانند در تبلیغات بازگردانده شوند. برای مثال، یک URL کلیکی در Google Play ممکن است از market:// استفاده کند.

این راهنما مراحل توصیه شده را برای بهینه‌سازی رفتار کلیک در نمایش‌های وب تلفن همراه با حفظ محتوای نمای وب ارائه می‌کند.

پیش نیازها

پیاده سازی

این مراحل را برای بهینه سازی رفتار کلیک در نمونهWebView دنبال کنید:

  1. shouldOverrideUrlLoading() در WebViewClient لغو کنید. این روش زمانی فراخوانی می شود که یک URL در حال بارگیری در WebView فعلی باشد.

  2. تعیین کنید که آیا رفتار URL کلیک را لغو کنید یا خیر.

    قطعه کد زیر بررسی می کند که آیا دامنه فعلی با دامنه هدف متفاوت است یا خیر. این فقط یک رویکرد است زیرا معیارهایی که استفاده می کنید ممکن است متفاوت باشد.

  3. تصمیم بگیرید که آیا URL را در یک مرورگر خارجی، برگه‌های سفارشی Android ، یا در نمای وب موجود باز کنید. این راهنما نشان می‌دهد که چگونه با راه‌اندازی تب‌های سفارشی Android، URLهایی را که از سایت دور می‌شوند باز کنید.

نمونه کد

ابتدا وابستگی androidx.browser را به فایل build.gradle سطح ماژول خود، معمولا app/build.gradle اضافه کنید. این برای برگه های سفارشی مورد نیاز است:

dependencies {
  implementation 'androidx.browser:browser:1.5.0'
}

قطعه کد زیر نحوه پیاده سازی shouldOverrideUrlLoading() نشان می دهد:

جاوا

public class MainActivity extends AppCompatActivity {

  private WebView webView;

  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // ... Register the WebView.

    webView = new WebView(this);
    WebSettings webSettings = webView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    webView.setWebViewClient(
        new WebViewClient() {
          // 1. Implement the web view click handler.
          @Override
          public boolean shouldOverrideUrlLoading(
              WebView view,
              WebResourceRequest request) {
            // 2. Determine whether to override the behavior of the URL.
            // If the target URL has no host, return early.
            if (request.getUrl().getHost() == null) {
              return false;
            }

            // Handle custom URL schemes such as market:// by attempting to
            // launch the corresponding application in a new intent.
            if (!request.getUrl().getScheme().equals("http")
                && !request.getUrl().getScheme().equals("https")) {
              Intent intent = new Intent(Intent.ACTION_VIEW, request.getUrl());
              // If the URL cannot be opened, return early.
              try {
                MainActivity.this.startActivity(intent);
              } catch (ActivityNotFoundException exception) {
                Log.d("TAG", "Failed to load URL with scheme:" + request.getUrl().getScheme());
              }
              return true;
            }

            String currentDomain;
            // If the current URL's host cannot be found, return early.
            try {
              currentDomain = new URL(view.getUrl()).getHost();
            } catch (MalformedURLException exception) {
              // Malformed URL.
              return false;
            }
            String targetDomain = request.getUrl().getHost();

            // If the current domain equals the target domain, the
            // assumption is the user is not navigating away from
            // the site. Reload the URL within the existing web view.
            if (currentDomain.equals(targetDomain)) {
              return false;
            }

            // 3. User is navigating away from the site, open the URL in
            // Custom Tabs to preserve the state of the web view.
            CustomTabsIntent intent = new CustomTabsIntent.Builder().build();
            intent.launchUrl(MainActivity.this, request.getUrl());
            return true;
          }
        });
  }
}

کاتلین

class MainActivity : AppCompatActivity() {

  private lateinit var webView: WebView

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    // ... Register the WebView.

    webView.webViewClient = object : WebViewClient() {
      // 1. Implement the web view click handler.
      override fun shouldOverrideUrlLoading(
          view: WebView?,
          request: WebResourceRequest?
      ): Boolean {
        // 2. Determine whether to override the behavior of the URL.
        // If the target URL has no host, return early.
        request?.url?.host?.let { targetDomain ->
          val currentDomain = URL(view?.url).host

          // Handle custom URL schemes such as market:// by attempting to
          // launch the corresponding application in a new intent.
          if (!request.url.scheme.equals("http") &&
              !request.url.scheme.equals("https")) {
            val intent = Intent(Intent.ACTION_VIEW, request.url)
            // If the URL cannot be opened, return early.
            try {
              this@MainActivity.startActivity(intent)
            } catch (exception: ActivityNotFoundException) {
              Log.d("TAG", "Failed to load URL with scheme: ${request.url.scheme}")
            }
            return true
          }

          // If the current domain equals the target domain, the
          // assumption is the user is not navigating away from
          // the site. Reload the URL within the existing web view.
          if (currentDomain.equals(targetDomain)) {
            return false
          }

          // 3. User is navigating away from the site, open the URL in
          // Custom Tabs to preserve the state of the web view.
          val customTabsIntent = CustomTabsIntent.Builder().build()
          customTabsIntent.launchUrl(this@MainActivity, request.url)
          return true
        }
        return false
      }
    }
  }
}

ناوبری صفحه خود را تست کنید

برای آزمایش تغییرات پیمایش صفحه خود، بارگیری کنید

https://webview-api-for-ads-test.glitch.me#click-behavior-tests

به نمای وب شما برای مشاهده نحوه عملکرد آنها در برنامه خود، روی هر یک از انواع مختلف پیوند کلیک کنید.

در اینجا چند مورد برای بررسی وجود دارد:

  • هر پیوند URL مورد نظر را باز می کند.
  • هنگام بازگشت به برنامه، شمارنده صفحه آزمایشی به صفر نمی رسد تا وضعیت صفحه حفظ شود.