Objective c 如何访问特定的iOS应用程序';目标为C的s目录?

Objective c 如何访问特定的iOS应用程序';目标为C的s目录?,objective-c,ios8,filesystems,jailbreak,Objective C,Ios8,Filesystems,Jailbreak,我正在尝试为越狱的iOS设备编写一个应用程序,可以从另一个应用程序加载文件。但appstore应用程序存储在文件夹中,每个设备的字符看起来都是随机的。如何在设备上找到X应用程序的目录?在iOS 8上,由于应用程序文件系统的结构,实现这一目标似乎比较困难。iOS 7及以下版本 AppStore应用程序以随机名称安装在/var/mobile/Applications目录中。应用程序的目录(文档、库等)和*.App目录都在其中。要确定它是哪个应用程序,您需要解析*.app目录中存储应用程序名称和包标识

我正在尝试为越狱的iOS设备编写一个应用程序,可以从另一个应用程序加载文件。但appstore应用程序存储在文件夹中,每个设备的字符看起来都是随机的。如何在设备上找到X应用程序的目录?在iOS 8上,由于应用程序文件系统的结构,实现这一目标似乎比较困难。

iOS 7及以下版本 AppStore应用程序以随机名称安装在
/var/mobile/Applications
目录中。应用程序的目录(文档、库等)和*.App目录都在其中。要确定它是哪个应用程序,您需要解析*.app目录中存储应用程序名称和包标识符的
Info.plist
文件

iOS 8 苹果完全改变了AppStore应用程序在文件系统中的存储方式。我们现在需要的所有东西都在
/var/mobile/Containers
目录中-在这一点上,我进一步提到的每个目录文本都包含在该目录中。所有捆绑包(任何包含应用程序代码的捆绑包)都存储在
Bundle
目录中。在那里你会发现应用程序,插件,可能还有其他一些东西

例如,OpenVPN应用程序包含两个捆绑包,应用程序代码为-
OpenVPN.app
,应用程序可执行,以及
OpenVPNPlugin.vpnplugin
,后者将OpenVPN协议作为iOS VPN插件实现
OpenVPN.app
位于
Applications
目录中,
OpenVPNPlugin.vpnplugin
位于
vpnplugin
目录中。出于某种原因,
OpenVPNPlugin.vpnplugin
也存储在
应用程序中
,但出于兼容性原因,它看起来是一种临时措施

所有应用程序数据现在都存储在
data
目录中。应用程序、插件将其数据存储在该目录中

应用程序目录(文档、库等)现在以随机名称存储在
Data/Application
目录中。要确定它是哪个应用程序目录,您需要解析
Data/Application/xx xx xx/.com.apple.mobile\u container\u manager.metadata.plist
。在它里面,您将找到包含应用程序包标识符的
mcmtataidentifier

我的设备上还有
Data/PluginKitPlugin
Data/VPNPlugin
目录。再次,分别解析
Data/PluginKitPlugin/xx xx xx/.com.apple.mobile\u container\u manager.metadata.plist
Data/VPNPlugin/xx xx xx xx/.com.apple.mobile\u container\u manager.metadata.plist
。在它里面,您将找到包含插件包标识符的
mcmtataidentifier
键。对于PluginKitPlugin,要确定它属于哪个应用程序,您需要转到
*.app
。pluginkitpluginbundle似乎存储在
*.app/PlugIns
中。解析它的
Info.plist
以确定插件的包标识符。例如,您可以查看Evernote是如何存储的

最后是
共享的
目录。它似乎包含了可以在不同应用程序之间共享的应用程序文档。同样,在
Shared
中,您将找到具有随机名称的目录。要确定哪个应用程序共享该文档,请解析
.com.apple.mobile\u container\u manager.metadata.plist
mcmtataidentifier
将包含
组。
字符串与应用程序包标识符连接

iOS 8更新 自从iOS 8.4之后,苹果再次改变了一切。现在没有
.com.apple.mobile\u container\u manager.metadata.plist
文件。相反,您需要解析
/var/mobile/Library/mobileininstallation/LastLaunchServicesMap.plist
。它保存了自iOS 8以来所有已安装应用程序(甚至是系统应用程序)的信息,因此您实际上根本不需要
.com.apple.mobile\u container\u manager.metadata.plist

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

  • 系统-系统应用程序词典(包括Cydia应用程序)
  • 用户-用户应用程序字典(AppStore、企业、开发者应用程序等)
这些字典使用包标识符作为键,使用应用程序信息作为值的字典。例如:

  • 路径-应用程序包目录的路径
  • 容器-应用程序目录(文档、库等)的路径
iOS 9更新 看起来
.com.apple.mobile\u container\u manager.metadata.plist
/var/mobile/Library/mobileininstallation/LastLaunchServicesMap.plist
都太不可靠了。前者再次出现在iOS 9中-不知道8.4中发生了什么,可能是一个bug。后者并不总是最新的。事实上,大部分时间它都包含旧信息。特别是对于应用程序沙盒路径。看起来它确实周期性地改变,因为我发现plist给了我错误的路径


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

我不确定这是否可能。很好的解释!它真的帮助了我!非常感谢!找到了适用于所有iOS 8版本的更好的解决方案。感谢您如此翔实的回复。