com.apple.mobile.installation.plist para iPhone 4
-
25-10-2019 - |
Pregunta
// 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];
}
Quiero verificar qué aplicación está instalada en mi iPhone 4, pero no pudo encontrar la ruta correcta. /var/mobile/Library/Caches/com.apple.mobile.installation.plist
Está funcionando en mi iPad 2 de jailbreak pero no en mi iPhone 4.
¿Cambió Apple donde está el com.apple.mobile.installation.plist?
Muchas gracias
Solución
Debido al Sandboxing de Apple Application, no puede consultar nada fuera de su propio directorio de aplicaciones (Sandbox).
Esto funcionará en un dispositivo roto de la cárcel porque elimina las funciones de sandboxing de la aplicación del sistema operativo.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow