使用新的 WebKit API 构建个人资料
个人资料很有用。它们允许用户将数据分类并单独管理。用户可以为不同目的创建不同的个人资料,并删除任何个人资料而无需担心弄乱来自其他个人资料的数据。个人资料还使得访问不同的在线身份变得更容易。在同一网站拥有多个账户的用户可以在不同个人资料中同时登录这些账户。他们无需反复登录和退出以切换账户,因为个人资料之间的 Cookie 是独立的。
实现个人资料的一个基本要求是拥有独立的网站数据容器。在 WebKit 中,这意味着客户端需要有不同的数据存储。在 macOS 14 和 iOS 17 之前,WebKit 客户端可以有多个非持久性数据存储,但只有一个持久性数据存储——默认存储。非持久性数据存储不将数据保存到磁盘,因此它们无法在会话之间保留。
在 macOS 14 和 iOS 17 中,我们引入了一套新的 API,允许客户端创建和管理多个持久性数据存储。让我们看看如何使用它们为您的应用程序构建“个人资料”功能。
创建个人资料
当用户创建个人资料时,您可以创建一个自定义的持久性 WKWebsiteDataStore
。为此,您应该提供一个可以唯一标识该存储的标识符。您需要记住该标识符,以便在您的应用程序重新启动时可以检索数据存储并恢复个人资料。
let profileIdentifier = UUID()
let profileDataStore = WKWebsiteDataStore(forIdentifier: profileIdentifier)
然后,您可以通过配置将新创建的 WKWebsiteDataStore
分配给 WKWebView
,并使用 WKWebView
加载新个人资料的网页内容,例如参见 https://developer.apple.com/documentation/webkit/wkwebview/。
let configuration = WKWebViewConfiguration()
configuration.websiteDataStore = profileDataStore
let webView = WKWebView(frame: .zero, configuration: configuration)
删除个人资料
当用户删除个人资料时,您可以根据其标识符删除其数据存储。如果指定的数据存储仍在被使用(例如,被一个正在显示网页内容的活跃 WKWebView
),或者存在文件系统错误,则该操作可能会失败。您需要正确捕获和处理错误。
do {
try await WKWebsiteDataStore.remove(forIdentifier: profileIdentifier)
} catch {
print("Removing profile failed with error: \(error)")
}
要查明 WKWebView
是否正在使用数据存储,您可以获取 WKWebsiteDataStore
的标识符。请注意,非持久性 WKWebsiteDataStore
和默认 WKWebsiteDataStore
没有标识符。
if webView.configuration.websiteDataStore.identifier == profileIdentifier {
print("Profile is in use")
}
检索现有个人资料
使用标识符,您可以检索现有数据存储。但是,如果数据存储尚不存在,则会创建一个。如果您只想检查是否存在具有指定标识符的数据存储,而不是创建它,可以使用 fetchAllDataStoreIdentifiers
来获取所有标识符。
let identifiers = await WKWebsiteDataStore.allDataStoreIdentifiers
if !identifiers.contains(profileIdentifier) {
print("Cannot find profile")
}
下一步是什么?
个人资料可能包含许多其他属于客户端而非 WebKit 的数据类型,例如每个网站的设置、书签、浏览历史等。这些类型不在此 API 的涵盖范围内,您可能也需要将它们分开以使个人资料体验更完整。
如果您想在您的应用程序中添加对个人资料的支持,尝试新的 WebKit API 绝对是一个好的开始和必要的步骤。如果您在使用 API 时有任何反馈或遇到任何问题,请通过在 bugs.webkit.org 上提交错误报告来告知我们。