ios是否安装了某应用

分2中情况:

1.越狱之后的设备,可以获取完整的列表,获取也比较方便,方法如下:
http://stackoverflow.com/questions/3878197/is-it-possible-to-get-information-about-all-apps-installed-on-iphone/3878220#3878220

http://www.iphonedevsdk.com/forum/iphone-sdk-development/22289-possible-retrieve-these-information.html 

 

也有如下代码可以获取:
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);


Log Output:


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
posted on 2012-11-21 16:19  smartch  阅读(255)  评论(0编辑  收藏  举报