iOS开发 App间的相互打开/跳转的配置

iOS调研App间的相互跳转;

两个App,A和B;App内相互跳转处理:

一、scheme方式跳转

1、A --> B ,跳转前判断目标App是否安装

在A的Info.plistLSApplicationQueriesSchemes,配置B的scheme(即A中添加B跳转的白名单);B的Info.plistURL types里,配置好自身的scheme;A内,可以通过

NSURL *url = [NSURL URLWithString:@"目标App的scheme://"];
[[UIApplication sharedApplication] canOpenURL:url]

来判断B是否安装;返回YES后,使用方法

NSURL *url = [NSURL URLWithString:@"目标App的scheme://"];
[[UIApplication sharedApplication] openURL:url]

可以打开B;

2、A --> B--> A, 跳转前判断目标App是否安装

就是A打开了B,B再打开A;就是按照1步骤配置,两边都配置对方的白名单,自身都配置好scheme,通过

NSURL *url = [NSURL URLWithString:@"目标App的scheme://"];
[[UIApplication sharedApplication] canOpenURL:url]

来判断要跳转的App是否安装;返回YES后,使用方法

NSURL *url = [NSURL URLWithString:@"目标App的scheme://"];
[[UIApplication sharedApplication] openURL:url]

可以打开要跳转的App;

3、App间跳转不判断目标App是否安装;

那就不需要配置白名单,只需要App的Info.plistURL types里,配置好自身的scheme,直接使用

NSURL *url = [NSURL URLWithString:@"目标App的scheme://"];
[[UIApplication sharedApplication] openURL:url]

进行跳转;

二、UniversalLink 通用链接跳转;

1、A --> B

B要配置好正确的UniversalLink,A就可以通过[[UIApplication sharedApplication] openURL:url] 打开B,无需配置白名单;

2、A --> B--> A

A和B要配置好正确的UniversalLink,相互打开;

三、私有API:LSApplicationWorkspace

使用苹果的私有API,只需要知道App的bundleId,就能打开App;但是会有无法上架的风险;
代码如下:

- (BOOL)isOpenApp:(NSString*)appIdentifierName {
    Class LSApplicationWorkspace_class = objc_getClass("LSApplicationWorkspace");
    NSObject* workspace = [LSApplicationWorkspace_class performSelector:NSSelectorFromString(@"defaultWorkspace")];
    BOOL isOpenApp = [workspace performSelector:NSSelectorFromString(@"openApplicationWithBundleID:") withObject:appIdentifierName];
    return isOpenApp;
}

处理跳转参数

AppDelegate的代理方法中

-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options

处理通过schemeUniversalLink打开App,传递过来的数据;

关于iOS“白名单”的理解

在iOS9后,如果想要使用canOpenURL方法检查是否可以打这个URL或可以处理该URL的的App,需要在info.plist里添加LSApplicationQueriesSchemes字段来预设url,否则是否安装都会返回NO。

所以“白名单”的意义是要检查当前设备上是否安装了其他App,而不是打开其他App必须添加“白名单”。

所以如果想要打开其他App,直接使用openURL即可。

微信、微博等分享时,必须配置“白名单”是因为SDK要检测是否安装了微信、微博。

参考文章:关于iOS“白名单”的理解

你可能感兴趣的:(iOS开发 App间的相互打开/跳转的配置)