转自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
转载于:https://www.cnblogs.com/KingQiangzi/p/4182713.html
相关资源:数据结构—成绩单生成器