【iOS】Mac Catalyst 初体验 - 使用UIKit开发Mac App

7,234 阅读3分钟

本文主要参考:如何从Mac Catalyst Apps访问AppKit API,写得有点复杂,我就按我的想法重新写了一遍过程。

Demo地址:AnimationPreviewer,用UIKit开发的Mac AppDemo。

Lottie,有时候我想先看效果再写代码,但想看效果就得去官网上传文件才可以预览,感觉好麻烦。不如我自己写个demo来直接预览效果吧,不过要先把文件丢进项目再跑起来才能预览,同样好麻烦...

突然想到,用Drag and Drop的话,是不是能打开个模拟器,直接把文件丢进去得了?试了下,不支持从Mac丢文件进模拟器的...

那只能搞个Mac App咯,还好SwiftUI支持多平台开发,然而,UIKit的代码(预览lottie这部分的代码),不能运行在Mac环境上...

那咋办,基本代码已经写好了,实在不想用AppKit重新写一套... 经百度谷歌,原来苹果很早之前就推出了Mac Catalyst,用于开发者使用UIKit开发Mac App,真的孤陋寡闻了。

Mac Catalyst的使用

  1. 创建一个UIKit工程,然后添加Mac Catalyst

image.png

就这么简单,可以在Mac上运行iOS App了。

不过既然开发Mac App,一般都会需要用到AppKit,例如设置菜单栏和状态栏之类的,而我这个小工具需要跟Mac进行数据交互,就需要使用AppKit去访问,继续。

  1. 首先添加Mac环境的Target:

image.png

有了这个Bundle就可以在这个Target里面使用AppKit的代码了(也就是在Mac环境下)。

  1. 导入Bundle:

image.png

Bundle只选择Mac Catalyst平台可使用,否则会报错,因为主Target是iOS环境,不认识AppKit

  1. 创建一个Channel协议类

image.png

这个Channel是用来打通iOS和Mac、用于通信的协议类(主Target和刚刚添加的Bundle Target都能访问)。

接着Mac这边创建一个名为MacPlugin且遵守该协议的类,MacPlugin是专门用来在Mac这边做事情的:

image.png

而iOS这边就创建一个MacChannel类,然后通过Channel类型抽象创建一个MacPlugin的全局静态对象:

image.png

这样就可以在iOS这边叫MacPlugin去帮忙干Mac的活了,类似Flutter的Channel,让它专门去跟Mac那边对接:MacChannel(iOS) --> Channel --> MacPlugin(MacOS)

使用Drag and Drop

我的目的是想直接丢文件进来就可以预览,这样就不用每次重新跑项目,经实测,Mac Catalyst支持在Mac上使用UIKit的Drag and Drop,至于Drag and Drop的用法网上很多介绍,这里不赘述了,可以看看这篇文章:DragAndDropKit-iOS15下一行代码集成跨应用间拖拽传递数据

AnimationPreviewer

AnimationPreviewer是一个用于快速预览Lottie&SVGA的Mac小工具,就是用Mac Catalyst开发的,功能很简单,就是用来快速预览Lottie和SVGA,最主要是想熟悉一下Mac CatalystAppKit的基本使用。

快速预览 Lottie & SVGA

jp_gif_file 2.GIF

  • Lottie文件/SVGA文件/zip包丢进App即可

截取动画任意一帧生成图片 & 导出动画视频

jp_gif_file 3.GIF

  • 目前仅支持Lottie可导出动画视频

Demo地址:AnimationPreviewer

  • 使用Xcode运行项目需要先编译MacPlugin,然后才可以运行项目。
  • 项目编译之后可以把安装包丢到应用程序里面,以后直接在启动台中打开。
  • Release中提供dmg安装包。