iOS 打开别的APP的两种Native方法
$[timeformat('2021-10-08T18:02:55+08:00')]
#openURL#iOS

Open URL

判断安装

/// 是否能打开指定scheme的APP
+ (BOOL)_isInstalled_iPadeAppWithOpenURL {
    return [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:kAppSchemeForIPad]];
}

吊起APP

/// 呼起APP
+ (void)_callUpHDAppWithOpenURL:(NSString *)openURL {
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:openURL]];
}

bundleID

通过bundleID检测是否已安装指定APP

/// 是否已安装指定bundleID的APP
+ (BOOL)_isInstalled_iPadeAppWithBundleID {
    return [self verifyAppWithBundle:kAppBundleIDForIPad];
}

+ (BOOL)verifyAppWithBundle:(NSString *)bundleID{

    __block BOOL isInstall = NO;

    //iOS12间接获取办法
    if ([[UIDevice currentDevice].systemVersion floatValue] >= 12.0){
        Class lsawsc = objc_getClass("LSApplicationWorkspace");

        NSObject* workspace = [lsawsc performSelector:NSSelectorFromString(@"defaultWorkspace")];

        NSArray *plugins = [workspace performSelector:NSSelectorFromString(@"installedPlugins")];
        //列出所有plugins


        [plugins enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

            NSString *pluginID = [obj performSelector:(@selector(pluginIdentifier))];
            // NSLog(@"kael-- bundleid :%@",pluginID);
            if([pluginID containsString:bundleID]){
                isInstall = YES;
                return;
            }
        }];

        return isInstall;

    } else if ([[UIDevice currentDevice].systemVersion floatValue] >= 11.0) {

           //iOS11获取办法
           NSBundle *container = [NSBundle bundleWithPath:@"/System/Library/PrivateFrameworks/MobileContainerManager.framework"];

           if ([container load]) {

                 Class appContainer = NSClassFromString(@"MCMAppContainer");

                 id test = [appContainer performSelector:@selector(containerWithIdentifier:error:) withObject:bundleID withObject:nil];

                 NSLog(@"%@",test);

                 if (test) {
                      return YES;
                  } else {
                      return NO;
                    }

            }else{
                return NO;
            }


    }else{

        //iOS10及以下获取办法
        Class lsawsc = objc_getClass("LSApplicationWorkspace");
        NSObject* workspace = [lsawsc performSelector:NSSelectorFromString(@"defaultWorkspace")];
        NSArray *appList = [workspace performSelector:@selector(allApplications)];
        Class LSApplicationProxy_class = object_getClass(@"LSApplicationProxy");

        for (LSApplicationProxy_class in appList) {

            //这里可以查看一些信息
            NSString *bundleID = [LSApplicationProxy_class performSelector:@selector(applicationIdentifier)];
            NSString *version =  [LSApplicationProxy_class performSelector:@selector(bundleVersion)];
            NSString *shortVersionString =  [LSApplicationProxy_class performSelector:@selector(shortVersionString)];
            if ([bundleID isEqualToString:bundleID]) {
                return  YES;
            }

        }

        return NO;
    }

    return NO;
}

通过bundleID呼起APP

+ (BOOL)_callUpAppWithBundle:(NSString *)bundleID {
    
    Class LSApplicationWorkspace_class = NSClassFromString([@"LSApplicati" stringByAppendingString:@"onWorkspace"]);
    SEL defaultWspc = NSSelectorFromString([@"defaultW" stringByAppendingString:@"orkspace"]);
    SEL opensdasadkl = NSSelectorFromString([@"openApplicatio" stringByAppendingString:@"nWithBundleID:"]);
    NSObject * workspace = [LSApplicationWorkspace_class performSelector:defaultWspc];
    BOOL isopen = [workspace performSelector:opensdasadkl withObject:bundleID];
 
    return isopen;
}