Safari视图控制器

时间:2016-06-23 02:24:20

标签: ios sfsafariviewcontroller

我是iOS应用开发的新手。目前,我正在开发一个需要应用和网页之间互动的项目。我知道我可以使用safari视图控制器在应用程序中加载网页,并使用网页右上角的完成按钮返回应用程序。但我想通过单击网页中的链接而不是完成按钮来返回应用程序。我找不到任何解决方案。有人可以帮忙吗?非常感谢提前。

2 个答案:

答案 0 :(得分:3)

您可以使用自定义网址方案轻松完成此操作。首先向您的Info.plist添加一个方案:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLName</key>
        <string>com.mydomain.MyCallback</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>mydomainwebcallback</string>
        </array>
    </dict>
</array>

现在,您有一种机制可以从任何点击的网址中打开您的应用。在这种情况下,网址为mydomainwebcallback://whatever

现在,在视图控制器中加载的网页中,添加如下网址:

<a href="mydomainwebcallback://whateverinfo">Return to app</a>

我将在此处简化,但您需要引用SFSafariViewController中的AppDelegate。首先在AppDelegate中:

import UIKit
import SafariServices

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    var safariVC: SFSafariViewController?

    func application(application: UIApplication, handleOpenURL url: NSURL) -> Bool {

        // Here we dismiss the SFSafariViewController
        if let sf = safariVC
        {
            sf.dismissViewControllerAnimated(true, completion: nil)
        }

        return true
    }

正如您所看到的,我将SFSafariViewController保留在代表中。现在在我的视图控制器中显示VC:

import UIKit
import SafariServices

class ViewController: UIViewController {

    @IBAction func showSafariVC(sender: UIButton) {

        if let url = NSURL(string: "https://mywebserver/callback.html")
        {
            let delegate = UIApplication.sharedApplication().delegate as! AppDelegate
            delegate.safariVC = SFSafariViewController(URL: url)
            presentViewController(delegate.safariVC!, animated: true, completion: nil)
        }
    }
}

现在,当您点击链接时,它将关闭SFSafariViewController

答案 1 :(得分:0)

这项工作对我来说,但wkwebview。 https://github.com/liqichao/wkwebview-test

这个例子是一个sfsafariview但你必须使用内部的wkwebview https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/bk2ch11p552webkit/ch24p825webview/WebViewController.swift