我们直接来看完整的代码:
import UIKit import SafariServices class ViewController: UIViewController { @IBAction func openWithSafariVC(sender: AnyObject) { let sfsVC = SFSafariViewController(URL: NSURL(string: "https://google.com")!) presentViewController(sfsVC, animated: true, completion: nil) } }
除去导入头文件、声明类、多余的空行和大括号,真正的实现代码只有三行。
为了演示这个效果,我们在storyboard中拖入一个button,与openWithSafariVC函数建立连接。
运行,如下图所示:
点击Button按钮,效果如下图所示:
可以看到它有很多功能,比如下面的前进、后退、分享、在safari中打开,以及左上角的Done返回按钮。
而做到这些,我们一共只用了三行代码!
注意,如果没有显示成功,可能是以下问题:
1. SFSafariViewController 只能用于 iOS 9 以上
2. 你可能没有翻墙?把网址换成 https://baidu.com 试试
3. 这点基本上是常识了,打开 Info.plist,点击加号添加一项 App Transport Security Settings,在它下面添加一项 Allow Arbitrary Loads,并设置值为 YES
我们来理清一下 UIWebView、WKWebView、SFSafariViewController 之间的关系:
iOS 7 支持 UIWebView
iOS 8 支持 UIWebView、WKWebView
iOS 9 支持 UIWebView、WKWebView、SFSafariViewController
那么,SFSafariViewController 有什么优点?为什么我们要用它?
向用户展现一个网页,无非就是这么几种方式:
1. 使用 openURL(_:) 在 safari 中打开网页,比如:
UIApplication.sharedApplication().openURL(NSURL(string: "https://google.com")!)
但是这样就会导致用户离开你的应用进入 safari 中,显然我们更希望用户能一直待在我们写的应用里。(难道不是吗0.0)
2. 使用 UIWebView 或 WKWebView 来自定义。但是如果想获得 safari 的那些功能,这样做就要写不少代码。
然而有了 SFSafariViewController,我们就可以只用非常少的代码就能获得 safari 几乎所有的功能,而且用户不会离开我们的应用。
但是它自然也有缺点。它不能定制,只能通过上面代码中写的那种 present 方式出现,而不能通过 navigationController.pushViewController 的方式出现。这就导致很多场景不适合用它。
事实上,跟 SFSafariViewController 有关的方法一共才只有五个,其中两个是初始化方法,剩下的三个都是代理方法。
因此它用起来很简单,但是也导致了它不能定制的问题。虽然用 UIWebView、WKWebView 来自定义要写不少代码,但是它们的好处就是可以定制。
SFSafariViewController 只能用于 iOS 9 以后,所以我们现在的项目里还不能用它,使用 iOS 9 以前版本的用户还有很多,我们要兼容他们。不过我觉得这个新东西真的挺不错的,也许过几年真的能替代 UIWebView、WKWebView~