【问题标题】:How to quickly get app's directory from its bundle id on jailbroken iOS device?如何在越狱的 iOS 设备上从其 bundle id 快速获取应用程序的目录?
【发布时间】:2013-07-03 03:08:30
【问题描述】:

在iOS设备中,所有用户应用程序都位于/var/mobile/Applications目录下,每个应用程序都有一个唯一的随机uuid作为其目录名,例如:

/var/mobile/Applications/15FD62FD-2BEB-4C1E-A9B8-BC93E5C721CC

uuid 是15FD62FD-2BEB-4C1E-A9B8-BC93E5C721CC

现在我想通过应用程序的包标识符获取目录,我的解决方案是枚举/var/mobile/Applications目录,从Info.plist获取包标识符并检查。

这个解决方案相当慢,有没有更快的方法来做到这一点?

例如如果有一个 plist 记录捆绑 id 到 uuid 的映射,那么我可以读取该文件以避免目录枚举。

【问题讨论】:

标签: iphone ios jailbreak


【解决方案1】:

我认为您要查找的文件是

/var/mobile/Library/Caches/com.apple.mobile.installation.plist

例如,它包含每个应用程序的如下信息:

    "com.zillow.ZillowMap" =         {
        ApplicationDSID = 216284405;
        ApplicationType = User;
        CFBundleDisplayName = Zillow;
        CFBundleExecutable = ZillowMap;
        CFBundleIconFiles =             (
            "app-icon",
            "app-icon-iPad.png",
            "app-icon-iPad@2x.png"
        );
        CFBundleIcons =             {
            CFBundlePrimaryIcon =                 {
                CFBundleIconFiles =                     (
                    "app-icon",
                    "app-icon-iPad.png",
                    "app-icon-iPad@2x.png"
                );
                UIPrerenderedIcon = 1;
            };
        };
        CFBundleIdentifier = "com.zillow.ZillowMap";
        CFBundleName = ZillowMap;
        CFBundleShortVersionString = "6.1.0112";
        CFBundleVersion = "6.1.0112";
        CodeInfoIdentifier = "com.zillow.ZillowMap";
        Container = "/private/var/mobile/Applications/B9284FBE-E558-4A65-A7E4-AE20CDAD9A1D";
        Entitlements =             {
            "application-identifier" = "JEWMY3RZ4A.com.zillow.ZillowMap";
            "aps-environment" = production;
        };
        EnvironmentVariables =             {
            "CFFIXED_USER_HOME" = "/private/var/mobile/Applications/B9284FBE-E558-4A65-A7E4-AE20CDAD9A1D";
            HOME = "/private/var/mobile/Applications/B9284FBE-E558-4A65-A7E4-AE20CDAD9A1D";
            TMPDIR = "/private/var/mobile/Applications/B9284FBE-E558-4A65-A7E4-AE20CDAD9A1D/tmp";
        };
        IsUpgradeable = 1;
        LSRequiresIPhoneOS = 1;
        MinimumOSVersion = "5.0";
        Path = "/private/var/mobile/Applications/B9284FBE-E558-4A65-A7E4-AE20CDAD9A1D/ZillowMap.app";
        SequenceNumber = 2618;
        SignerIdentity = "Apple iPhone OS Application Signing";
        UIDeviceFamily =             (
            1,
            2
        );
        UIPrerenderedIcon = 1;
    };

更新

此文件已在 iOS 8 中删除:(https://www.theiphonewiki.com/wiki/Com.apple.mobile.installation.plist)

/var/mobile/Library/MobileInstallation/LastLaunchServicesMap.plist 存在一个类似的 iOS 8 文件,但它可能只会在启动(重启)时更新。

【讨论】:

  • 谢谢,但这个文件似乎不再存在,至少在 iOS 12.4 中。知道我们还可以在哪里寻找这样的映射吗?
【解决方案2】:

如果您的代码在 SpringBoard 中运行,这是另一种解决方案:

NSString *applicationBundleIdentifier = @"...";
SBApplication *application = [[SBApplicationController sharedInstance]applicationWithDisplayIdentifier:applicationBundleIdentifier];
NSString *path = application.containerPath;

【讨论】:

    【解决方案3】:

    如果您不介意卸载并重新安装目标应用程序,一种更快捷的方法是卸载并重新安装目标应用程序。然后它将是应用容器或数据容器中的最新应用(现在分别为/private/var/containers/Bundle/Application/private/var/mobile/Containers/Data/Application),您可以通过ls 轻松找到它,例如ls -altr

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-05
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多