Apple App Store 中有一个应用程序可以下载自定义词典并以编程方式将它们添加到 iOS 的内置 Dictionary.app 中,无需用户干预。它可以正常使用库存 ROM,即不需要越狱或任何此类操作。
我想知道这怎么可能,因为苹果从未记录过这样的“功能”。 iOS 和 Dictionary.app 文档中没有 API 或提示来解释这是如何完成的。
如何实施?
Dictionary.appender 应用程序使用私有框架MobileAsset.framework
。该应用程序使用多个选择器:
setQueriesLocalAssetInformationOnly:
runQueryAndReturnError:
initWithAssetType:attributes:
。资产类型有com.apple.MobileAsset.DictionaryServices.dictionary
适用于 iOS com.apple.MobileAsset.DictionaryServices.dictionary2对于 iOS >= 7。它们保存在/var/mobile/Library/Assets/
.
这是框架的类转储https://github.com/nst/iOS-Runtime-Headers/tree/master/PrivateFrameworks/MobileAsset.framework https://github.com/nst/iOS-Runtime-Headers/tree/master/PrivateFrameworks/MobileAsset.framework您可以在其中找到使用这些选择器的方法。
为了调用它们,该应用程序使用非常简单的技术 -NSClassFromString
在运行时获取类对象。在我们的例子中,ASAsset
and ASAssetQuery
类。我不知道它是如何在 App Store 中获得批准的,但这就是它的工作原理。非常简单的技术,选择器和类名甚至没有加密。
UPDATE
该应用程序没有明确链接私有MobileAsset.framework
。它不使用任何常用技术来动态加载框架 - 不dlopen
or NSBundle
来电。导入表不包含私有MobileAsset.framework
任何一个。但它通过UIKit.framework
这显然是由应用程序链接的。我做了一个简单的测试。编写了一个精简的控制台应用程序,通过关闭可能自动链接框架的所有项目设置,仅链接所需的框架。没有UIKit.framework
执行NSClassFromString(@"ASAsset")
返回零。和UIKit.framework
它返回ASAsset
类对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)