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

以编程方式扩展iOS字典应用程序词典,ios,dictionary,Ios,Dictionary,Apple app Store中有一个应用程序可以下载自定义词典,并以编程方式将其添加到iOS的内置Dictionary.app中,而无需用户干预。它通常与库存ROM一起工作,也就是说,不需要越狱或任何类似的东西 我想知道这是怎么可能的,因为苹果从未记录过这样的“功能”。iOS和Dictionary.app文档中没有API或提示来解释这是如何实现的 这是如何实现的?Dictionary.appender应用程序使用私有框架mobileaset.framework。应用程序使用多个选择器: se

Apple app Store中有一个应用程序可以下载自定义词典,并以编程方式将其添加到iOS的内置Dictionary.app中,而无需用户干预。它通常与库存ROM一起工作,也就是说,不需要越狱或任何类似的东西

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


这是如何实现的?

Dictionary.appender应用程序使用私有框架
mobileaset.framework
。应用程序使用多个选择器:

  • setQueriesLocalAssetInformationOnly:

  • runQueryAndReturnError:

  • initWithAssetType:属性:
    。对于iOS<7,资产类型为
    com.apple.MobileAsset.DictionaryServices.dictionary
    ;对于iOS>=7,资产类型为
    com.apple.MobileAsset.DictionaryServices.dictionary2
    。它们保存在
    /var/mobile/Library/Assets/

这里是框架的类转储,您可以在其中找到带有这些选择器的方法

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

更新


应用程序没有显式链接private
mobileaset.framework
。它不使用任何常用的技术来动态加载框架—无
dlopen
NSBundle
调用。导入表也不包含private
mobileaset.framework
。但是它是通过
UIKit.framework
链接的,而UIKit.framework显然是通过应用程序链接的。我做了一个简单的测试。编写了一个精简控制台应用程序,通过关闭所有可能自动链接框架的项目设置,只链接需要的框架。没有
UIKit.framework
执行
NSClassFromString(@“ASAsset”)
返回nil。使用
UIKit.framework
返回
ASAsset
类对象

一,。什么“Dictionary.app”?默认情况下,iOS中没有此类应用程序。2.你指的是哪个应用商店应用?如果您不告诉我们应用程序的名称,我们将无法帮助您。1。iOS内置字典是一个应用程序,通过选择一个单词,然后从弹出菜单中选择“定义”来激活它。请看这里:2。我指的另一个可以下载和添加自定义词典的应用程序叫做“Dictionary.appender”您可以在此处找到:@user3524743您应该查看iOS 7.1中的任何应用程序,您将看到,通过点击并按住任何可选文本,然后单击上下文菜单中的学习项,现在可以添加用户快捷方式。这允许用户更新扩展用户词典的快捷方式列表。同时,单击同一上下文菜单中的Define将显示字典,您可以在其中下载所有主要字典。这是免费内置的,您可以通过向应用程序添加textview并使其可选择来实现。@TommieC.,我们正在讨论的应用程序实现了iOS SDK中不可用的功能-下载和添加自定义词典。应用程序使用私有API来实现这一点。这听起来不错。我认为下一步是了解应用程序如何链接该框架。所以,我会继续寻找。谢谢你,克雷克。另外,内置字典不是一个应用程序。它只是一个视图控制器,可能是在
UIKit
或其他框架中实现的。就像
UIImagePickerController
。非常感谢您的更新。它让我或任何希望复制该功能的人更接近目标。如果你想这样做,我认为向应用商店提交具有类似功能的应用不是一个好主意。最终将删除Dictionary.appender。我不明白为什么评论者如此盲目,以至于他们批准了这样一个应用程序,但我希望他们最终会删除它。如果我回答了你的问题,那么请接受我的回答。@creker你是怎么发现的?