我之前在 『用 Dart 来写 Objective-C 代码』 这篇文章讲了下我在解决 Flutter 三端开发问题的一个思路和方案,并给出了 Demo 和简单的对比。这次讲下 dart_native 的设计,这包含了上层使用方式和底层技术方案的设计。由于涉及到的技术点很多,这次不会深入太多技术实现细节,不过后续可能会分篇讲下。

Read More

这篇文章不是讲 Flutter Channel 入门的,可能让你失望了。不过继续往下读可能也会有点收获。

Flutter 提升了客户端开发的效率,但在跟 Native 代码配合开发时也带来了不好的体验。于是我写了个 Flutter 插件 dart_native,使开发者可以用 Dart 的语法来写 Objective-C 代码。借助于 Flutter 的热重载,也可以更高效的动态调试 Native 代码,从此告别在两个工程和 IDE 中切来切去。方法调用性能相比 Channel 也提升很多。

尚在开发中,开源地址:https://github.com/yulingtianxia/dart_objc

Read More

『二进制文件重排优化启动速度』本是一项上古 PC 时代就玩过的东东,前一阵子借助某宇宙大厂重新火了一把。不过令我惊讶的是:这么简单个事情竟然搞得如此复杂,而且还声称『开拓性的探索、在没有业界经验可供参考』。。。

说真话可能会得罪人,但是我怕过吗? 我怂了,这段掐了。

其实二进制文件重排很简单啊,重点在于生成 order 文件。我基于 Clang SanitizerCoverage 和业界已有的经验,整了个 AppOrderFiles,一个调用搞定!Enjoy it!

1
2
3
AppOrderFiles(^(NSString *orderFilePath) {
NSLog(@"OrderFilePath:%@", orderFilePath);
});

Read More

BlockHook 在业界已经率先解决了在同步调用场景下对 Objective-C Block 的 AOP 问题。但也有很多场景是需要先调用一段自己的逻辑,然后再异步延时执行 Block。

比如从外部跳转到 App 某个页面前需要检查下登录态,如果未登录则需要走完登录流程后才能继续跳转页面,而几乎所有基于 Block callback 的路由组件都没提供路由拦截器的功能。不同的路由组件内部实现不同,想要实现拦截器就需要针对不同的内部实现来修改路由组件源码。

因此我实现了 BlockHook 的异步拦截功能,所有基于 Block 的路由组件就都有了通用的路由拦截器!

当然,Block 拦截器的应用场景不仅于此。只要是需要『同步改异步执行』 Block 的场景都可以用到。

让子弹再飞一会儿!

Read More

BlockHook 开创性地解决了 Objective-C 语言界 Hook Block 的问题,但也迎来了新的问题:

  1. 如何知道某个 Block 对象被谁 Hook 过?
  2. 多次 Hook 的先后顺序?
  3. 如何处理好多次 Hook 同一个 Block 后对任意一次 Hook 的撤销?

这些问题也是开发者在使用时向我反馈过的问题,在这篇文章里,这些问题都将会解决。

关于 BlockHook 的原理,可以先阅读之前的文章:

Read More

一年前,我开发了 BlockHook,(应该是)填补了 Objective-C 业界在 Hook Block 技术领域的空白。但是对于 Block 的参数和返回值有限制,仅定制了 CGRect, CGSize, CGPoint 等结构体,不支持自定义 struct。这次就把这个坑给填上。

至此,BlockHook 已支持 macOS 和 iOS 平台全架构、tvOS 和 watchOS 模拟器,BlockHook.m 测试覆盖率达到 92% 以上。

Read More

如何识别声音所蕴含的情绪呢?在大部分场景下,人声的情绪更有意义。可以先将人声转文字,再通过 NLP 分析语义情绪。不过人类语言博大精深,一句『卧槽』的不同语调和语境下会有很多种意义,真的是卧槽啊!

于是我从音频特征提取入手,将人声分类识别为八种情绪,实现了两个方案并都得到了测试集 70% 以上的准确率:

  1. 使用 VGGish 网络做特征提取,输入自定义网络进行训练。
  2. 使用音频库导出一系列特征作为输入向量,自定义网络进行训练。

Python 工程和 iOS Sample 开源在 GitHub 上了:https://github.com/yulingtianxia/AudioEmotion

Read More