大多数浏览器和
Developer App 均支持流媒体播放。
-
了解 WKWebView 的增强功能
WKWebView 是在 app 中呈现丰富、交互式 web 内容的最佳方式。探索新的 API,通过使用webview或uiwebview来帮助你转换 app,同时添加全新的功能。了解处理JavaScript、调整渲染流程和导出 web 内容等的更好方法。
资源
相关视频
WWDC21
WWDC20
-
下载
(你好 WWDC 2020) 你好 欢迎来到 WWDC
大家好 欢迎来到 《了解 WKWebView 的增强功能》 我叫 Brady Eidson 我是 WebKit 架构团队的工程师 今天我很高兴能和大家谈谈 WKWebView API 的新功能 在 Apple 我们热爱 Web 我们非常注重细节 确保 WebKit 框架快速 快速、灵敏、安全且高效 以便我们喜爱的浏览器 Safari 可以做到这些 但我们不仅仅喜欢在浏览器中探索 Web 我们喜欢看到 web 技术无处不在 而且我们的平台可实现 web 内容 与原生体验的绝佳融合 (SFSAFARIVIEWCONTROLLER) 如果你主要需要 app 内 web 浏览器 并且不需要对该体验进行深度定制 那么 SFSafariViewController 是你和你的用户的最佳选择 它会处理在实施基本浏览器及更高版本时 你需要操心的所有事 你的用户会获得阅读器 内容拦截器、自动填充等等 你会获得打包好的浏览器 将其添加到你的 app 并为其提供要加载的 URL SafariViewController 易于使用 但功能强大 因为它构建在 WKWebView 之上 (WKWEBVIEW) 当你需要更高程度的可配置性 或以与浏览无关的方式使用 web 内容时 也可以直接在 WKWebView 上构建 WKWebView 通过 在单独的进程中隔离 web 内容 自动保护 app 的代码和数据 不受 web 平台复杂性的影响 这使 web 内容能快速执行 同时也提供针对恶意行为者的防护 SafariViewController 之所以 使用 WKWebView 正是因为这些优点 这也是多年来我们强烈推荐 WKWebView 而不是其它选择的原因 说到其它选择 WebView 和 UIWebView 是 原来我们用于嵌入 web 内容的 API 它们对我们很有用 但相对于 WKWebView 的很多优点 它们往往有对应的缺点 这就是它们被弃用了几年 并且我们力求 将它们的使用率降到零的原因 弃用的 WebViews 与 WKWebView 的工作方式截然不同 要使 WKWebView API 的 工作方式完全相同 不可取甚至不可能 这种差异有时要求你重新考虑如何行事 另外一些时候 它要求我们向 WKWebView 添加新功能 对于在过渡到 WKWebView 时 遇到挑战的开发人员 我们在倾听你们的意见 并且 WKWebView API 仍在成长 它自推出以来每年都在成长 而且今后每年都会如此 关于这一点 我要谈谈 WKWebView 在 iOS 14 和 macOS Big Sur 中的新功能 有些会使以前困难的任务变得容易得多 有些会带回被弃用的 WebView 中缺少的东西 有些是全新的功能
我们有很多东西要讲 首先 我要谈论新的 API 以帮助你将 app 和 web 内容隔离
然后 我们会谈论通过 JavaScript 与 web 内容进行交互方面的改进
我们会介绍一些 API 以帮助你微调 在你的 app 中的 web 内容呈现 我们会谈到在本地端 从 web 内容获取更多价值的方法 最后 我们会谈到一个 每天都越来越重要的话题 尊重隐私 为了帮助展示这些新功能 我要给大家讲一个 你们中很多人可能都很熟悉的故事 这是关于一个 app 的故事 首先介绍一点背景 像大多数成熟的软件工程机构一样 Safari 和 WebKit 团队 有许多任务关键型内部工具 来使项目继续进行 其中一个重要工具是 我们内部的 WebKittens 网站 用来通知团队成员 该部门的许多只猫的重要更新
该网站与我们在一起的时间超过 iPhone 当然 iOS 流行起来之后 有人开始用 UIWebView 编写 WebKittens app 同样 像大多数成熟的软件工程机构一样 我们部门在任务关键型内部工具方面 也做了很多重复的工作 Pups on Safari 网站是其中一个 旨在随时更新部门的许多条狗的情况
和 WebKittens 一样 Pups on Safari 也有一个老化的 iPhone app 对于这么重要的内容 一天当中不得不查看多个地方有点烦人 因此我决定通过编写 Browser Pets 来解决这个问题 一个单一的 feed 无缝地结合两个网站 本地管理它们之间的交互 由于原来的两个 app 都是独立发展的 我用 WKWebView 从头开始构建 我遇到的第一个挑战是 将我的 app 的逻辑 与 web 内容隔离 我的 app 的“hello world”时刻 是独立显示 WebKittens 的 news feed 在尝试滚动浏览 feed 时 我注意到的第一件事是 我做不到 当我用手指滚动浏览页面时 页面在与我抗争 我对 WebKittens 网站的体验是 它的滚动体验由 JavaScript 大量定制 这对浏览器中的页面来说没问题 但我正在 app 中对体验进行深度定制 我只想要猫咪 其它的都不要 WKWebView API 始终有办法 禁用 JavaScript 只需将 WKPreferences 的 javaScriptEnabled 属性设置为“假” 除非你在编写通用的 web 浏览器 最好始终问自己是否能 从远程源禁用 JavaScript 尤其是那些不受你控制的 对于 WKWebView 这可能会成为问题 因为大多数在视图内与内容的交互都是 通过评估 JavaScript 来实现的 因此 我们今年弃用了该设置 并添加了新功能 (全新) 通过使用 WKWebPagePreferences 上的 allowsContentJavaScript 设置 可以仅禁用来自 web 页面内容 本身的 JavaScript 内联脚本、远程引用的 JavaScript 文件 JavaScript URL等等 但你的 app 的 JavaScript 会继续工作
如果你不熟悉 WKWebPagePreferences API 它相当灵活 这是最近添加的功能 它使基于每次浏览配置某些行为成为可能 我已经在使用较新版本的策略代理 这使我能配置网页使用偏好 这样即使在 iPad 上运行时 也可以作为移动设备呈现
在这里 我还可以在查看主 news feed 时 禁用 ContentJavaScript
进行该更改后 滚动就按预期工作了
现在我可以随意滚动浏览 news feed 了 我想确保能查看帖子的评论 轻点此处
这是我遇到的下一个问题 通过多年使用网站和 app 的经验 我知道该页面的下半部分应该有很多评论 但它是空白的 根据我的经验 我还知道评论是由 JavaScript 填充的 在你说出来之前 我没有意外禁用这些浏览的 JavaScript 是时候启动 Web 检查器了 Web 检查器是一种很好的方式 来探索 WebKit app 中 web 内容的情况 多年以来 你一直都能附加到 开发中的任何 app 中的 任何 WebView 或 JavaScript 上下文 但我们一有机会就想提醒开发人员 你可以做到这一点 而且这很棒 今年对 Web 检查器有很多非常棒的改进 我建议你查看关于它们的讲座 以了解更多信息 (关于 web 检查器的更新 WWDC20) 回到我们的故障 我可以看到 JavaScript 控制台中 有一个错误
让我们仔细看看
网页预期“commentDetails”符号 是一个函数 但它不是 在查看页面的 JavaScript 时 我可以清楚地看到它们声明了该函数 但 Web 检查器告诉我们它是空值
我在 app 中搜索该符号 找到了这个代码
碰巧 我的 app 代码中还有一个 注入到网页的 名为 commentDetails 的 JavaScript 符号 在评估我的 JavaScript 时 我用一个不相关的变量覆盖了它们的函数 使用 WKWebViews 时 这种类型的冲突是一个始终存在的问题 你的 app 可能会意外地与 web 内容冲突 web 内容可能会意外地与 app 冲突 恶意 web 内容可能会 故意与你的 app 冲突 方式是尝试更改其行为 或从中窃取敏感信息 只要我们的 JavaScript 和网页的 JavaScript 在同一环境中运行 这些都是可能的 要解决这个问题 我们需要一个独立的地方 让 JavaScript 独立于 app JavaScript 运行 我们自己的全局对象 这就是 WKContentWorld 发挥作用的地方 WKContentWorld 是 用于运行 JavaScript 的独立沙盒 如果你熟悉 JavaScript 这就像是为相同的页面内容 拥有单独的窗口对象 有一个代表 web 内容本身的页面环境 然后有代表 app 的 JavaScript 的 一个或多个主页的客户端环境 在客户端环境中运行的 你的 app 的 JavaScript 仍然可以进行 诸如在页面上调用内置 DOM API 或更改 DOM 本身的操作 但它永远不会看到 页面的 JavaScript 设置的 app 状态
同样 页面的 JavaScript 永远也看不到你的 app 状态
要在我的 app 中解决该问题 我要为所有 evaluateJavaScript 调用 使用默认的客户端环境
现在我的 app 的 JavaScript 和页面上的 JavaScript 不再冲突 这里是那些评论 很好 我向你展示了采用带evaluateJavaScript 的 WKContentWorld 但现在你还可以将 WKScriptMessageHandlers 注入到特定的内容环境中 以将其隔离 (用JavaScript通信) 我认为我在保护 app 和 web 内容 不受对方影响方面做得很好 开发 Browser Pets 的下个步骤 涉及更多 JavaScript 要控制这一点 我用了一些新的方法 来管理 app 使用的 JavaScript WebKittens 网站是相当静态的 因此它是我们合并的 news feed 的 一个很好的起点
我注入了一些 JavaScript 来清理它的外观 并对其进行了准备 以便集成 Pups on Safari web 内容
Pups on Safari 网站有 用于获取帖子的 JavaScript API 我用它来运行合并 news feed 下面是一些我不得不解决的问题 当我想重用相同 但值不同的 JavaScript 时 就像调用带参数的函数一样 我每次都需要构造 一个全新的 JavaScript 字符串
另一件别扭的事是传递数据 这些字符串代表零? 在 app 代码的其它地方 它们是本机整数 但我必须将其转换为字符串 以便用字符串组件构建 JavaScript 字符串 更糟糕的是 如何为该本地字典中的每个条目 手动添加 JavaScript 字符串 我希望 能将相同的常量 JavaScript 字符串 作为带命名参数的函数重用 而不必担心这些参数被错误地序列化 或反序列化 (全新-CALLASYNCJAVASCRIPT) 这些只是新的 callAsyncJavaScript API 的一些功能 让我们来看看用它能对那个代码做什么
我可以自然地编写 JavaScript 而不必从参数构造字符串 我可以为 JavaScript 字符串 命名任何所需的参数 并通过调用 callAsyncJavaScript 提供它们的值 参数类型的序列化和反序列化会自动进行 Cocoa 字符串变成 JavaScript 字符串 数字仍然是数字 正如在此处高亮显示的那样 Cocoa 字典变成了 JavaScript 对象
我编写的这个小实用方法 可以轻松地重用于像这样的不同参数值
在我的例子中 你可能注意到 JavaScript 有一个显式返回值 这是它与 evaluateJavaScript 的 另一个区别 如果我不明确返回一个值 则我的完成处理程序 会收到“未定义”作为结果 但它还暗藏一个重要的玄机 如果你的 JavaScript 返回一个 promise 则不会立即调用完成处理程序 而是等待 promise 执行成功 然后用那个 fulfillment 的结果 进行调用 这个代码返回 从调用内置 fetch 方法返回的 promise 这意味着 在通过网络加载该资源的字节之前 不会调用完成处理程序 这只是一个很小的例子 说明了如何使 新式异步 JavaScript 流畅地工作 CallAsyncJavaScript 是评估 JavaScript 的一个很好的补充 但除本地代码对其进行评估之外 我的 app 还有更多方式 来使用 JavaScript WebKittens 的开发人员 内置了一些很酷的功能 例如 如果向服务器端的帖子添加新评论 则会通知该页面并通知你 它甚至会为页面上的其它 JS 触发一个评论事件来监听 我希望我的本机 app 也能监听新评论 以便可以通知本地代码 我用 WKScriptMessageHandler 来实现这一点 该 API 最初被设计为单向通信通道 要使其双向 以处理对脚本消息的回复 需要一些额外的代码 例如 用标识符来追踪每条消息 这个标识符可用于查找后续回复 消息传递系统越复杂 消息追踪机制就需要参与的就越多 需要编写和调试的代码就越多 并且有些竞争条件可能永远无法解决 (未定义) 今年有两个新的变化来改进这一点 首先 postMessage 用于在 JavaScript 中返回“未定义” 因为没有有意义的返回值 (新的PROMISE-全新) 现在 它返回一个 promise 其次 你可以使用一种新形式的 WKScriptMessageHandler 协议 用它来将完成处理程序附加到 它接收到的每条消息 在调用那个完成处理程序时 来自 postMessage 的 promise 就执行成功了 那个等待消息回复的 JavaScript 代码 现在归结为这一点⋯ 通过 promise 的执行成功 来处理对消息的回复 这是一件好事 (更加灵活地呈现) 此刻 我对 app 的 JavaScript 和它清理后的效果感到非常满意 因此我想把注意力转向 确保猫和狗都能正常显示 我能应用我们的几个新 API 以便更加灵活地呈现 这是一个相对老的 web 内容 当时“响应式设计”这个词还没造出来 最初的 WebKittens app 在早期的 iphone 上看起来相当不错 因为编写者为这个特定目的 对其进行了调整 在当初的 iPhone 上查看评论是这个样子
在新式 iPhone 上 查看 WebKittens 评论是这个样子 比 WebKittens app 最初编写时要大得多 你可以看到我添加到 Browser Pets 的 本机用户界面的开始部分 旨在允许从帖子返回 news feed
web 内容本身看起来还可以 但还有很多负空间 在浏览器中 它看起来更像是 2005 年的网站 我想我可以调整网站的外观 以便更好地利用空间 更好地利用屏幕 并更好适应本机用户界面
我决定看看 能否用一些 CSS 来填充用户的屏幕 以解决这个问题 CSS 缩放属性 已经在 WebKit 中使用了十几年 我认为将其应用于整个主体元素 可能会有效
只要缩放值足够大 它就可以占据整个视窗宽度 效果非常理想 但我处理的方式有点繁琐 首先 尽管我在自己的客户端环境中 评估 JavaScript 但这不能改变我以页面可见的方式 更改 CSS 的事实 我不知道这是否会 给 WebKittens 带来问题 但你很容易想象 这可能会在哪些方面带来问题 其次 我选择 在每次浏览时手动执行该操作 因此有点仓促 在执行 JavaScript-to-override-zoom 之前内容是否会显示? 不清楚 (全新) 幸好 WKWebView上有一个解决方案 它就是新的 pageZoom 属性 事实上 这是在 Safari 中 驱动 command-plus 和 command-minus full-page-zoom 的同一属性 我认为很多开发人员会发现 这在很多情况下都很有用
通过在 WKWebView 上使用它 我可以获得 与用 JavaScript 更改 CSS 完全相同的效果 但没有这样做的任何缺点 删除了很多代码 行为更加可预测
接下来 让我们看一条 Pups on Safari 评论 你看到的这些页眉和页脚 旨在使其在网站上显示 和在浏览器中查看效果相同 它们并不是我想要的 我要显示的是本机用户界面 而不是来自网站的这些工件
为了探讨移除它们的方案 我决定在 Web 检查器中进一步了解它们 我注意到元素有这些类 pup-header 和 pup-footer 让我们更深入地了解 看看它们在哪里使用
它们匹配 no-header-and-footer-device 的这个自定义媒体查询 在 CSS 中通常只能看到几种媒体类型 “屏幕”、“打印”等等 而这不是其中之一 我在同事之间进行了一些调查 发现在用于 iPhone 的 Pups app出现之前 还有一个使用原始 Mac WebView 的 Mac app (WEBVIEW.MEDIASTYLE) Mac 中的 WebView 有这个强大的功能 你可以使其以特定的媒体类型呈现自己 通常用于让屏幕冒充打印机 它也可以用于自定义类型 取决于 app 中的上下文 相同的内容可能有不同的呈现方式 (WKWEBVIEW.MEDIATYPE) 我们今年将在所有平台上 将该功能扩展到 WKWebView
通过在 WKWebView 上 设置自定义媒体类型 我可以轻松去除这些元素 并采用可能出现的任何其它 适合我这样的自定义 app 的样式 无需 JavaScript 并且是全局的 而不是按照每次浏览 (使用 WEB 内容) 现在我花了一些时间微调 app 中的外观 我想探索可以添加的 专注于 web 内容本身的其它功能 幸好 今年有一些相关的新 API 供我探索 再看看最后一个 Pups on Safari 帖子 这是一个很火的帖子 有很多评论
我记得 Beth 在这些评论中 开了一个搞笑的玩笑 但通过滚动浏览找到它似乎很麻烦 我更愿意有一个“在页面中查找”功能 但如何实现呢? 如果我需要对查找体验进行深度定制 则可以使用一些 很棒的 JavaScript 查找实用程序 但 WKWebView 现在有一个易于使用的查找功能 它的运行方式与平台上的其它功能类似 这正是我想要的 (FINDSTRING) 我可以对查找进行一些配置 就像 AppKit 和 UIKit API 中的 任何查找一样:方向、区分大小写、包装 或者没有任何配置 它会使用合适的默认值 (BETH 查找) 如果找到结果 则将其选中并滚动到视图中 好了 (SCRUFFY 让我想起那只有山羊胡的狗 它说我长得像 BRADY) 那个笑话不像我记忆中那么好笑 一个像样的 app 需要做的另一件事是共享内容 我想不出比最可爱的 web 小猫 和 Safari 上最讨人喜欢的小狗 更值得分享的内容 几年来 WKWebView 一直支持 为其内容拍摄位图快照的功能 这在很多情况下都很有用 但这仅限于屏幕上的内容 无论实际上有多少内容
例如 如果添加一个功能 来放大这张照片的全分辨率版本 我们只能捕获可见的东西 更不用说了 取决于你的目标 位图图像可能不适合 我认为共享该内容的 另一种好方法是 PDF 形式 今年 WKWebView 将对此提供支持
你可以配置一些 有关如何捕获 PDF 的选项 或者如果你只想获取 视图中所有内容的 PDF 包括屏幕上当前不可见的内容 使用默认配置调用 createPDF 该代码会以一个 PDF 文档的形式 共享整个帖子 包括所有可搜索文本形式的评论 如下所示 我告诉过你这是一个很火的帖子
在使用 WebKit 时 我经常发现另一种 有用的内容快照类型 WebArchive web 存档是 web 内容的当前 DOM 及其需要呈现的子资源的丰富快照 除了是 WebKit 框架首次公开发布以来 一直支持的文件格式外 它也是我们所有平台上 web 内容的本机粘贴板格式
在第一次调试 Browser Pets 中的 合并 news feed 的问题时 我希望利用 WebArchives 来帮我 尽管 WKWebView 自首次发布以来 就可以加载 WebArchive 文件 但它无法保存它们 (CREATEWEBARCHIVEDATA) 直到现在 通过 createWebArchiveData 我现在可以拍摄 web 内容的快照 以便以后进行调试和测试
像拍摄位图快照或创建 PDF 一样 这是一种请求 WebArchive 数据 并在完成处理程序中获取结果的简单方法 我可以将这些数据保存到磁盘上 以备以后使用 也可以将其放到粘贴板上 甚至可以立即将其加载到 另一个 WKWebView 正如我提到的 WKWebView 始终能加载 WebArchive文件 我从一些开发人员那里听说 他们以为情况并非如此 所以我想分享 用来加载 WebArchive 的代码 它是有适当 mimeType 的 load(data
通过位图快照、PDF 和 web 存档 我们有越来越多的方法 来充分利用 WKWebView 还有一个更重要的 正如我之前提到的 WebKittens 和 Pups on Safari 是任务关键型工具 一些团队成员甚至 靠在纸上打印出他们喜爱的宠物 来获得一整天的动力 (真实的 WEBKIT 工程师) 由于Browser Pets 是全新的 我当然使用了 SwiftUI 而且我得以构建了 Mac 版本的 app 但我知道打印对这些团队成员来说很重要 一段时间以来 iOS 上已经可以打印 WKWebViews 了 但 Mac 开发人员就没有那么幸运了 直到 macOS Big Sur 如果你对这感兴趣 请在 SDK 中查找它 并尝试一下 (PRINTOPERATIONWITHPRINTINFO) 在继续介绍几个 能在 app 方面帮助你的 API 之前 我知道你们中许多人 也关注 web 内容本身 我们一直致力于开发新的 能在平台上大放异彩的面向 Web 的功能 今年也不例外 结束之后 我建议你看看 “Web 开发者的新增功能”讲座 (尊重隐私) 最后 我很高兴与大家分享 关于用户隐私的激动人心的公告 以及它们如何影响 使用 WKWebView 的开发人员
你以前可能听 Apple 这样说过 但以防万一 我现在会重复一遍 我们坚信 隐私是一项基本人权 这一信念是我们的核心价值之一
我们在设计 iOS 和 App Store 时 考虑到了这一点 我们力求防止任何本机 app 在未经用户同意的情况下 使用私人信息 不仅在政策层面 而且在技术层面 我们每年都在这方面做得更好 Web 是不同的 在用户浏览万维网时 通常至少有一方在监视他们 没有管理者 一些 web 技术似乎已经发展到 鼓励而不是防止追踪用户
我们意识到 有了 WebKit 我们可以对此做点什么 (智能防跟踪功能) 我们开始开发智能防跟踪功能 或称 ITP ITP 用各种客户端启发法和机器学习 来识别、分类和阻止跟踪器
自 2017 年将其添加到 Safari 以来 我们一直在不断改进它 并且我们不会停止 自从将 ITP 添加到 Safari 之后 许多 WKWebView 开发人员 一直要求在其 app 中使用它 我们很高兴地宣布 在 iOS 14 和 macOS Big Sur 中 所有 WKWebView app 都默认启用了 ITP 用户掌握控制权 例如 如果你有一个通用的 web 浏览器 用户可能需要禁用 ITP 以便与你无法控制的网站兼容 大多数人不会遇到这种情况 但就像我们在 Safari 中看到的那样 你可以用 API 来指示用户将其禁用 事实证明 智能防跟踪功能 是保护网络用户隐私的一种有效方法 但我们并没有止步于此 在试图想出其它保护网络用户的方法时 我们发现了在 app 中 使用 web 内容的三种常见方式
最容易理解的或许是 像 Safari 这样的通用 web 浏览器 这些 app 的主要作用是 显示来自任何来源的 web 内容 并帮助用户管理 与 web 浏览任务相关的重要事项
与通用 web 浏览器相反的是 仅局限于一个或几个网站的 app 不管它们如何平衡 本机用户界面和显示 web 内容 web 内容本身 都是 app 核心实现的一部分
然后还有 app 内浏览器 通常从特定于 app 的域开始 它们聚合来自许多不同来源的内容 通常允许用户 从其中任何一个来源开始浏览 一个很好的例子是社交媒体 news feed 很像 Browser Pets (app 绑定域) 对于最后两种类型的 app WKWebView 有一个 名为 app 绑定域的新功能 这个想法很简单 你可以指定哪些域 是 app 运行的核心部分
这使你能通过实行最小权限原则 来设计安全的 app 与非 app 核心的 web 内容 进行深度交互被禁用 无论对于你编写的代码 还是你可能从框架或资料库引入的 任何其它代码 都是如此
这会影响我的 Browser Pets 帖子上的评论可以链接到其它域 以了解更多关于猫和狗的信息 我想允许这些链接 我也可以安全地这样做 只要我将 app 绑定域限制为 WebKittens 和 Pups on Safari
在我不深入了解其结构或功能的其它域 用户数据不可能 被意外泄露 或被故意泄露 如果用户遇到 Web 上的不良行为者 我不一定知道该网站的开发人员 可能有什么险恶的计划 (嗨 我叫 Tim 我养动物) 使用它很容易 你只需要将 WKAppBoundDomains 的条目 添加到 app 的 info.Plist 然后将其指向一组域 以下是我如何在 Browser Pets 中采用它 仍然可以加载任何其它域 但在技术层面阻止了与其它域的深度交互
甚至可能在你的 app 中 禁用与所有域的深度交互 只需将密钥添加到 有一组空值的 info.Plist 如果加载任意内容 但不需要与 web 内容本身进行任何交互 则这是一个最佳实践
我们今天就说这么多 我们把显示来自两个独立网站的内容 的两个独立的 app 集成到一个 news feed Safari 和 WebKit 团队 的士气从未如此高涨 在该过程中 我们确保了 app 的 JavaScript 与 web 内容本身隔离 我们利用 callAsyncJavaScript 和 postMessageWithReplies 极大地简化了 JavaScript 逻辑 我们用影响呈现的新 API 对内容的显示方式进行了微调 我们添加了一个简单的“在页面中查找” 和一个强大的“以 PDF 格式共享”功能 以及在 Mac 上打印 我们通过采用智能防跟踪功能 和 app 绑定域 来自始至终尊重用户的隐私 所有这些功能都是 由开发人员的反馈直接驱动的 我们知道还没有满足所有人的要求 但请记住 我们的工作还没结束 我们迫不及待地想让你试用这些新的 API 我们真诚地希望继续了解 你在 WKWebView 中还需要什么 除了向 Apple 反馈外 webkit.org 还有多种联系方式 包括指向我们的 Slack 和众多邮件列表的链接 WebKit 是非常开放的源代码 因此你也可以在这里学习查看和构建 以及提出故障的方式 我们也有 Twitter 帐户 如果你想及时了解新的面向 Web 的功能 Web 检查器增强功能 以及在后续版本中 可能会看到的其它好东西 我们通常每两周更新 Safari 技术预览 你的文件中应该使用 Purple Safari
感谢观看 我希望你享受剩余的 WWDC 2020
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。