標籤:
我們直接來看完整的代碼:
import UIKitimport SafariServicesclass 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~
三行代碼實現iOS9新功能-SFSafariViewController