SafariのSwift Open Link


回答:


348

「Swiftに組み込まれている」わけではありませんが、標準のUIKit方法を使用して実行できます。UIApplicationの(非推奨)とを見てください。openUrl(_:) open(_:options:completionHandler:)

Swift 4 + Swift 5(iOS 10以降)

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

Swift 3(iOS 9以下)

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

Swift 2.2

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

このような購入用URLを追加した場合、アプリストアからの可能性はありますか?
Jan

8
iOSの10.0で、あなたは今のオプションとハンドラを追加する必要があります。UIApplication.shared.open(URL(文字列: " google.com")〕オプション:[:]、completionHandler:ゼロ)
gabicuesta

1
@gabicuesta実際には、オプションとcompletionHandlerを提供する必要はありません。デフォルトはそれぞれ[:]とnilです
Jeremy

79

iOS 9以降の新機能では、ユーザーにaを表示できますSFSafariViewController(こちらのドキュメントを参照)。基本的に、ユーザーをアプリから離れさせることなく、ユーザーをSafariに送ることのすべての利点を享受できます。新しいSFSafariViewControllerを使用するには:

import SafariServices

そして、イベントハンドラーのどこかに、次のようなSafariビューコントローラーがユーザーに表示されます。

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

サファリビューは次のようになります。

ここに画像の説明を入力してください


3
これは素晴らしいです。ありがとう!アプリの拡張機能でSafariブラウザを表示したい場合は、このコードを使用してください。sharedApplicationアプリ拡張機能のプロパティへのアクセスは禁止されています。以上の場合:developer.apple.com/library/archive/documentation/General/...
バランエムレ

1
卓越したソリューション
Mutawe

1
Appleは、古いopenURLメソッドを使用するためにストアからアプリを拒否することがあります。これは現在、推奨されるソリューションです。
切断

19

Swift 4の更新:(Marco Weberへのクレジット)

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、いいえ、説明したように明示的に行われるため、requestUrl = ...
CodeOverRide

2
はい、物事を行うには多くの方法があります。「私は正しい、それゆえあなたの間違っている」という考え方で頑固なガキでなく、ある状況で特定のコードを使用すべき理由を学びましょう。あなたはプログラミングに慣れていないようですが、これはあなたの子供への私のアドバイスです。
CodeOverRide 2015年

3
アミット:いいえ、それはうまくいきません、あなたは単に間違っています。Swift 2または1.2。そして当然のことながら、requestUrlはオプションではないため、!でラップ解除することはできません。
グスタフ2015

2
リクエストを送信する前にnilチェックを行うので、私はこの方法がMike Sの方法よりも好きです。
Nikolaj Nielsen 2015

1
Swift4用に更新:if let requestUrl = NSURL(string: "http://www.iSecurityPlus.com") { UIApplication.shared.openURL(requestUrl as URL) }
Marco Weber

12

Swift 3およびIOS 10.2

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

Swift 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

Swift 1.2の場合:

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

1

Swift 2.0の場合:

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

-1

iOS 11.2 Swift 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.