如何使用Objective C访问特定的iOS应用程序目录?

The*_*eo5 3 filesystems objective-c jailbreak ios8

我正在尝试为越狱的iOS设备编写一个应用程序,可以从其他应用程序加载文件.但appstore应用程序存储在文件夹中,其中看似随机的字符因设备而异.如何在设备上找出X app的目录?在iOS 8上,由于app文件系统的结构方式,实现这一点似乎更难.

cre*_*ker 12

iOS 7及以下版本

AppStore应用程序安装在/var/mobile/Applications具有随机名称的内部目录中.应用程序的目录(文档,库等)和*.app目录都在其中.要确定哪个应用程序需要解析Info.plist存储应用程序名称和包标识符的*.app目录中的文件.

iOS 8

Apple完全改变了AppStore应用程序存储在文件系统中的方式.我们现在需要的一切都在/var/mobile/Containers目录中 - 此时我在文本中提到的每个目录都包含在该目录中.所有包(包含应用程序代码的任何包)都存储在Bundle目录中.你会在那里找到应用程序,插件,也可能是其他一些东西.

例如,OpenVPN应用程序包含两个包含应用程序代码的包 - OpenVPN.app应用程序可执行,OpenVPNPlugin.vpnplugin并将OpenVPN协议实现为iOS VPN插件.OpenVPN.appApplications目录中并且OpenVPNPlugin.vpnpluginVPNPlugin.出于某种原因OpenVPNPlugin.vpnplugin,也存储在其中,Applications但出于兼容性原因,它看起来似乎是一种临时措施.

所有应用程序数据现在存储在Data目录中 应用程序,插件将其数据存储在该目录中.

应用程序目录(文档,库等)现在存储在Data/Application具有随机名称的内部目录中.要确定您需要解析哪些应用程序目录Data/Application/xx-xx-xx/.com.apple.mobile_container_manager.metadata.plist.在其中,您将找到MCMMetadataIdentifier包含应用程序包标识符的密钥.

也有Data/PluginKitPluginData/VPNPlugin我的设备上的目录.再次,解析Data/PluginKitPlugin/xx-xx-xx/.com.apple.mobile_container_manager.metadata.plistData/VPNPlugin/xx-xx-xx/.com.apple.mobile_container_manager.metadata.plist分别.在其中,您将找到MCMMetadataIdentifier包含插件的包标识符的密钥.如果是PluginKitPlugin,要确定它需要去哪个应用程序*.app.似乎PluginKitPlugin包存储在*.app/PlugIns.解析它Info.plist以确定插件的包标识符.作为示例,您可以查看Evernote的存储方式.

最后还有Shared目录.它似乎包含可以在不同应用程序之间共享的应用程序文档.再次,在里面Shared你会找到随机名称的目录.确定共享文档解析的应用程序.com.apple.mobile_container_manager.metadata.plist.MCMMetadataIdentifier将包含group.与app的包标识符连接的字符串.

iOS 8更新

自iOS 8.4 Apple再次改变了一切.现在没有.com.apple.mobile_container_manager.metadata.plist文件.相反,你需要解析/var/mobile/Library/MobileInstallation/LastLaunchServicesMap.plist.它包含自iOS 8以来所有已安装应用程序(甚至系统应用程序)的信息,因此您实际上根本不需要.com.apple.mobile_container_manager.metadata.plist.

plist结构非常简单.首先是带有两个主键的字典

  • 系统 - 系统应用程序字典(包括Cydia)
  • 用户 - 用户应用程序字典(AppStore,企业,开发人员应用程序等)

这些词典使用包标识符作为键和字典,应用程序信息作为值.例如:

  • 路径 - 应用程序包目录的路径
  • 容器 - 应用程序目录的路径(文档,库等)

iOS 9更新

它看起来既像.com.apple.mobile_container_manager.metadata.plist/var/mobile/Library/MobileInstallation/LastLaunchServicesMap.plist太不可靠.前者再次出现在iOS 9中 - 不知道8.4中发生了什么,也许是一个bug.后者并不总是最新的.实际上,大多数时候它都包含旧信息.特别适用于应用沙盒路径.看起来它确实会定期更改,因为我发现plist给了我错误的路径.

有一个更可靠的解决方案,不需要摆弄plist或任何东西 - LSApplicationWorkspaceMobileCoreServices框架.它具有- (id)allInstalledApplications返回LSApplicationProxy对象数组的方法,该对象数组将为您提供可能找到的所有信息LastLaunchServicesMap.plist.而且,如果我没记错的话,即使没有越狱也能奏效.