以编程方式扩展iOS词典应用词典

Apple App Store中有一个应用程序可以下载自定义词典,并以编程方式将它们添加到iOS内置的Dictionary.app中,无需用户干预。 它与股票ROM一起正常工作,即不需要越狱或任何类型的东西。

我想知道这是怎么可能的,因为Apple从未记录过这样的“function”。 iOS和Dictionary.app文档中没有API或提示来解释如何完成此操作。

怎么能实现呢?

Dictionary.appender应用程序使用私有框架MobileAsset.framework 。 应用程序使用了几个选择器:

  • setQueriesLocalAssetInformationOnly:

  • runQueryAndReturnError:

  • initWithAssetType:attributes: . 资产类型为iOS <7的com.apple.MobileAsset.DictionaryServices.dictionary2和iOS> = 7的com.apple.MobileAsset.DictionaryServices.dictionary2 。它们保存在/var/mobile/Library/Assets/

这里是框架的类转储https://github.com/nst/iOS-Runtime-Headers/tree/master/PrivateFrameworks/MobileAsset.framework ,您可以在其中找到使用这些选择器的方法。

为了调用它们,应用程序使用非常简单的技术 – NSClassFromString来在运行时获取类对象。 在我们的例子中, ASAssetASAssetQuery类。 我不知道这是如何在App Store获得批准的,但这就是它的工作原理。 非常简单的技术,选择器和类名甚至都没有加密。

UPDATE

该应用没有明确链接私人MobileAsset.framework 。 它不使用任何常用技术来动态加载框架 – 没有dlopenNSBundle调用。 导入表也不包含私有的MobileAsset.framework 。 但它通过UIKit.framework链接,显然是由应用程序链接。 我做了一个简单的测试。 写了一个剥离的控制台应用程序,通过关闭可能自动链接框架的所有项目设置来链接所需的框架。 如果没有UIKit.framework执行NSClassFromString(@"ASAsset")返回nil。 使用UIKit.framework它返回ASAsset类对象。