Вопрос

// Declaration
BOOL APCheckIfAppInstalled(NSString *bundleIdentifier); // Bundle identifier (eg. com.apple.mobilesafari) used to track apps

// Implementation

BOOL APCheckIfAppInstalled(NSString *bundleIdentifier)
{
    static NSString *const cacheFileName = @"com.apple.mobile.installation.plist";
    NSString *relativeCachePath = [[@"Library" stringByAppendingPathComponent: @"Caches"] stringByAppendingPathComponent: cacheFileName];
    NSDictionary *cacheDict = nil;
    NSString *path = nil;
    // Loop through all possible paths the cache could be in
    for (short i = 0; 1; i++)
    {

        switch (i) {
            case 0: // Jailbroken apps will find the cache here; their home directory is /var/mobile
                path = [NSHomeDirectory() stringByAppendingPathComponent: relativeCachePath];
                NSLog(@"%@", path);
                break;
            case 1: // App Store apps and Simulator will find the cache here; home (/var/mobile/) is 2 directories above sandbox folder
                path = [[NSHomeDirectory() stringByAppendingPathComponent: @"../.."] stringByAppendingPathComponent: relativeCachePath];
                NSLog(@"%@", path);
                break;
            case 2: // If the app is anywhere else, default to hardcoded /var/mobile/
                path = [@"/var/mobile" stringByAppendingPathComponent: relativeCachePath];
                NSLog(@"%@", path);
                break;
            default: // Cache not found (loop not broken)
                return NO;
            break; 
        }

        BOOL isDir = NO;
        if ([[NSFileManager defaultManager] fileExistsAtPath: path isDirectory: &isDir] && !isDir) // Ensure that file exists
            cacheDict = [NSDictionary dictionaryWithContentsOfFile: path];

        if (cacheDict) // If cache is loaded, then break the loop. If the loop is not "broken," it will return NO later (default: case)
            break;
    }

    NSLog(@"file find success");

    NSDictionary *system = [cacheDict objectForKey: @"System"]; // First check all system (jailbroken) apps
    if ([system objectForKey: bundleIdentifier]) return YES;
    NSDictionary *user = [cacheDict objectForKey: @"User"]; // Then all the user (App Store /var/mobile/Applications) apps
    if ([user objectForKey: bundleIdentifier]) return YES;

    // If nothing returned YES already, we'll return NO now
    return NO;
}

- (void)viewDidLoad
{
    NSArray *bundles2Check = [NSArray arrayWithObjects: @"com.apple.mobilesafari", @"com.yourcompany.yourselfmadeapp", @"com.blahblah.nonexistent", nil];
    for (NSString *identifier in bundles2Check)
        if (APCheckIfAppInstalled(identifier))
            NSLog(@"App installed: %@", identifier);
        else
            NSLog(@"App not installed: %@", identifier);
    [super viewDidLoad];
}

Я хочу проверить, какое приложение установлено на моем iPhone 4, но оно не мог найти правильный путь. /var/mobile/Library/Caches/com.apple.mobile.installation.plist

Он работает над моим Jailbroken IPad 2, но не на моем iPhone 4.

Изменилось ли Apple, где есть com.apple.mobile.installation.plist?

Спасибо большое

Это было полезно?

Решение

Из -за песочницы Apple вы не можете запросить ничего за пределами собственного каталога ваших приложений (песочница).

Это будет работать на тюрьме, сломанном устройстве, потому что оно удаляет функции песочницы приложения из ОС.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top