大多数浏览器和
Developer App 均支持流媒体播放。
-
带有 M1 的 Mac 上的出色 iPad 和 iPhone app 的质量
现在比以往任何时候都更加容易在带有 M1 的 Mac 上提供您的现有 iPad 和 iPhone app。我们将向您展示如何将您的 app 移植到 macOS,并探讨系统如何自动衔接您的 app 的各种功能,以便在 Mac 上工作。我们还将结合 macOS Monterey 中的改进,例如 Apple Pay 支持、改进的 AV 处理和快捷指令等,提供关于您的 iPad app 中最佳实践的指导,从而在带有 M1 的 Mac 上提供最完整的体验。
资源
相关视频
WWDC21
- 为快捷指令、Siri 和建议设计出色的操作
- 使您的 iPad App 更上一层楼
- 出色 Mac Catalyst app 的质量
- 探索 Xcode 中的高级项目配置
- 聚焦 iPad 键盘导航
- 认识 Mac 上的 TestFlight
- 认识 macOS 快捷指令
- Mac Catalyst 中的新功能
WWDC20
-
下载
你好 我是尼尔斯贝克 欢迎收看 《M1芯片Mac上 卓越iPad和iPhone应用程序的特性》
Mac App Store上已经有 超过一百万iPad和iPhone应用程序 可用 这些应用程序 在macOS Big Sur上的体验很好 而我们在macOS Monterey上 更进一步改善了体验 在这部视频中 我们会讨论 我们如何将几个iOS API 映射到对应的Mac功能 一些要记住的通用最佳实践 它们会帮助你的应用程序 在M1芯片Mac上大放异彩 我们在macOS Big Sur 还有在macOS Monterey 软件更新中做的改善 然后在最后谈 Mac App Store部署的考量 M1芯片Mac上的 iPad和iPhone应用程序 是让你现有的应用程序扩展到Mac 最容易的方式 这是你提交至iOS App Store 并通过审核的iPad或iPhone应用程序 它未经修改 就能通过Mac App Store 提供给任何拥有M1 Mac的人 为了达成这点 我们将重点放在兼容性 尽可能将系统 API 映射到Mac上自然对等的事物 我们的目标是确保你能 不做出任何变更 就能在Mac上有流畅的应用程序体验 而大多数既有应用程序 都运作得很顺利! 从小型iPhone实用程序 到尖端iPad游戏和专业化 App都是 现在也支持多种扩展 例如分享扩展、WidgetKit小组件 照片编辑扩展 VPN网络扩展、音频单位 还有好多 所以很有可能你既有的 iPad或iPhone应用程序 已经可以顺利在Mac上运行 无须做任何调整 当然 我们支持所有基本功能 例如文字交互、复制粘贴 Mac菜单栏等 但也有很多高级功能 像是后台应用程序刷新、用户通知 摄像头访问、Siri意图 还有更多 这些主题有很多都在 《iPad and iPhone apps on Apple silicon Macs》中提到 请观看那部视频以了解更多细节 当你想让你的应用程序 进一步善加利用更多Mac的功能 考虑打造一个Mac Catalyst版本的 应用程序 若想了解更多 请观看 《Qualities of a great Mac Catalyst app》 和《What's New in Mac Catalyst》 现在我们来进一步了解 我刚提到的其中一些API 你大概已经用这些让你的应用程序 在iPad和iPhone上有良好体验 我们流畅桥接这些API 让你在Mac上也能获得 一样的卓越功能 你自然可以用Mac键盘 在文字字段输入文字 还有用于UIKeyCommand键盘快捷方式 但如果你需要更多控制权 想写你自己的按键处理 可以用UIResponder上的 UIPress API做到 所有Mac都有实体键盘 所以应用程序若在之前花时间添加 iPad和iPhone实体键盘支持 在Mac上的体验也同时大幅提升 接着 我们来谈菜单栏 提醒一下 Mac菜单栏的目的是 提升应用程序功能和键盘快捷方式的 可发现性 菜单栏架构在启动时决定 并且在那之后应该不太会变动 项目不会被添加或移除 而是根据它们目前是否适用 被启用或禁用
我们会考量你的应用程序的功能 自动生成你的应用程序的菜单栏 例如 我们可能会添加菜单项目 以创建新窗口 用于富文本 或是变更设备方向 请注意通过keyCommands属性 直接附加至UIResponders的 UIKeyCommands 不会出现在菜单栏 但它们的键盘快捷方式 在适用的情况下 会优先于菜单项目的快捷方式 你可能已经在用较新的 我们在iOS 13推出的 UIMenuBuilder API 这会添加语义架构 到你的UIKeyCommands 这个架构会出现在键盘快捷方式菜单 键盘快捷方式菜单会在iPad上用键盘 按住Command键时出现 在Mac上 传递到生成器之中的 默认架构会不同 但你对架构做出的自定义 会反映在主菜单中 UIKeyCommands靠响应链 寻找适用它们的操作的目标 这会决定菜单项目是否启用 若想知道更多细节 请看 《Take your iPad apps to the next level》 《Focus on iPad keyboard navigation》 和《Qualities of a great Mac Catalyst app》视频 在iPad和iPhone上 利用UIDragInteraction 和UIDropInteraction 进行拖放的应用程序 这也会自动移植到Mac上 这让人能在你的应用程序 和其他应用程序之间 流畅拖动内容 像是这个例子 我将QR码从Qrafter拖动到我的桌面 而对于用 UIPrintInteractionController 打印的应用程序 当你的代码启动打印功能 它会自动桥接到Mac打印对话框 更好的是 当你采用新的Info.plist键 “UIApplicationSupports PrintCommand” 并实现对应的标准打印操作 “打印”和“导出为PDF”菜单项目 会自动被添加到 你的应用程序的菜单栏 若想了解更多这个新API的细节 请看 《What's new in Mac Catalyst》 很多应用程序使用settings bundle 我们会自动 从此生成Mac风格的首选项面板 把制作者名单放在settings bundle 也是常见作法 我们会辨别出这些案例 并为你将那段文字移到“关于”当中 但如果你想要更能控制 Mac上的关于框显示内容 你现在也可以 选择添加制作者名单文件 到你的bundle 你可以用RTF、RTFD或HTML文件 就跟Mac应用程序的作法一样 有几个以iPad为中心的API 可以让你的应用程序 成为很棒的iPad应用程序 这些都能在Mac上很好地呈现 所以 通过制作卓越的iPad应用程序 你的应用程序 在M1芯片Mac上也能表现得更好 如果你的应用程序 根据UIApplicationSupports MultipleScenes Info.plist键 支持多场景 每个场景会转换成分开的窗口 我们会自动添加一个菜单项目 以创建新场景 在Mac上 系统范围内的设定决定 是否在应用程序退出时关闭所有窗口 或是否在下一次启动时还原既有窗口 如果你的应用程序支持多场景 我们尊重这个设定 所以如果所有场景断开连接 或是状态还原在某些情况下 没发生的话 也别太意外 另一方面 iPad多任务支持 会自动在macOS上转换成 可调整大小的窗口 因为你的应用程序已经支持 iPad上的动态布局变更 你会在Mac上获得实时 可调整大小的窗口 你可以限制允许的场景大小范围 方法是用UIWindowScene的 minimumSize和maximumSize API 注意当窗口大小调整 只有窗口场景大小会改变 另一方面 UI屏幕大小会继续 报告设备大小 在这例子中不会变更 所以要记得计算布局时 不要用屏幕大小 就算在iPad上也是 不然你的UI元素会出现在不对的地方 如果你的应用程序预期控制 设备的整个屏幕 我们会用固定的场景大小和纵横比 但窗口内容可能会 以对你的应用程序透明的方式 按需要放大或缩小 如果你的应用程序支持多个 用户界面方向 窗口方向可以变更 方法是使用自动添加的菜单栏项目 或是拖动窗口的边框 这里 我用菜单栏项目变更 Chess.com应用程序的方向 而用户界面会适应 以善加利用每个设备方向 这些改进还有其他映射能够移除 把iPad或iPhone应用程序 移植到Mac上时 会遇到的大部分阻力 但我们来谈谈 一些你该遵守的编程实践 以确保你的应用程序 能在所有平台上顺利运行 包含Mac 使用Apple框架时 很重要的一点 是只使用正式支持的API 因为我们的框架中的未记录方法 可能不存在Mac上或是可能随时变更
避免将路径硬编码到文件系统位置 因为路径在Mac上可能不同 例如 路径不要用 “/private”前缀 或“var mobile”前缀 而是应该使用适合的API 在运行时决定每个路径 类似的情形 对于不是由你直接控制的UI 最好不要在你的代码中有任何关于 视图和警报在屏幕上的位置的假设 或视图层次结构的确切设置的假设 因为这些在Mac上可能大大不同 请也注意可用的 摄像头分辨率和方向 在Mac上可能很不一样 例如 如果你的iPhone应用程序 在拍照时是纵向 你可能预期用摄像头拍出来的照片 也是纵向 但当Mac上的应用程序是纵向 这不一定成立 你可能会获得横向的图像 因为那是摄像头的设置方向 我们已经纳入好几个启发式 以改善和许多应用程序的兼容性 例如 我们会给你 Mac的前置摄像头的照片 就算你请求用后置摄像头 但更好的作法是用 AVCaptureDeviceDiscoverySession 和相关AVFoundation API 收集可用摄像头的信息 和它们的true属性 例如预览尺寸 你的目标应该是让UI能顺利处理 所有可能配置 也要记得有些硬件功能 在Mac上不可用 你的代码应该要能够优雅处理 这种情况 并提供替代方案 例如 ARKit的增强现实 Mac并不支持 如果ARKit是应用程序的核心功能 你应该已将它设定为必要设备功能 所以你的应用程序不会出现在 Mac App Store中 但如果ARKit是可选功能 你应该要检查适当的 ARConfiguration子类的 isSupported属性 为了在Mac上和其他地方 获得最佳体验 记得只在有AR功能的设备上 在你的UI中显示AR功能
如果你的应用程序依赖直接多点触控 或CoreMotion 考虑额外提供较适合 Mac键盘和触控板的替代方式 虽说如此 Touch Alternatives 在这个情况中也许有帮助 我待会会多介绍细节 如果你用CoreLocation 就算没有准确位置数据可用 你的应用程序应该仍然可用 例如 你可以提供手动位置输入 作为替代方式 就像这个Lowe应用程序 接着 我们来了解一些 自从Mac开始配置M1芯片后 做出的改进 对于iPad和iPhone应用程序的窗口 在Mac上的行为 我们在macOS Big Sur 11.3中 做出好几个改进 如果你的应用程序有固定内容大小 因为它不支持多任务 但支持大型设备尺寸 现在我们会在启动时选择 应用程序启动的屏幕中 放得下的最大支持设备大小 对你的应用程序而言 设备大小 在整个会话中还是会维持固定不变 但窗口会更好利用可用空间 也有个首选项是用 最小支持设备大小 像我之前提到的 窗口内容 会按需求缩放 例如 当我将窗口以全屏显示 窗口内容会自动放大 以适应可用空间 同时维持原本的场景纵横比 或是如果窗口在启动后 被移到较小的屏幕 我们会自动按需求缩小 以确保窗口还是符合屏幕大小 现在也可以用窗口缩放功能 在两个缩放因子间切换 一个优先考虑UI元素的自然大小 另一个优先考虑像素完美准确度 这里 我用这个功能切换 Chess.com应用程序的两个缩放因子 游戏控制器从第一天起就通过 GameController.框架支持 在我们所有可玩游戏的平台上 都可用 从macOS Big Sur 11.3开始 我们让大家能够用Mac的键盘 和触控板作为虚拟游戏控制器 所以就算你手边没有真实的控制器 你能轻易用键盘取用 你的游戏映射到控制器按钮的 所有功能 而在macOS Monterey中 我们进一步微调 添加了敏感度滑块 和指针隐藏 就像这个照片上显示的 对应首选项面板 若要了解更多这个框架 请看“Advancements in Game Controllers” 此外 从第一天起 Touch Alternatives 就将键盘和触控板 映射到好几个 原本在Mac上不方便使用的 交互样式 例如多点触控、拖动、点击和轻扫 我们在MacOS 11.3做出几个改进 例如 你现在能够 用虚拟方式倾斜你的设备 这为数个额外游戏开启大门 另外 首选项面板 现在包含很有帮助的图像表示 描绘如何用键盘和触控板 分别访问五种交互样式 另外 我们让应用程序能够 自动选择启用Touch Alternatives 当你选择启用 登录对话框 会在首次启动时出现 以协助用户发现这个功能 图形类似 首选项面板的图形 但我们只强调 你已选的交互样式 在这个例子中 只显示了倾斜和多点触控
如果你判断你的应用程序会受益于 这里任何一种Touch Alternatives 以下是你可以为你的应用程序 从一开始就启用 Touch Alternatives的方式 你只需要添加一个new.plist文件 到你的bundle 叫 “com.apple.uikit.input alternatives.plist” 然后 添加代码片段中显示的键和值 至于requiredOnboarding数组 只包含对你的应用程序有用处的功能 这样只有那些功能 会在登录对话框中被强调 让我为你示范 拿这个iPad游戏为例 它叫做“Assoluto Racing” 未修改便在M1芯片的Mac上运行 这个应用程序自动启用 Touch Alternatives 一开始就是 所以在第一次启动时 这个登录对话框向我们显示 键盘控制 但我们先显示软件键盘 并让窗口以全屏显示 内容现在放大以适应屏幕 而且我们维持了iPad纵横比
我们前往“机场”关卡 进行自由甩尾
这个应用程序使用CoreMotion 所以在iPad上 我可以倾斜设备以控制方向 Touch Alternatives 在M1芯片Mac上启用后 W、A、S和D键会模拟倾斜 我在这用这个方式控制车子 同时用触控板 单击屏幕上的油门按钮 这些对应用程序完全透明 来看看我技术如何
运作得真棒! 不过我需要练练甩尾技巧 我们对macOS Monterey做出更多改进 通过使用我们在macOS Big Sur中 为Mac Catalyst应用程序推出的 同一个增强跨平台API Apple Pay现在可用于 M1 Mac上的iPad和iPhone应用程序 这代表你现在可以在每个可用 Apple Pay的平台上 接受付款 只要用单一的实现即可 只要确定你在 PKPaymentAuthorizationController Delegate上实现 “paymentAuthorizationController, didRequestMerchantSessionUpdate” 的委托调用 若想了解更多 请看视频 《What's new in Wallet and Apple Pay》 我们也让AVKit的全屏视频更棒 AVPlayerView 和AVPlayerViewController 现在能自动用分别的窗口 让视频以全屏显示 这代表就连窗口原本受限于 启动时分辨率和纵横比的应用程序 也能用适合视频内容的方式 完整利用Mac显示器 如果你需要进一步控制 全屏显示体验 我们添加了新的API 到AVPlayerViewDelegate和 AVPlayerViewControllerDelegate
除此之外 AVFoundation支持 M1芯片Mac上的HDR播放和串流 你的应用程序中不需要任何 Mac特定的采用操作 最后 iPad和iPhone应用程序中的 AVKit controls 现在看起来 和在其他Mac应用程序中相同 我们甚至充分利用了Mac触控板 支持新的手势 想了解更多细节 你可以观看 《What's new in AVKit》视频 如果你的应用程序用意图框架提供 自定义SiriKit快捷方式 在macOS Monterey上 现在那些也可用在 M1 Mac上的iPad和iPhone应用程序 若想了解更多快捷方式 请看 《Meet Shortcuts for macOS》 还有《Design great actions for Shortcuts, Siri, and Suggestions》 好消息! 要出现在Mac App Store很容易 事实上 大部分应用程序都是 自动出现在上面 像我之前提到的 在大部分的情况下 在Mac上推出应用程序是合理的作法 毕竟就算是设计为用在移动设备上的 蓝牙锁门应用程序 也可能派上用场 如果你没带手机被锁在家门外 但是手上有你的M1芯片Mac 所以如果你之前选择不让应用程序 上Mac App Store 现在可能是重新考虑的时机 有了Touch Alternatives 全屏视频播放增强等改进 你的应用程序很有可能很适合Mac 若是这样 你只需重新勾选 App Store Connect中的 “Make this app available”复选框 就能让应用程序出现在 Mac App Store上 无论你先前是否选择禁用 你应该要确认 你的应用程序在M1芯片Mac上 运行得很顺利 一旦你有自信用户体验 已达到你的标准 单击App Store Connect中的 验证兼容性链接 如图示 这会移除“Not verified for macOS” 文字 这段文字原本会在Mac App Store中 出现在你的应用程序旁边 并将它取代为“Designed for iPad” 应用程序消费者看到这个会认为 你花时间确认他们在Mac上 用你的应用程序会有良好体验 这个步骤每个应用程序只需做一次 我们也让iPad和iPhone应用程序 在Mac App Store更容易被发现 客户用名称搜寻时 他们不再需要切换到 iPhone和iPad应用程序选项卡 Apple会自动选择 兼容性所要求的建议最低macOS版本 而在大部分情况下这没问题 但在罕见的案例中 你可能希望替代它 改用自定义macOS可用性 例如 你的视频应用程序 可能在Big Sur上运行顺利 但如果你想确保你能取用 AVKit的全屏改进 你可能会决定它应该只可用在 Monterey或之后的macOS 在这个情况下 你有两个选项 不久之后 你将能够 在App Store Connect的 定价和可用性页面 选择不同的最低macOS版本 这对已经在商店中的应用程序很棒 因为你不用重新提交新的版本 或是你可以在Info.plist中指定 LSMinimumSystemVersion 并将这个变更 作为下一次更新的一部分提交 这是对于积极开发中的应用程序 建议的作法 注意这不会取代MinimumOSVersion键 那个键指定iOS最低系统版本 但说真的 两个选项应该都 很少会用到 最后 我们谈一下测试 在macOS上测试 和在iPad上测试很类似 你可以用你已经熟悉的相同工作流 若要在Xcode中进行本地测试 只需选择 我的Mac(为iPad设计)作为运行目标 而调试、单元测试等 都跟在其他设备上一样 至于beta测试 我们为所有 macOS Monterey的应用程序 添加了TestFlight支持 包含iPad和iPhone应用程序 所以你现在可以分发 你的应用程序给 使用M1芯片Mac的beta测试者 要了解更多信息 请看视频《Meet TestFlight on Mac》 那么 欢迎来到Mac! 去验证你的应用程序并选择启用 很简单 只要记住 随着你继续改进 你的iPad和iPhone应用程序 你也是在让那些应用程序 在M1芯片Mac上变得更好 十分感谢 [欢快的音乐]
-
-
7:16 - Limit the range of allowable scene sizes
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let windowScene = scene as? UIWindowScene, let sizeRestrictions = windowScene.sizeRestrictions else { return } sizeRestrictions.minimumSize = CGSize(width: 640, height: 480) sizeRestrictions.maximumSize = CGSize(width: 1920, height: 1080) }
-
15:03 - Automatically enable Touch Alternatives
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>defaultEnablement</key> <true/> <key>version</key> <real>1</real> <key>requiredOnboarding</key> <array> <!-- Only include applicable features! --> <string>Tap</string> <string>Arrow Swipe</string> <string>Scroll Drag</string> <string>Tilt</string> <string>Trackpad Capture</string> </array> </dict> </plist>
-
17:17 - Required delegate method to enable Apple Pay support
optional func paymentAuthorizationController(_ controller: PKPaymentAuthorizationController, didRequestMerchantSessionUpdate handler: @escaping (PKPaymentRequestMerchantSessionUpdate) -> Void)
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。