Xcode, Swift; Обнаружение гиперссылки в UIWebView

Я сделал приложение для iOS с Xcode и Swift.

Я хочу открыть определенные гиперссылки в браузере Safari, а другие - в самом WebView.

Чтобы достичь этого, мне нужно будет проверить, когда щелкают гиперссылки.

Это код, который я до сих пор:

//
//  PushViewController.swift
//  App
//
//

import UIKit
class PushViewController: UIViewController, UIWebViewDelegate {
    @IBOutlet var openpushmessage: UIWebView!

    var weburl:String = "http://www.example.com"

    override func viewDidLoad() {
        super.viewDidLoad()

        let url: NSURL = NSURL(string: weburl)!
        let requestURL: NSURLRequest = NSURLRequest(URL: url)
        openpushmessage.loadRequest(requestURL)
    }
    override func webView(_ webView: UIWebView, shouldStartLoadWithRequest request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
        if navigationType == .linkClicked
        {
            print("You clicked a hypelink!")
        }
        return true
    }
}

Код в viewDidLoad() открывает загрузку основного URL ( http://www.example.com/) с моего сервера. Это отлично работает.

override fun webView[…] должен определить, нажата ли гиперссылка, а затем print("You clicked a hypelink!"),

Но, к сожалению, я получаю следующие ошибки:

одна ошибка и одно предупреждение для моего кода

Что я делаю неправильно? Как избавиться от этих ошибок?

4 ответа

Решение

Это рабочее решение (Xcode 7.3.1 и Swift 2.2):

func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {

    if request.URL?.query?.rangeOfString("target=external") != nil {
        if let url = request.URL {
            UIApplication.sharedApplication().openURL(url)
            return false
        }
    }
    return true
}

Большое спасибо danhhgl от freelancer.com!

Пожалуйста, попробуй

для быстрой версии 3.0

 public func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool
        {
         if navigationType == .linkClicked
         {

            }
            return true;
        }

Свифт 2.2

internal func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool
    {
        if navigationType == .LinkClicked
        {

        }
        return true;
    }

Я думаю, что вы можете решить с помощью этого кода:

 function reportBackToObjectiveC(string)
 {
 var iframe = document.createElement("iframe");
 iframe.setAttribute("src", "callback://" + string);
 document.documentElement.appendChild(iframe);
 iframe.parentNode.removeChild(iframe);
 iframe = null;
 }

var links = document.getElementsByTagName("a");
for (var i=0; i<links.length; i++) {
links[i].addEventListener("click", function() {
    reportBackToObjectiveC("link-clicked");
}, true);
}

в коде ios:

if ([[[request URL] scheme] isEqualToString:@"callback"]) {
[self setNavigationLeavingCurrentPage:YES];
return NO;
}

Более подробную информацию вы можете проверить здесь:

В Xcode v15.0 мне пришлось внести следующие изменения, чтобы активировать ссылку:

      public func webView(_ webView: WKWebView, shouldStartLoadWith request: URLRequest, navigationType: WKNavigationType) -> Bool {
   if navigationType == .linkActivated {}
   return true;
}
Другие вопросы по тегам