iOS调研App间的相互跳转;
两个App,A和B;App内相互跳转处理:
一、scheme方式跳转
1、A --> B ,跳转前判断目标App是否安装
在A的Info.plist
的LSApplicationQueriesSchemes
,配置B的scheme
(即A中添加B跳转的白名单);B的Info.plist
的URL 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.plist
的URL 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
处理通过scheme
和UniversalLink
打开App,传递过来的数据;
关于iOS“白名单”的理解
在iOS9后,如果想要使用canOpenURL方法检查是否可以打这个URL或可以处理该URL的的App,需要在info.plist里添加LSApplicationQueriesSchemes字段来预设url,否则是否安装都会返回NO。
所以“白名单”的意义是要检查当前设备上是否安装了其他App,而不是打开其他App必须添加“白名单”。
所以如果想要打开其他App,直接使用openURL即可。
微信、微博等分享时,必须配置“白名单”是因为SDK要检测是否安装了微信、微博。
参考文章:关于iOS“白名单”的理解