SFSafariViewController

如何在项目中使用 SFSafariViewController

运用 SFSafariViewController 的优点是它能够让你在 App 内提供一个跟 Safari 简直一样功用方式来展示网页,不需求定制 UI,简略几行代码即可完结,并且数据也是跟 Safari 共享的,例如阅读器、自动填充账号密码、诈骗性网站检测和内容阻止等等。

缺陷时用户的活动和与 SFSafariViewController 的交互对你的运用来说是不行见的,由于运用无法访问自动填充数据、阅读历史记录或网站数据,这也确保了用户的安全。

国内的 App 简直很少见到用 SFSafariViewController 的,更多的仍是用内嵌的 WKWebView,由于 WKWebView 灵活性更高。而国外的 App 如 Twitter、GitHub 等都有在用。

在项目中运用 SFSafariViewController

SFSafariViewController 不在 UIKit 中,而是在一个名为 SafariServices 结构,因此你需求导入才干运用它:

然后在你需求翻开网页的地方运用如下代码即可:

let vc = SFSafariViewController(url: URL(string: "https://apple.com")!)
present(vc, animated: true)

上边的代码会在你的 App 内翻开一个苹果的网页。

自定义装备

SFSafariViewController 还提供一个装备选项,支撑装备不同的参数,这个装备是 SFSafariViewController.Configuration 类型。

let config = SFSafariViewController.Configuration()
let vc = SFSafariViewController(url: URL(string: "https://apple.com")!, configuration: config)
present(vc, animated: true)

默许情况下,当页面往上翻滚,顶部和底部的菜单栏会躲藏,假如不想躲藏能够设置:

config.barCollapsingEnabled = false

默许情况下,Safari 的阅读模式是禁用的,假如想翻开,只需求设置:

config.entersReaderIfAvailable = true

SFSafariViewController 本身还有一些设置选项,以下代码是一个较全的装备:

let config = SFSafariViewController.Configuration()
// 禁用翻滚躲藏顶部和底部 bar
config.barCollapsingEnabled = false
// 假如网页支撑的话,启用阅读模式
config.entersReaderIfAvailable = true
let vc = SFSafariViewController(url: URL(string: "https://apple.com")!, configuration: config)
// 设置顶部和底部 bar 的色彩为赤色
vc.preferredBarTintColor = .red
// 设置按钮和和文本的渲染色彩为蓝色
vc.preferredControlTintColor = .blue
// 设置左上角 dismiss 按钮的文案为 cancel
vc.dismissButtonStyle = .cancel
present(vc, animated: true)

最终作用:

如何在项目中使用 SFSafariViewController

署理回调方法

SFSafariViewController 还有个 SFSafariViewControllerDelegate 的署理,经过 vc.delegate = self 绑定之后就能够运用了:

/** 在用户点击底部共享按钮后调用,能够回来一组 [UIActivity] 来指定显现哪些 App
 */
optional func safariViewController(_ controller: SFSafariViewController, activityItemsFor URL: URL, title: String?) -> [UIActivity]
/** 回来要排除哪些 ActivityType 类型
 */
@available(iOS 11.0, *)
optional func safariViewController(_ controller: SFSafariViewController, excludedActivityTypesFor URL: URL, title: String?) -> [UIActivity.ActivityType]
/** 当用户点击完结按钮时调用 */
optional func safariViewControllerDidFinish(_ controller: SFSafariViewController)
/** 在初始 URL 加载完结时调用。didLoadSuccessfully: 是否加载成功
 */
optional func safariViewController(_ controller: SFSafariViewController, didCompleteInitialLoad didLoadSuccessfully: Bool)
/** 当阅读器在加载初始页面时被重定向到另一个 URL 时调用。
 */
@available(iOS 11.0, *)
optional func safariViewController(_ controller: SFSafariViewController, initialLoadDidRedirectTo URL: URL)
/** 当用户经过点击工具栏按钮在 Safari 阅读器中翻开当时页面时调用。
 */
@available(iOS 14.0, *)
optional func safariViewControllerWillOpenInBrowser(_ controller: SFSafariViewController)

iOS 15 新增功用

在 iOS 15 中,SFSafariViewController 提供了一个类方法 prewarmConnections,参数是一个 URL 数组,支撑预加载一批网页。依照苹果的文档,回来的 token 目标有必要强引用才行

let urls = [URL(string: "https://apple.com")!]
let token = SFSafariViewController.prewarmConnections(to: urls)

点击下方大众号卡片,重视我,每天共享一个关于 iOS 的新知识

本文同步自微信大众号 “iOS新知”,每天准时共享一个新知识,这里仅仅同步,想要及时学到就来重视我吧!