大多数浏览器和
Developer App 均支持流媒体播放。
-
将 iOS App 带到 Mac 上
学习为您的 iOS App 打造一流 macOS 体验的所有不同方式。我们将探索将您的 App 引入 Mac 的最佳实践,无论您为 M1 Mac 提供 iPad App,或者利用 Mac Catalyst 为所有 Mac 开发 App。了解最新的工具、选项和 API,帮助您对体验进行优化。我们还将向您介绍如何优化您的 Mac 版 App,解释如何在使用 Mac Catalyst 进行开发时将桌面级 iPad 功能自动转换成 Mac 原生功能。
资源
- Human Interface Guidelines: Designing for macOS
- Human Interface Guidelines: Mac Catalyst
- Supporting desktop-class features in your iPad app
相关视频
WWDC22
WWDC20
-
下载
♪ ♪
Owen: 大家好 欢迎参加 将 iOS app 带到 Mac 上 我叫 Owen 是一名 Mac Catalyst 工程师
无论您是在 M1 Mac 上 原封不动地发布您的 iOS app 还是已经开始考虑用 Mac Catalyst 更进一步 或者已经发布 Catalyst app 并希望做得更好 我都很高兴分享新的 API 和技术 让您的 App 在 Mac 上做到最好 但首先 我想通过一些 由开发者完成的令人惊叹的工作 展示 Mac Catalyst 的可能性 Craft 是一款令人难以置信的 App 可以毫不费力地开始 编写和制作漂亮的文档 也入选了 App Store 2021 年度 Mac App 多亏了 Mac Catalyst 我们可以在各种设备上 获得这种出色的体验 当您的下一个想法出现时 它随时准备就绪 Darkroom 的智能 AI 编辑工具 简化了您的摄影工作流程 您可以在 iPhone 或 iPad 上 开始现场编辑 并在家里用他们的 Mac Catalyst app 完成之后的编辑 它因出色的设计 创新和独创性 获得了 Apple 设计奖 并自 2018 年以来一直是 App Store 编辑推荐的 app
Night Sky 是直接从您的计算机 探索宇宙的绝佳方式 您可以了解星座 并通过详细的 月球 行星和卫星 3D 模型 近距离观察这些星球 它因其设计和令人惊叹的视觉效果 赢得了多个威比奖和洛维奖
狂野飙车 9 竞速传奇是是一款 令人振奋的高辛烷值赛车模拟游戏 也是唯一赢得 Apple 设计奖的赛车游戏 而在 Mac Catalyst 版本中 大屏幕上的动作更令人兴奋
现在 我将介绍可以在 Mac 上 为您的 App 创建良好体验的 所有方法 我将从几个新选项开始 来讲一下在 M1 上原生运行iOS app 这些是将现有 iOS app 发布到 Mac 上最简单的方法
然后 我将介绍如何在 Xcode 中 添加一个 Mac Catalyst 运行目标 并介绍做出的更改
我将展示当您采用新的 桌面级 iPad API 时 您的 Catalyst app 可以免费获得的新行为
然后深入研究 Mac 特有的改进 新的 Mac Catalyst API 使之成为可能
我将从 M1 的 Mac 为原生 iOS app 提供的一些新选项开始
您的 iOS app 已经可以在 M1 Mac 上的 Mac App Store 中下载了 只要您没有选择退出 您的 App 就会在搜索中出现在 iPhone and iPad Apps 标签下 我们还增加了几个新功能 可以改善您在 Mac 上的应用体验 您可以将两个新的键值 添加到您的 Info.plist 中 这可以让您指定 iOS app 在 Mac 上的启动方式 这些键值不绑定任何 SDK 版本 在 iOS 和 macOS 12.1 之前的 Mac 上都是被忽略的 所以它们可以安全添加到 任何会受益的 App 中
第一个键值 “UISupportsTrueScreenSizeOnMac” 表明您的 App 已经为 它可能遇到的各种显示配置 做好了准备 通过这种方式 您的 App 可以获得真实的屏幕尺寸 和像素密度 而不是兼容的 iPad 尺寸
第二个键值 “UILaunchToFullScreenByDefaultOnMac” 告诉系统您的 App 希望在启动后 立即进入全屏模式 这两个键值可以很好地协同工作 特别是对于游戏和多媒体应用程序 提供像素完美 无边框的全屏体验
这些键值已被获奖的 Sky: Children of the Light 采用 可以立即提供沉浸的体验 游戏一启动 屏幕上就充满了丰富的细节 把您拉进美丽的探索世界 在 Mac 上改善应用体验的 另一种方法是使用触控替代 它可以自动将键盘 鼠标 和触控板输入 转换为 App 期望的 iOS 多点触摸手势和设备运动 我们已经为 app store 上 许多流行的游戏添加了 内置的触摸替代支持 启动后 它们会自动显示一个教程 解释其触摸控制如何转换为 键盘 鼠标 或触控板 例如 箭头键可用于模拟从窗口中心 进行的滑动 空格键可用于执行轻触
要选择自动开启触控替代 请在您的 App 中创建一个名为 com.apple.uikit.inputalternatives.plist 的 新 plist 文件
首先 添加一个名为 defaultEnablement 的键值 该键值的字符串值为 enabled 它告诉系统立即打开触摸替代
在那下面 添加另一个名为 requiredOnboarding 的键值 这是一个数组 其中包含您认为 最适合您的 App 的控制列表
您可以选择展示 五种不同的控制选项 从触控板上点击 倾斜 拖动 滑动 和来自触控板的直接触控输入
请注意 当启用触控替代时 所有这些控制都将处于开启状态 但您仍应决定哪些 对您的 App 最有意义 并且仅将您想要突出显示的控制方式 添加到您的 onboarding plist 当您的 App 在 Mac 上运行时 会检测到这一选项 并且在首次启动时会显示引导页面 突出显示这些控制方式 在您的 App 设置中 人们可以在显示 plist 中指定的首选控制方式 和所有控制方式之间 进行切换
当然 最好的选择是在您的 App 中 直接实现键盘和光标支持 通过该操作 您可以确保您的 App 在所有设备上都运行良好 包括带有键盘的 iPad 和 Mac
若想了解更多有关信息 请观看视频 “Support hardware keyboards in your app” 和 “Handle trackpad and mouse input” 现在我将快速介绍成为 Mac Catalyst app 的过程
通过在您的项目设置中 添加 Mac Catalyst 目标 您的 App 将自动转换为 能够在每个 Mac 上运行的 完整 Mac Catalyst app 并允许您使用 Mac Catalyst API 对其进行进一步自定义 您还可以选择为 Mac 优化界面 为您提供原生的 AppKit 样式控件 并确保您的 App 内容 以原生规模呈现
我将使用 Markdown demo app 团队一直致力于突出其 iPad 的新功能 当我第一次将它移植到 Mac 上时 它是以 “Scaled to Match iPad” 模式运行的
当我切换到 Optimize for Mac 时 许多更改会自动发生
并排比较时 差异是显而易见的 当该 App 针对 Mac 进行优化时 UINavigationBar 被转换为 丰富的 NSToolbar 提供原生 AppKit 控件 其他控件也会发生这种转换 文本大小也会随之调整 iPad 惯用法中的文本 以 iPad 大小呈现 然后缩小到原始大小的 77% Mac 惯用法中的文本 通过本地 Mac 字体渲染来处理 这种渲染以像素级进行 这对我们的 App 来说很理想 因为它能确保文本看起来总是清晰的 当 App 选择加入 Mac Catalyst 后 我想检查一下它的工作情况 并深入了解由 iPadOS 16 的新 API 提供的新的自适配 Mac 行为 如果您已经看过 “Meet desktop-class iPad” 和 “Build a desktop-class iPad app” 那您已经了解了许多 使用 iPadOS 16 增强 App 的新工具 这些新的 API 完美地转换成了 原生 Mac 表现形式 我将浏览一下 markdown app 并重点介绍其中的一些新行为
控件和导航从 UINavigationBar 转换为 NSToolbar 如果您还没有创建工具栏 我们会自动为您提供一个 如果您已经在 Catalyst 中 管理了自己的 NSToolbar 我们会为您保留原样
中心项目控件变成 NSToolbarItem
对于基于文稿的应用程序 您的窗口标题会显示文稿名称 如果在辅助功能系统设置中 启用了显示窗口标题图标 那么文件代理图标也会显示出来 就像您在 Mac 上看到的那样
如果您使用导航控制器 后退按钮和其他导航控件 也会出现在工具栏中 此外 您还可以在文件菜单中 获得新的以文档为中心的 菜单项 复制 移到 重新命名 和 导出为
要启用这些菜单项 请确保响应链中的某个对象 重载了 UIResponder 的 duplicate move rename 和 export 这些函数
如果您的 App 不需要这些文件菜单项 可以用 UIMenuBuilder 把它们去掉 在 App delegate 上实现 buildMenu 方法来控制 App 菜单
新文档菜单项的 UIMenuIdentifier 值为 .document
如果您的 App 包括搜索栏 它也会被自动加入 NSToolbar 首先显示为一个搜索按钮 单击会扩展为搜索栏 支持它的 UISearchTextField 驻留在 NSToolbarItem 内部 这也可用于自定义视图 搜索建议菜单和搜索范围栏 也被转换成原生 AppKit 控件
除了通过采用桌面级 iPad 功能 免费获得的所有新 Mac 行为 我们还添加了 几个新的 Catalyst-specific API 来改进多窗口和工具栏行为 我将再次浏览我们的 Markdown app 并混合使用新旧 API 添加 这些特定于 Mac 的功能 从现有的 Mac Catalyst API 中 我选择了几个真正能增强 我们的 App 的
我采用了 Mac 惯用法来获得 原生控件和自动 NSToolbar 我添加了一个自定义指针 因此当鼠标移动到 自定义拆分视图中间的滑块柄上 指针将切换为 水平双箭头 指示拆分可以调整大小
我还用 UIApplicationSupportsPrintCommand plist 键值 添加了打印支持
当考虑到您的 App 时 不用觉得您需要添加 这里面的每一项功能 相反 请考虑您创建的 App 类型 以及哪些功能最适合它 查看 Mac 和 Mac Catalyst Human Interface Guidelines 并在您使用的其他 App 中寻找灵感
实现了这些功能后 该 App 已经非常出色了 现在有了一些新的 Mac Catalyst API 我可以做的更多 我们添加了新的选项 来定制 App 窗口框和控件 在 NSToolbar 中显示 UIView 内容 以及从工具栏项目中显示弹出窗口 我将继续使用这些新的 API 在 Mac 上进一步改进我们的 App 从窗口开始
Catalyst app 使用现有的 UIWindowScene API 支持多个窗口 在 macOS Ventura 中 我们新增了 API 让您 可以进一步自定义 App 窗口 设置交通灯窗口控件的样式 以编程方式调整窗口大小和位置 以及针对特定窗口禁用全屏
我将使用这些工具 向 markdown app 添加一个功能 通过一个有用的辅助面板 显示markdown 语法 使用新的几何属性请求 API 此面板将变小 并禁用其最小化和缩放按钮
在窗口创建时 在我的 Scene Delegate 的 sceneWillConnectToSession 方法中 我创建了我想要的 frame 最好总是从 effectiveGeometry 直接获取当前 frame 开始 在创建窗口之前 它被初始化为 CGRectNull 系统知道在初始窗口创建时 要忽略它的值 我修改了大小 然后通过创建一个 UIWindowScene .macGeometryPreferences 对象 通过 systemFrame 参数 给窗口设置一个新的 frame
然后我使用 scene.requestGeometryUpdate 方法提交更新 因为这是一个请求 系统保留拒绝新几何属性的权利 在这种情况下 它将调用 错误处理回调并提供详细信息 在此处所示的窗口 willConnectToSession 方法中完成时 该请求将应用于 您的 App 的首次启动 但是会被系统在以后启动时 执行的任何适用状态恢复所取代
由于这是一个小的辅助面板 我还从新的 windowScene windowingBehaviors 对象中 禁用了最小化按钮 并从 sizeRestrictions 的新属性中 禁用了全屏显示窗口的功能
当这个新的 Markdown Hints 窗口出现时 它会以我们要求的大小出现 黄色的最小化 和绿色的缩放窗口控制按钮被禁用 只留下红色的关闭按钮
这些选项不仅仅是为窗口创建保留的 在窗口生命周期中的任何时候 您都可以从 只读 resolvedGeometry 属性 检查其当前 frame 根据需要进行修改 并请求新的几何属性更新 下面是另一个例子 展示了如何修改窗口的原点 保持其大小不变
几何属性有两个重要方面需要记住 首先 因为 systemFrame 决定了 Mac 桌面上 窗口的 frame 所以 systemFrame 属性的 一个点的大小 始终是一个 AppKit 点的大小 如果您的 App 针对 Mac 进行了优化 那这与您的 UI 元素的比例相同 然而 如果您的 App 按比例 缩放到与 iPad 匹配 则其比例因子将相差 77% 其次 坐标空间的原点 是主显示器的左上角 如果您有多台显示器 主显示是在系统显示设置中 显示菜单栏的那个
使用新的 Mac Catalyst API 您可以控制三个窗口控制按钮中 每个按钮的状态 UIWindowScene 上新的 windowingBehaviors 对象 有 closable 和 miniaturizable 两个属性 这两个属性 将调整这些相应的窗口行为 并启用或禁用红色 和黄色窗口按钮 绿色窗口按钮既可以 在桌面上调整窗口大小 也可以全屏显示窗口 您可以使用 sizeRestrictions 上的 新属性 allowsFullscreen 来禁用全屏 或者通过使用大小限制 并将最小和最大尺寸设置为 相同的大小来禁用调整大小 通过这两种方式 绿色按钮也被禁用
您可以使用新的 isFullScreen 属性 检查您的窗口当前是否是全屏的 现在我将把重点放在 改进 Mac 的工具栏上 我们为自定义工具栏添加了新选项 无论您是依赖 UINavigationBar 的自动转换 还是在 App 代码中管理 自己的 NSToolbar 都可以用这些选项
Mac Catalyst 中新增了 可以将 UIView 作为项目 添加到 NSToolbar 中 我为我们的 App 设计了 一个自定义 UIView 以显示当前的字数 单击后 它会显示一个弹出窗口 提供额外的详细信息 如段落和章节数 阅读时间和翻译 由于我使用的是新的桌面级别 iPad API 我的 UIBarButton 项目上的 customView 属性 会被自动包装并添加到工具栏中 但是如果您自行管理 NSToolbar 我们还添加了 一个新的 NSToolbarItem 子类 叫做 NSUIViewToolbarItem 您可以像使用任何 其他 NSToolbarItem 一样 使用 NSUIViewToolbarItem 从 NSToolbarDelegate 的 itemForIdentifier 方法实例化工具栏项 初始化通过打包一个 UIView 然后将其插入 NSToolbar
NSToolbar 要求 在工具栏自定义模式下 工具栏项实例都是唯一的 如果您从 UINavigationBar 使用自动 NSToolbar 托管 系统会自动克隆视图 以进行工具栏自定义 但是 如果您管理自己的 NSToolbar 那么您的代理就需要为 每个 NSUIViewToolbarItem 实例 创建唯一的 UIView 实例 而不是重复使用相同的 UIView 实例
使用工具栏中的新项目 我将添加 popover 行为 在工具栏项的操作中 我创建了 popover 视图控制器 并将其 sourceItem 设置为我的工具栏项 然后我来展示 popover
有了 popover 代码后 单击工具栏项会在 锚定在工具栏项上的 popover 展示中显示更多详细信息
与 Mac Catalyst 中的其他控件一样 您可以通过使用 UINavigationBar 上的新属性 preferredBehavioralStyle 来选择 是否使用导航栏转换 它的默认值是自动的 但您可以将其设置为 .mac 以显式请求转换 通过将其设置为 .pad 您的导航栏将不再自动转换
使用这些选项 您可以向 App 的工具栏 添加新的自定义层
我们会很高兴看到您使用这些新工具 使您的 App 变得更好 当您的 iPad app 自动出现 在 Mac app store 中 它可供全新的受众使用 当您上传您的 iPad app 时 请在 Mac 上运行它并亲自尝试 或者通过转成 Mac Catalyst app 将其提升到新的水平 并使用 iOS 16 和 macOS Ventura 中的新 API 使您的 App 达到最佳状态
将您的 App 带到 Mac 上很容易 我们很愿意展示您的辛勤工作 并迫不及待地想要尝试 您接下来要构建的内容了 谢谢大家
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。