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

时间:2014-04-11 17:35:15

标签: ios dictionary

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

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

如何实施?

1 个答案:

答案 0 :(得分:5)

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

  • setQueriesLocalAssetInformationOnly:

  • runQueryAndReturnError:

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

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

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

<强>更新

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