如何在项目中使用 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 还有个 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新知”,每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYQysn5H' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片