Last active
December 14, 2015 15:18
-
-
Save quangnguyenbh/5106630 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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]; | |
| 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]; | |
| break; | |
| case 2: // If the app is anywhere else, default to hardcoded /var/mobile/ | |
| path = [@"/var/mobile" stringByAppendingPathComponent: relativeCachePath]; | |
| 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; | |
| } | |
| 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; | |
| } | |
| //Here how to use | |
| 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); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment