分2中情况:
1.越狱之后的设备,可以获取完整的列表,获取也比较方便,方法如下:
也有如下代码可以获取:
NSFileManager* fileManager = [NSFileManager defaultManager];NSMutableArray* applist = [NSMutableArray arrayWithCapacity:10];for (NSString *path in [fileManager directoryContentsAtPath:@"/var/mobile/Applications"]) { for (NSString *subpath in [fileManager directoryContentsAtPath:[NSString stringWithFormat:@"/var/mobile/Applications/%@", path]]) { if ([subpath hasSuffix:@".app"]){ NSString* infoplist = [NSString stringWithFormat:@"/var/mobile/Applications/%@/%@/Info.plist", path, subpath];NSLog(@"sdfsadfa0%@",infoplist);NSDictionary* dict = [NSDictionary dictionaryWithContentsOfFile:infoplist];NSLog(@"sdfsadfa1%@",dict);
[applist addObject:[dict objectForKey:@"CFBundleDisplayName"]];
}}住:代码运行的目录为/Applications/**************************************** // Declaration BOOL APCheckIfAppInstalled(NSString*bundleIdentifier);// Bundle identifier (eg. com.apple.mobilesafari) used to track apps // Implementation BOOL APCheckIfAppInstalled(NSString*bundleIdentifier) { staticNSString*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){ case0:// Jailbroken apps will find the cache here; their home directory is /var/mobile path =[NSHomeDirectory() stringByAppendingPathComponent: relativeCachePath]; break; case1:// 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; case2:// 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 is an example of this, assuming that your app is named "yourselfmadeapp" and is an app in the app store.
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(@\"Appnot installed:%@\", identifier);
2009-01-3012:19:20.250SomeApp[266:20b]App installed: com.apple.mobilesafari 2009-01-3012:19:20.254SomeApp[266:20b]App installed: com.yourcompany.yourselfmadeapp 2009-01-3012:19:20.260SomeApp[266:20b]Appnot installed: com.blahblah.nonexistent