SFSafariViewController Reader 填坑

SFSafariViewController 是 iOS 9.0 之后提供的一个经过完整封装的 Safari Controller。App 经常有展示协议或是帮助文档的需求,传入URL,直接使用 SFSafariViewController + Reader模式非常方便而且体验良好。
要注意的是, 此处的URL必须带上HTTP://或者HTTPS://协议前缀,否则 SFSafariViewController无法加载。
在 iOS 11 之前,SFSafariViewController的初始化方法是这样的:

init(url: URL, entersReaderIfAvailable: Bool)

iOS 11.0 之后,这个初始化方法 Deprecated了。
改为:

init(url: URL)
init(url: URL, configuration: SFSafariViewController.Configuration)

写之前没仔细看文档,我直接使用第一个初始化方法写成:

let protocolVC = SFSafariViewController(url: protocolUrl)
protocolVC.delegate = self
protocolVC.configuration.entersReaderIfAvailable = true
self.present(protocolVC, animated: true, completion: nil)

然而发现页面并未能如预期那样进入 Reader 模式。查看其定义发现这是个坑:

/*! @abstract A copy of the configuration with which the view controller was
            initialized. */
    @available(iOS 11.0, *)
    @NSCopying open var configuration: SFSafariViewController.Configuration { get }

所以 在实例化一个 SFSafariViewController后,直接修改其 configuration 是行不通的,要换个初始化方法了:

let config = SFSafariViewController.Configuration()
config.entersReaderIfAvailable = true
let protocolVC = SFSafariViewController(url: protocolUrl)
protocolVC.delegate = self
self.present(protocolVC, animated: true, completion: nil)

这时再展示一篇博客、协议或是一篇新闻时,就会自动进入Reader模式了。