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

use*_*743 5 dictionary ios

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

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

怎么能实现呢?

cre*_*ker 5

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

  • setQueriesLocalAssetInformationOnly:

  • runQueryAndReturnError:

  • initWithAssetType:attributes:.资产类型适用com.apple.MobileAsset.DictionaryServices.dictionary于iOS <7和com.apple.MobileAsset.DictionaryServices.dictionary2iOS> = 7.它们保存在/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类对象.