Apple App Store中有一款應用程序可下載自定義字典,並以編程方式將它們添加到iOS的內置Dictionary.app,無需用戶干預。它通常與股票ROM一起工作,即不需要越獄或任何類型的事情。以編程方式擴展iOS字典應用程序詞典
我想知道這是如何可能的,因爲蘋果從未記錄過這樣的「功能」。 iOS和Dictionary.app文檔中沒有API或提示來解釋如何完成此操作。
這怎麼能實現?
Apple App Store中有一款應用程序可下載自定義字典,並以編程方式將它們添加到iOS的內置Dictionary.app,無需用戶干預。它通常與股票ROM一起工作,即不需要越獄或任何類型的事情。以編程方式擴展iOS字典應用程序詞典
我想知道這是如何可能的,因爲蘋果從未記錄過這樣的「功能」。 iOS和Dictionary.app文檔中沒有API或提示來解釋如何完成此操作。
這怎麼能實現?
Dictionary.appender應用程序使用私有框架MobileAsset.framework
。有幾種選擇該應用程序使用:
setQueriesLocalAssetInformationOnly:
runQueryAndReturnError:
initWithAssetType:attributes:
。資產類型爲iOS的7和com.apple.MobileAsset.DictionaryServices.dictionary2
的com.apple.MobileAsset.DictionaryServices.dictionary
(iOS> = 7)。它們保存在/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")
返回零。使用UIKit.framework
它將返回ASAsset
類對象。
這聽起來不錯。我認爲下一步是瞭解應用程序如何鏈接該框架。所以,會繼續尋找。謝謝克裏克。 – user3524743
更新了答案。 – creker
另外,內置的字典不是一個應用程序。這只是一個視圖控制器,可能在'UIKit'或其他框架中實現。就像'UIImagePickerController'一樣。 – creker
1.什麼「Dictionary.app」?默認情況下,iOS中沒有這樣的應用程序。 2.你的意思是哪個App Store應用程序?如果您不告訴我們應用程序的名稱,我們無法幫助您。 – creker
1.在Dictionary中內置的iOS是通過選擇一個單詞然後從彈出菜單中選擇「Define」來激活的應用程序。看到這裏:http://forums.imore.com/attachments/guides-how-articles/49391d1392595078t-guide-how-define-word-using-ios7-s-built-dictionary-step1.jpg – user3524743
2.其他應用程序我指的是,可以下載和添加自定義字典,被稱爲「Dictionary.appender」,可以在這裏找到:https://itunes.apple.com/us/app/dictionary.appender/id650562573?mt= 8 – user3524743