0dd5df480b0436e55e619114bcefaadb
一些基本没用的有趣研究

最近研究了一些 iOS 11 ~ 12 上面的 Private Frameworks,最主要的目的是造一些比较有用的工具自己用。大家都知道,有私有调用的 app 是很容易被拒的,所以本文讨论的范围仅限于自娱自乐。

AvatarKit.framework

这个框架网上也有一些人研究,做的最好的是 AnimojiStudio,简单说这个框架是 iPhone X 上面 Animoji 的基础,你可以通过调用他里面的一些 API 来实现脱离 iMessage 使用 Animoji,并且能实现录制和分享功能。

其实 AvatarKit 的接口暴露的很彻底,你只需要了解他有个 AVTPuppetView 就能实现大部分的功能了,这个文件可以在这里找到:AVTPuppetView.h。这个类继承自 AVTRecordView,妙就妙在这里,AVTRecordView 自己实现了一套录制流程,你只需要实现这么几个方法:

- (void)startRecording;

- (void)stopRecording;

- (void)audioPlayerItemDidReachEnd:(id)arg1;

- (bool)exportMovieToURL:(id)arg1 options:(id)arg2 completionHandler:(id /* block */)arg3;

其中 export 开头的这个方法可以实现将视频导出到一个 URL,进而实现分享功能。

需要注意的是这个录制默认只支持最多 30s 的时长,如果你想实现更长的录制时间也是有办法的,方法一是 Hack 下面几个参数:

_recordingCapacity

_rawTimesData

_rawBlendShapesData

_rawTransformsData

具体怎么用可以网上找一下,这不是很聪明的办法,更聪明的办法是直接用 ReplayKit,这是一个 Public Framework,任何应用都可以用 ReplayKit 录制应用内的图像并导出文件。

下面是我在 JSBox 上面实现了这套 API 的使用效果:

另外,这里有一篇非常有趣的文章,介绍了如何将 Memoji 移植到 iPad 的 Playgrounds 应用上:Create Memoji on iPad with Swift Playgrounds,非常值得一读。

MarkupUI.framework

大家都知道现在 iOS 内置了一个非常好的图片标注工具,这个工具会在你截图之后自动提示,或者在照片应用里面通过图片编辑扩展调用。我一直就在想,做的这么好的东西如果能用在自己的脚本上岂不是很方便...

遗憾的是这个 Framework 在网上并没有什么人讨论,我只能自己挖 Runtime Headers,挖了一阵子终于找到了:MarkupViewController.h,这个东西用起来比 AvatarKit 还简单,就是一个 UIViewController,你需要调用的接口基本上就是:

- (void)setImage:(id)arg1;

- (void)setShowShareButtonInToolbar:(bool)arg1;

当然了,你直接 present 这个 ViewController 的话可能会发现一些 UI 上的小问题,你可能需要修改这几个 View 的 tintColor"_shareButton", "_shapesPickerButton", "_attributesPickerButton", "_currentColorButton",同时需要重写这两个方法来实现分享编辑后的图片:

- (void)_toolbarShareButtonTapped:(id)arg1;

- (bool)writeToURL:(id)arg1 error:(id*)arg2;

同样的,分享一下在 JSBox 上实现了这套接口的效果:

DocumentCamera.framework

这其实是我最喜欢的一个,也花了多一点的时间去搞清楚 How it works,这个 Framework 就是备忘录应用里面那个超级强大的文档扫描工具,我可以毫不夸张地说这个实现比很多第三方付费的还要好。

但遗憾的是,目前而言在 iOS 里面你依然只能在备忘录里面用:

没用过的朋友可以试一下,总之就是一个字。

同样的,这个 Framework 网上也没有讨论,首先我看了一下 iOS 12 新增了哪些 Private Frameworks(有删减):

```
...

  • /System/Library/PrivateFrameworks/AppPredictionUI.framework/AppPredictionUI
top Created with Sketch.