UIWebView सफारी में खुले लिंक


304

मेरे पास अपने एप्लिकेशन बंडल से सामग्री के साथ एक बहुत ही सरल UIWebView है। मैं चाहूंगा कि वेब दृश्य के बजाय सफारी में खोलने के लिए वेब दृश्य में कोई लिंक हो। क्या यह संभव है?


नीचे दिए गए स्वीकृत उत्तर सभी मामलों में काम नहीं करेंगे।
IANS

मैंने एक बेहतर उत्तर जोड़ा है। कृपया मेरे उत्तर को स्वीकृत के रूप में चिह्नित करें।
इयन्स

जवाबों:


657

UIWebView प्रतिनिधि में इसे जोड़ें:

(नेविगेशन प्रकार की जांच करने के लिए संपादित। आप file://उन अनुरोधों से भी गुजर सकते हैं जो सापेक्ष लिंक होंगे)

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    if (navigationType == UIWebViewNavigationTypeLinkClicked ) {
        [[UIApplication sharedApplication] openURL:[request URL]];
        return NO;
    }

    return YES;
}

स्विफ्ट संस्करण:

func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
        if navigationType == UIWebViewNavigationType.LinkClicked {
            UIApplication.sharedApplication().openURL(request.URL!)
            return false
        }
        return true
    }

स्विफ्ट 3 संस्करण:

func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
    if navigationType == UIWebViewNavigationType.linkClicked {
        UIApplication.shared.openURL(request.url!)
        return false
    }
    return true
}

स्विफ्ट 4 संस्करण:

func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebView.NavigationType) -> Bool {
    guard let url = request.url, navigationType == .linkClicked else { return true }
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
    return false
}

अपडेट करें

जैसा कि openURLiOS 10 में चित्रित किया गया है:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
        if (navigationType == UIWebViewNavigationTypeLinkClicked ) {
            UIApplication *application = [UIApplication sharedApplication];
            [application openURL:[request URL] options:@{} completionHandler:nil];
            return NO;
        }

        return YES;
}

स्पष्ट, क्या आप नीचे दिए गए जवाब और टिप्पणियों के संदर्भ में अपने जवाब को अपडेट करने का मन करेंगे।
टोबी एलन

उपयोगकर्ता द्वारा ब्राउज़र बंद करने के बाद एप्लिकेशन पर वापस कैसे जाएं?
जॉनी एवरसन

3
@ जॉनी एवरसन: किसी भी बाहरी ऐप (सफारी सहित) के बंद होने के बाद क्या होता है, इस पर आपका कोई नियंत्रण नहीं है। यदि आप अपने ऐप को वापस प्राप्त करना चाहते हैं, जब उपयोगकर्ता ब्राउज़िंग कर रहा है, तो सफारी को न खोलें, बस UIWwbView और "डन" -बटन का उपयोग करें।
जौन

1
स्थानीय HTML फ़ाइल के साथ एक आकर्षण की तरह काम किया।
necixy

1
मुझे लगता है कि, स्विफ्ट में, switch
एनम

44

अगर किसी को आश्चर्य होता है, तो स्विफ्ट में ड्रॉनेडवर्ड का समाधान इस तरह दिखाई देगा :

func webView(webView: UIWebView!, shouldStartLoadWithRequest request: NSURLRequest!, navigationType: UIWebViewNavigationType) -> Bool {
    if navigationType == UIWebViewNavigationType.LinkClicked {
        UIApplication.sharedApplication().openURL(request.URL)
        return false
    }
    return true
}

किसी भी विचार को केवल URL के साथ कैसे करना है जिसमें https: // http: // या mailto :? स्विफ्ट का उपयोग कर रहे हैं? प्रश्न यहाँ एक तेजी से जवाब की जरूरत है! stackoverflow.com/questions/2532453/…
Jed Grant

@JedGrant स्विफ्ट संस्करण अब stackoverflow.com/questions/2532453/…
कार्ल शरमन

2
उपयोग करना सुनिश्चित करेंUIWebViewDelegate
Jay Mayu

28

उपयोगकर्ता 306253 के उत्तर के लिए एक त्वरित टिप्पणी: इसके साथ सावधानी बरतें, जब आप UIWebView में खुद को लोड करने की कोशिश करेंगे (अर्थात कोड से भी), तो यह विधि इसे होने से रोकेगी।

इसे रोकने के लिए आप क्या कर सकते हैं (धन्यवाद वेड):

if (inType == UIWebViewNavigationTypeLinkClicked) {
    [[UIApplication sharedApplication] openURL:[inRequest URL]];
    return NO;
}

return YES;

तुम भी UIWebViewNavigationTypeFormSubmittedऔर UIWebViewNavigationTypeFormResubmittedप्रकार संभाल करना चाहते हो सकता है ।


8
+1 मेरा वही मुद्दा था। समाधान के लिए अनुरोध प्रकार के रूप में UIWebViewNavigationTypeLink क्लिक किया गया था, URL खोलें और NO वापस करें, अन्यथा YES लौटाएं।
वेड म्यूलर

वेड आपको अपनी टिप्पणी एक उत्तर के रूप में पोस्ट करनी चाहिए
टोबी एलन

16

अन्य उत्तरों में एक समस्या है: वे आपके द्वारा की गई कार्रवाई पर निर्भर करते हैं और लिंक पर ही यह तय करते हैं कि इसे सफारी में लोड करना है या वेबव्यू में।

अब कभी-कभी यह वही है जो आप चाहते हैं, जो ठीक है; लेकिन कुछ अन्य समय, खासकर यदि आपके पेज में लंगर लिंक हैं, तो आप वास्तव में सफारी में केवल बाहरी लिंक खोलना चाहते हैं, और आंतरिक नहीं। उस स्थिति में आपको URL.hostअपने अनुरोध की संपत्ति की जांच करनी चाहिए ।

मैं यह जांचने के लिए कि क्या मेरे पास URL में एक होस्टनाम है जिसे पार्स किया जा रहा है, या यदि वह एम्बेडेड है तो जाँच करने के लिए कोड के उस टुकड़े का उपयोग करता हूँ:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    static NSString *regexp = @"^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9-]*[a-zA-Z0-9])[.])+([A-Za-z]|[A-Za-z][A-Za-z0-9-]*[A-Za-z0-9])$";
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regexp];

    if ([predicate evaluateWithObject:request.URL.host]) {
        [[UIApplication sharedApplication] openURL:request.URL];
        return NO; 
    } else {
        return YES; 
    }
}

आप निश्चित रूप से अपनी आवश्यकताओं के अनुरूप नियमित अभिव्यक्ति को अपना सकते हैं।


नोट: नियमित अभिव्यक्ति stackoverflow.com/questions/106179/…
KPM

1
आने वाले अनुरोधों को फ़िल्टर करने के बारे में इस मुद्दे पर, होस्टनाम पार्सिंग के लिए नहीं। URL योजना के आधार पर फ़िल्टर करने के लिए एक बेहतर तरीका होगा। IOS 8.4 (सिम्युलेटर) पर, मुझे "ऐप्पलबडेटा" का उपयोग एंकर लिंक की योजना के रूप में किया गया था, लेकिन यह लक्ष्य संस्करण के साथ भिन्न हो सकता है।
मंडिसा डब्ल्यूए

अच्छा विचार है मंडिसा। लंगर लिंक की अनुमति देने के लिए मैं "फ़ाइल" योजना के लिए जांच करता हूंif (request.URL?.scheme != "file")
डेविड डगलस

7

स्विफ्ट में आप निम्नलिखित कोड का उपयोग कर सकते हैं:

extension YourViewController: UIWebViewDelegate {
    func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebView.NavigationType) -> Bool {
        if let url = request.url, navigationType == UIWebView.NavigationType.linkClicked {
            UIApplication.shared.open(url, options: [:], completionHandler: nil)
            return false
        }
        return true
    }

}

सुनिश्चित करें कि आप URL मान और नेवीगेशन टाइप के लिए जाँच करें।


1

यहाँ XAMarin iOS ड्रॉवर्डवर्ड के जवाब के बराबर है।

class WebviewDelegate : UIWebViewDelegate {
    public override bool ShouldStartLoad (UIWebView webView, NSUrlRequest request, UIWebViewNavigationType navigationType) {
        if (navigationType == UIWebViewNavigationType.LinkClicked) {
            UIApplication.SharedApplication.OpenUrl (request.Url);
            return false;
        }
        return true;
    }
}

1

स्वीकृत उत्तर काम नहीं करता है।

यदि आपका पृष्ठ जावास्क्रिप्ट के माध्यम से URL लोड करता है, तो navigationTypeहोगा UIWebViewNavigationTypeOther। जो, दुर्भाग्य से, एनालिटिक्स जैसे पृष्ठभूमि पृष्ठ लोड भी शामिल हैं।

पेज नेविगेशन का पता लगाने के लिए, आपको इसकी तुलना [request URL]करने की आवश्यकता है [request mainDocumentURL]

यह समाधान सभी मामलों में काम करेगा:

- (BOOL)webView:(UIWebView *)view shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)type
{
    if ([[request URL] isEqual:[request mainDocumentURL]])
    {
        [[UIApplication sharedApplication] openURL:[request URL]];
        return NO;
    }
    else
    {       
        return YES;
    }
}

1
क्या आप इस पर एक स्विफ्ट 4 संस्करण पोस्ट कर सकते हैं?
अमजद

1

ऐप अस्वीकृति नोट:

अंत UIWbViewमें मर चुका है और Apple अब इसे स्वीकार नहीं करेगा।

Apple ने उन सभी ऐप के मालिक को ईमेल भेजना शुरू किया जो अभी भी उपयोग कर रहे हैं UIWebView:

डेप्रिसिएटेड एपीआई यूसेज - ऐप्प ऐप का इस्तेमाल करने वाले ऐप्स की सबमिशन स्वीकार करना बंद कर देगा UIWebView

Apple उपयोगकर्ता गोपनीयता को बहुत गंभीरता से लेता है और यह स्पष्ट है कि वे असुरक्षित वेबव्यू की अनुमति नहीं देंगे

इसलिए जल्द से जल्द अपने ऐप से UIWebView निकालें। UIWebViewनए बनाए गए एप्लिकेशन में उपयोग करने का प्रयास न करें और WKWebViewयदि संभव हो तो मैं उपयोग करना पसंद करता हूं

ITMS-90809: डिप्रेस्ड एपीआई यूसेज - Apple उन ऐप्स के सबमिशन को स्वीकार करना बंद कर देगा जो UIWebView API का उपयोग करते हैं। अधिक जानकारी के लिए https://developer.apple.com/documentation/uikit/uiwebview देखें ।

उदाहरण:

import UIKit
import WebKit

class WebInfoController: UIViewController,WKNavigationDelegate {

    var webView : WKWebView = {
        var webview = WKWebView()
        return webview
    }()

    var _fileName : String!

    override func viewDidLoad() {
        self.view.addSubview(webView)
        webView.fillSuperview()
        let url = Bundle.main.url(forResource: _fileName, withExtension: "html")!
        webView.loadFileURL(url, allowingReadAccessTo: url)
        let request = URLRequest(url: url)
        webView.load(request)
    }


    func webView(webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: NSError) {
        print(error.localizedDescription)
    }
    func webView(webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
        print("Strat to load")
    }
    func webView(webView: WKWebView, didFinishNavigation navigation: WKNavigation!) {
        print("finish to load")
    }
}

0

मेरे मामले में मैं यह सुनिश्चित करना चाहता हूं कि वेब दृश्य में सब कुछ प्रारंभिक लोड को छोड़कर सफारी को खोलता है और इसलिए मैं उपयोग करता हूं ...

- (BOOL)webView:(UIWebView *)inWeb shouldStartLoadWithRequest:(NSURLRequest *)inRequest navigationType:(UIWebViewNavigationType)inType {
     if(inType != UIWebViewNavigationTypeOther) {
        [[UIApplication sharedApplication] openURL:[inRequest URL]];
        return NO;
     }
     return YES;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.