सफारी में स्विफ्ट ओपन लिंक


150

मैं वर्तमान में अपने ऐप में लिंक खोल WebViewरहा हूं, लेकिन मैं इसके बजाय सफारी में लिंक खोलने का विकल्प ढूंढ रहा हूं ।

जवाबों:


348

यह "स्विफ्ट में बेक किया हुआ" नहीं है, लेकिन आप इसे करने के लिए मानक UIKitतरीकों का उपयोग कर सकते हैं । UIApplication's (पदावनत) और पर एक नज़र डालें ।openUrl(_:) open(_:options:completionHandler:)

स्विफ्ट 4 + स्विफ्ट 5 (iOS 10 और उससे ऊपर)

guard let url = URL(string: "https://stackoverflow.com") else { return }
UIApplication.shared.open(url)

स्विफ्ट 3 (iOS 9 और नीचे)

guard let url = URL(string: "https://stackoverflow.com") else { return }
UIApplication.shared.openURL(url)

स्विफ्ट 2.2

guard let url = URL(string: "https://stackoverflow.com") else { return }
UIApplication.sharedApplication().openURL(url)    

अगर हम इस तरह से कुछ क्रय URL जोड़ते हैं तो क्या ऐप स्टोर से कोई मौका है?
Jan

8
IOS 10.0 में अब आपको विकल्प और हैंडलर जोड़ना होगा: UIApplication.sared.open (URL (string: " google.com" ) !, विकल्प: [:],
completeHandler

1
@gabicuesta आपको वास्तव में विकल्प और पूर्णता प्रदान करने की आवश्यकता नहीं है, वे डिफ़ॉल्ट रूप से [:] और शून्य पर, क्रमशः
जेरेमी

79

आईओएस 9 के साथ नया और उच्चतर आप उपयोगकर्ता को यहां प्रस्तुत कर सकते SFSafariViewControllerहैं ( यहां प्रलेखन देखें )। मूल रूप से आपको उपयोगकर्ता को सफारी में भेजने के सभी लाभ मिलते हैं, बिना उन्हें अपना ऐप छोड़ने के। नए SFSafariViewController का उपयोग करने के लिए बस:

import SafariServices

और कहीं न कहीं एक इवेंट हैंडलर यूजर को सफारी व्यू कंट्रोलर के साथ इस तरह पेश करता है:

let svc = SFSafariViewController(url: url)
present(svc, animated: true, completion: nil)

सफारी दृश्य कुछ इस तरह दिखेगा:

यहाँ छवि विवरण दर्ज करें


3
यह कमाल का है। धन्यवाद! जो कोई ऐप एक्सटेंशन में सफारी ब्राउज़र दिखाना चाहता है, उसे इस कोड का उपयोग करना चाहिए। sharedApplicationऐप एक्सटेंशन में संपत्ति तक पहुंचना मना है। और अधिक के लिए: developer.apple.com/library/archive/documentation/General/…
बारां

1
बकाया समाधान
२३:३५ पर मुतावे

1
ऐप्पल कभी-कभी पुराने ओपनरेल विधि का उपयोग करने के लिए स्टोर से ऐप्स को अस्वीकार कर रहा है। यह अब पसंदीदा समाधान होना चाहिए।
डिस्कनेक्शनिस्ट

19

स्विफ्ट 4 के लिए अद्यतन: (मार्को वेबर को क्रेडिट)

if let requestUrl = NSURL(string: "http://www.iSecurityPlus.com") {
     UIApplication.shared.openURL(requestUrl as URL) 
}

या अधिक तेज शैली का उपयोग करके जाएं guard:

guard let requestUrl = NSURL(string: "http://www.iSecurityPlus.com") else {
    return
}

UIApplication.shared.openURL(requestUrl as URL) 

स्विफ्ट 3:

आप NSURL को वैकल्पिक रूप से जाँच कर सकते हैं:

if let requestUrl = NSURL(string: "http://www.iSecurityPlus.com") {
     UIApplication.sharedApplication().openURL(requestUrl)
}

4
अमित, नहीं, क्योंकि यह स्पष्ट रूप से किया गया है जैसा कि मैंने समझाया है कि यह गारंटी है कि requestUrl मौजूद है अगर
letUrl

2
हां, चीजों को करने के कई तरीके हैं। यह जानने का कारण है कि आपको एक ज़िद्दी बव्वा कहने के बजाय एक स्थिति में कुछ कोड का उपयोग क्यों करना चाहिए, "मैं सही हूं, इसलिए आपकी गलत मानसिकता"। लगता है कि आप प्रोग्रामिंग के लिए नए हैं यह मेरी सलाह है आप बच्चे को।
कोडओवरराइड

3
अमित: नहीं, यह काम नहीं करता, आप बस गलत हैं। स्विफ्ट 2 या 1.2 में। और कोई आश्चर्य नहीं कि requestUrl एक वैकल्पिक नहीं है इसलिए आप इसे खोल नहीं सकते!
गुसुतफु

2
मुझे यह तरीका माइक एस से बेहतर लगता है, क्योंकि आप रिक्वेस्ट भेजने से पहले नील चेक करते हैं।
निकोलज नीलसन

1
Swift4 के लिए अद्यतन:if let requestUrl = NSURL(string: "http://www.iSecurityPlus.com") { UIApplication.shared.openURL(requestUrl as URL) }
मार्को वेबर

12

स्विफ्ट 3 और आईओएस 10.2

UIApplication.shared.open(URL(string: "http://www.stackoverflow.com")!, options: [:], completionHandler: nil)

स्विफ्ट 3 और आईओएस 10.2


लेकिन ध्यान दें कि इस संस्करण का उपयोग करने से iOS 9 पर चलने वाला आपका ऐप बंद हो जाएगा और पिछले जब तक आप संस्करण की जाँच नहीं करेंगे
CupawnTae

11

iOS 10 के बाद से आपको उपयोग करना चाहिए:

guard let url = URL(string: linkUrlString) else {
    return
}
    
if #available(iOS 10.0, *) {
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
} else {
    UIApplication.shared.openURL(url)
}


2

स्विफ्ट 1.2 में:

@IBAction func openLink {    
    let pth = "http://www.google.com"
    if let url = NSURL(string: pth){
        UIApplication.sharedApplication().openURL(url)
}

1

स्विफ्ट 2.0 में:

UIApplication.sharedApplication().openURL(NSURL(string: "http://stackoverflow.com")!)

-1

IOS 11.2 स्विफ्ट 3.1- 4

let webView = WKWebView()

override func viewDidLoad() {
    super.viewDidLoad()
    guard let url = URL(string: "https://www.google.com") else { return }
    webView.frame = view.bounds
    webView.navigationDelegate = self
    webView.load(URLRequest(url: url))
    webView.autoresizingMask = [.flexibleWidth,.flexibleHeight]
    view.addSubview(webView)
}

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
    if navigationAction.navigationType == .linkActivated  {
        if let url = navigationAction.request.url,
            let host = url.host, !host.hasPrefix("www.google.com"),
            UIApplication.shared.canOpenURL(url) {
            UIApplication.shared.open(url)
            print(url)
            print("Redirected to browser. No need to open it locally")
            decisionHandler(.cancel)
        } else {
            print("Open it locally")
            decisionHandler(.allow)
        }
    } else {
        print("not a user click")
        decisionHandler(.allow)
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.