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

Demo地址:LottiePreviewer,用UIKit开发的Mac App Demo。

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

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

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

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

Mac Catalyst的运用

  1. 创立一个UIKit工程,然后增加Mac Catalyst

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

就这么简略,能够在Mac上运行iOS App了。

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

  1. 首要增加Mac环境的Target:

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

有了这个Bundle就能够在这个Target里边运用AppKit的代码了(也便是在Mac环境下)。

  1. 导入Bundle:

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

Bundle只挑选Mac Catalyst渠道可运用,不然会报错,因为主Target是iOS环境,不认识AppKit

  1. 创立一个Channel协议类

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

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

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

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

而iOS这边就创立一个MacChannel类,然后通过Channel类型笼统创立一个MacPlugin的大局静态对象:

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

这样就能够在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下一行代码集成跨运用间拖拽传递数据。

LottiePreviewer

LottiePreviewer是一个用于快速预览Lottie的Mac小工具,便是用Mac Catalyst开发的,功能很简略,便是预览Lottie罢了,最主要是想熟悉一下Mac CatalystAppKit的根本运用。

  • 快速预览lottie(把zip包丢进App即可)

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

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

Demo地址:LottiePreviewer

  • PS:编译之后把安装包丢到运用程序里边今后直接运用。