三行代码实现iOS9新功能-SFSafariViewController

我们直接来看完整的代码:

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~


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章