以编程方式扩展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
来在运行时获取类对象。 在我们的例子中, ASAsset
和ASAssetQuery
类。 我不知道这是如何在App Store获得批准的,但这就是它的工作原理。 非常简单的技术,选择器和类名甚至都没有加密。
UPDATE
该应用没有明确链接私人MobileAsset.framework
。 它不使用任何常用技术来动态加载框架 – 没有dlopen
或NSBundle
调用。 导入表也不包含私有的MobileAsset.framework
。 但它通过UIKit.framework
链接,显然是由应用程序链接。 我做了一个简单的测试。 写了一个剥离的控制台应用程序,通过关闭可能自动链接框架的所有项目设置来链接所需的框架。 如果没有UIKit.framework
执行NSClassFromString(@"ASAsset")
返回nil。 使用UIKit.framework
它返回ASAsset
类对象。