三行代碼實現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~


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