检查iphone是否安装某app 【转】
转自http://blog.csdn.net/zengconggen/article/details/7714514#
开发中遇到一个问题:公司多个产品时,希望在一个产品A中可以直接打开另外的某个产品B。如果用户尚未安装产品B, 则打开app store下载页面。 对于这个问题:有3个技术点: 1、产品B是否已安装的检测。 2、应用内打开其他app的技术:参考:https://developer.apple.com/library/IOs/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/AdvancedAppTricks/AdvancedAppTricks.html#//apple_ref/doc/uid/TP40007072-CH7-SW18
3、从应用跳转至app下载页面的技术:参考:http://blog.csdn.net/zengconggen/article/details/6789420 对于第2、3点,本文略过不讲。现提供第1技术点方案:(说明:技术有风险,有可能导致app被拒。不过app store有类似上线作品。看RP) 解决方案1:(经验证:该方案真机ios5无效,模拟器可以) // 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]; 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; } 解决方案2:参考:http://blog.csdn.net/zengconggen/article/details/7714466 本方案有限制:只能获取到用户最近运行过的app。对于已安装但是不在最近有运行的app。不适用。 BOOL isExsit = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"rumtel://com.rumtel.AudioManager"]]; NSLog(@"App %@ installed", identifier); if (isExsit) { [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"rumtel://com.rumtel.AudioManager?a=1&b=2#sect"]]; } else { //打开app store下载页面 } 方案3需要知道B的打开地址。可用。最终方案确定为3 附:目前公开的app相关资料:http://wiki.akosma.com/IPhone_URL_Schemes