本文主要参考:如何从Mac Catalyst Apps访问AppKit API,写得有点复杂,我就按我的想法重新写了一遍过程。
Demo地址:AnimationPreviewer,用UIKit开发的Mac App
Demo。
Lottie,有时候我想先看效果再写代码,但想看效果就得去官网上传文件才可以预览,感觉好麻烦。不如我自己写个demo来直接预览效果吧,不过要先把文件丢进项目再跑起来才能预览,同样好麻烦...
突然想到,用Drag and Drop
的话,是不是能打开个模拟器,直接把文件丢进去得了?试了下,不支持从Mac丢文件进模拟器的...
那只能搞个Mac App咯,还好SwiftUI支持多平台开发,然而,UIKit的代码(预览lottie这部分的代码),不能运行在Mac环境上...
那咋办,基本代码已经写好了,实在不想用AppKit重新写一套... 经百度谷歌,原来苹果很早之前就推出了Mac Catalyst
,用于开发者使用UIKit开发Mac App,真的孤陋寡闻了。
Mac Catalyst的使用
- 创建一个UIKit工程,然后添加
Mac Catalyst
:
就这么简单,可以在Mac上运行iOS App了。
不过既然开发Mac App,一般都会需要用到AppKit
,例如设置菜单栏和状态栏之类的,而我这个小工具需要跟Mac进行数据交互,就需要使用AppKit
去访问,继续。
- 首先添加Mac环境的Target:
有了这个Bundle就可以在这个Target里面使用AppKit
的代码了(也就是在Mac环境下)。
- 导入Bundle:
Bundle只选择Mac Catalyst
平台可使用,否则会报错,因为主Target是iOS环境,不认识AppKit
。
- 创建一个Channel协议类
这个Channel
是用来打通iOS和Mac、用于通信的协议类(主Target和刚刚添加的Bundle Target都能访问)。
接着Mac这边创建一个名为MacPlugin
且遵守该协议的类,MacPlugin
是专门用来在Mac这边做事情的:
而iOS这边就创建一个MacChannel
类,然后通过Channel
类型抽象创建一个MacPlugin
的全局静态对象:
这样就可以在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 Catalyst
和AppKit
的基本使用。
快速预览 Lottie & SVGA
- 把
Lottie文件
/SVGA文件
/zip包
丢进App即可
截取动画任意一帧生成图片 & 导出动画视频
- 目前仅支持
Lottie
可导出动画视频
Demo地址:AnimationPreviewer
- 使用
Xcode
运行项目需要先编译MacPlugin
,然后才可以运行项目。 - 项目编译之后可以把安装包丢到应用程序里面,以后直接在启动台中打开。
- Release中提供dmg安装包。