Safari에서 Swift Open Link


답변:


348

"Swift에 구워진"것은 아니지만 표준 UIKit방법을 사용 하여 수행 할 수 있습니다. UIApplication (더 이상 사용되지 않음) 및을 살펴보십시오 .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을 추가하면 앱 스토어에서 기회가 있습니까?
1

8
iOS 10.0에서는 이제 옵션 및 핸들러를 추가해야합니다. UIApplication.shared.open (URL (string : " google.com" ) !, 옵션 : [:], completionHandler : nil)
gabicuesta

1
@gabicuesta 실제로 옵션과 completionHandler를 제공 할 필요는 없습니다. 기본값은 각각 [:]와 nil입니다.
Jeremy

79

iOS 9 이상의 새로운 기능으로 사용자에게 SFSafariViewController(문서를 참조 하십시오 ) 제시 할 수 있습니다 . 기본적으로 앱을 떠나지 않고도 사용자를 Safari로 보내는 모든 이점을 얻을 수 있습니다. 새로운 SFSafariViewController를 사용하려면 :

import SafariServices

이벤트 핸들러 어딘가에 사용자에게 다음과 같이 사파리 뷰 컨트롤러를 제공하십시오.

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

사파리보기는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오


3
대단해. 감사! 앱 확장 프로그램에 Safari 브라우저를 표시하려는 사람은 누구나이 코드를 사용해야합니다. sharedApplication앱 확장 에서 속성에 액세스하는 것은 금지되어 있습니다. 더보기 : developer.apple.com/library/archive/documentation/General/…
Baran Emre

1
탁월한 솔루션
Mutawe

1
Apple은 때때로 오래된 openURL 메소드를 사용하기 위해 상점에서 앱을 거부합니다. 이것이 선호되는 솔루션입니다.
연결 해제

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
Amit, No, 설명했듯이 명시 적으로 완료
되었으므로

2
그렇습니다. 할 일이 많이 있습니다. "나는 옳다. 그러므로 당신의 잘못이다"라는 사고 방식의 완고한 말괄량이가 아닌 상황에서 특정 코드를 사용해야하는 이유를 배우십시오. 프로그래밍에 익숙하지 않은 것 같습니다.
CodeOverRide

3
Amit : 아니요, 작동하지 않습니다. 당신은 단순히 틀 렸습니다. 스위프트 2 또는 1.2에서. 당연히 requestUrl은 선택 사항이 아니므로 랩핑을 해제 할 수 없습니다!.
구 스타 후

2
요청을 보내기 전에 nil check를 수행하기 때문에 Mike S의 방법보다이 방법이 더 좋습니다.
Nikolaj Nielsen

1
Swift4를 위해 업데이트 됨 :if let requestUrl = NSURL(string: "http://www.iSecurityPlus.com") { UIApplication.shared.openURL(requestUrl as URL) }
Marco Weber

12

스위프트 3 & IOS 10.2

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

스위프트 3 & IOS 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)
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.