現在ウェブビューを使用しているアプリがあり、ウェブビューで特定のリンクをクリックすると、Safariでそれらのリンクが開きます。 Safariアプリで起動する代わりに、Safari View Controller(SVC)を実装したいと思います。私は調査を行い、SVCの例を調べました。ただし、表示されるのは、ボタンをクリックするだけでSVCを開くものです。誰かが私を見たり試してみたりするための提案がありますか?
これが私のコードの一部です:
func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
if navigationType == UIWebViewNavigationType.LinkClicked {
let Host = request.URL!.Host!;
if (Host != "www.example.com"){
return true
} else {
UIApplication.sharedApplication().openURL(request.URL!)
return false
}
return true
}
func showLinksClicked() {
let safariVC = SFSafariViewController(URL: NSURL(string: "www.example.com")!)
self.presentViewController(safariVC, animated: true, completion: nil)
safariVC.delegate = self }
func safariViewControllerDidFinish(controller: SFSafariViewController) {
controller.dismissViewControllerAnimated(true, completion: nil)
}
私が正しく理解している場合、ユーザーがSVCでそれらのページを開きたいリンクをクリックすると、特定のリンクを持つWebViewにページが読み込まれます。次のデリゲートメソッドを使用してWebViewのリンククリックを検出し、そこからSVCを開くことができます。
編集
編集した質問に基づいて、showLinksClicked funcを呼び出していないことがわかります。次のコードで更新しているので、この関数を呼び出すことができます。
func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
if navigationType == UIWebViewNavigationType.LinkClicked {
self.showLinksClicked()
return false
}
return true;
}
func showLinksClicked() {
let safariVC = SFSafariViewController(URL: NSURL(string: "www.example.com")!)
self.presentViewController(safariVC, animated: true, completion: nil)
safariVC.delegate = self
}
func safariViewControllerDidFinish(controller: SFSafariViewController) {
controller.dismissViewControllerAnimated(true, completion: nil)
}
Swift= 3:
まず、SafariServicesをインポートし、デリゲートをクラスに統合します。
import SafariServices
class YourViewController: SFSafariViewControllerDelegate {
次に、指定したURLでSafariを開きます。
let url = URL(string: "http://www,google.com")!
let controller = SFSafariViewController(url: url)
self.present(controller, animated: true, completion: nil)
controller.delegate = self
そして今、ユーザーが終了したときにサファリを却下するデリゲートコールバックを実装できます。
func safariViewControllerDidFinish(_ controller: SFSafariViewController) {
controller.dismiss(animated: true, completion: nil)
}
このコードにより、これを行うことができます。
let safariVC = SFSafariViewController(URL: NSURL(string: "https://www.google.co.uk")!)
self.presentViewController(safariVC, animated: true, completion: nil)
safariVC.delegate = self
これをクラスの最上部にも追加する必要がある場合があります。
import SafariServices
手順に従ってください :
コントローラーファイル(ViewController.Swiftなど)でSafarriServicesをインポートします。
import SafariServices
次に、リンク書き込みを開きたい場所
let controller = SFSafariViewController(URL: NSURL(string: "https://www.google.co.uk")!)
self.presentViewController(controller, animated: true, completion: nil)
controller = self
Solution For Swift 4
ステップ1:
クラス内のSafariサービスをインポート
import SafariServices
ステップ2:
View Controllerを使用してSFSafariViewControllerDelegateをインポートする
class ViewController: UIViewController,SFSafariViewControllerDelegate {...}
ステップ3:
Safari View Controllerを開く関数を作成します。
func openSafariVC() {
let safariVC = SFSafariViewController(url: NSURL(string: "https://www.google.com")! as URL)
self.present(safariVC, animated: true, completion: nil)
safariVC.delegate = self
}
func safariViewControllerDidFinish(_ controller: SFSafariViewController) {
controller.dismiss(animated: true, completion: nil)
}
ステップ4:
関数openSafariVCを呼び出す
openSafariVC()
注: View ControllerにNavigation Controllerを追加することを忘れないでください。
これで、SafariVCはIWebView Oe WKWebViewを使用せずにアプリ内でリンクを開く準備ができました