场景:通过一些方式,跳转打开App B
一、URLScheme
1、配置App B
打开AppB 的 Xcode 工程的info.plist文件,添加URL Types -> URL Schemes,设置scheme字符串即可,比如myAppB
2、打开App B
- 通过其他App打开App B
使用Api如下:
ios(2.0, 10.0)
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"myAppB://xxx"]];
ios(10.0+)
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"myAppB://xxx"] options:@{} completionHandler:NULL];
ios(13.0+)
NSSet<UIScene*> *set = [UIApplication sharedApplication].connectedScenes;
UISceneOpenExternalURLOptions *options = [UISceneOpenExternalURLOptions new];
options.universalLinksOnly = false;
for (UIScene *scene in set) {
[scene openURL:[NSURL URLWithString:@"myAppB://xxx"] options:options completionHandler:^(BOOL success) {}];
}
- 手机浏览器打开App B
在
Safari浏览器地址栏输入myAppB://xxx,即可打开App B - 通过网页跳转App B
<!DOCTYPE html>
<html>
<header>
<title>跳转测试</title>
</header>
<body>
<div style=" margin-top: 30px; margin-left: 30px;">
<a style="font-size: 60px;" href="myAppB://xxx">打开app</a>
</div>
</body>
</html>
3、App B跳转后的处理
会触发的Api如下:
ios(2.0, 9.0)
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
if ([url.scheme isEqualToString:@"myAppB"]) {
// 此处处理逻辑
return YES;
}
return NO;
}
ios(4.2, 9.0)
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(id)annotation {
if ([url.scheme isEqualToString:@"myAppB"]) {
// 此处处理逻辑
return YES;
}
return NO;
}
ios(9.0+)
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options {
if ([url.scheme isEqualToString:@"myAppB"]) {
// 此处处理逻辑
return YES;
}
return NO;
}
ios(13+)
- (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts
{
for (UIOpenURLContext *context in URLContexts) {
NSURL *url = context.URL;
if ([url.scheme isEqualToString:@"myAppB"]) {
// 此处处理逻辑
}
}
}
二、Universal Link
Universal Link 是苹果在iOS9之后引入的新功能,可通过传统的HTTP链接打开特定APP。如果用户未安装APP,则会跳转到该链接所对应的页面。
1、配置App B
- 登录苹果开发者中心,找到对应的APPID,勾选
Associated Domains配置,如下:
- 打开应用工程,添加
Associated Domains项,如下图:
- 以
applinks:开头,后面填写网址,如下图:
- 创建
apple-app-site-association文件(注意没有后缀),编写如下内容,注意TeamIDBundleID请如实填写:
{
"applinks": {
"apps": [],
"details": [
{
"appID": "TeamID.BundleID",
"paths": [ "*"]
}
]
}
}
- 将
apple-app-site-association文件上传到www.myAppB.com的HTTPS服务器的根目录或者.well-known目录下;上传成功后,可以通过浏览器访问网址https://www.myAppB.com/apple-app-site-association或者https://www.myAppB.com/.well-known/apple-app-site-association,来判断apple-app-site-association文件是否上传成功;同时也可以通过访问apple准备的 验证地址 来尝试验证apple-app-site-association是否有效 - 给
https://www.myAppB.com绑定网页内容,比如应用介绍页,或者下载页。如果用户未安装APP,打开网页不至于出现空白页,用户体验会更好
2、打开App B
- 通过其他App打开App B
使用Api如下:
ios(2.0, 10.0)
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"https://www.myAppB.com"]];
ios(10.0+)
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"https://www.myAppB.com"] options:@{} completionHandler:NULL];
ios(13.0+)
NSSet<UIScene*> *set = [UIApplication sharedApplication].connectedScenes;
UISceneOpenExternalURLOptions *options = [UISceneOpenExternalURLOptions new];
options.universalLinksOnly = false;
for (UIScene *scene in set) {
[scene openURL:[NSURL URLWithString:@"https://www.myAppB.com"] options:options completionHandler:^(BOOL success) {}];
}
- 手机浏览器打开App B
在
Safari浏览器地址栏输入https://www.myAppB.com,打开网页,如果用户安装了appB,下拉网页在顶部位置会出现打开appB的按钮,点击打开按钮即可跳转 - 通过网页跳转App B
<!DOCTYPE html>
<html>
<header>
<title>跳转测试</title>
</header>
<body>
<div style=" margin-top: 30px; margin-left: 30px;">
<a style="font-size: 60px;" href="https://www.myAppB.com">打开app</a>
</div>
</body>
</html>
注意:iOS 9.2开始,有跨域问题:如果Universal Link和当前网页处于相同的域名下,则不进行跳转;如果Universal Link和当前网页处于不同的域名下,则执行跳转打开App操作。
3、App B跳转后的处理
会触发的Api如下:
ios(8.0+)
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray<id<UIUserActivityRestoring>> * __nullable restorableObjects))restorationHandler {
if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
NSURL *url = userActivity.webpageURL;
if ([url.host isEqualToString:@"myAppB.com"]) {
// 此处处理逻辑
return YES;
}
}
return NO;
}
ios(13.0+)
- (void)scene:(UIScene *)scene continueUserActivity:(NSUserActivity *)userActivity
{
if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
NSURL *url = userActivity.webpageURL;
if ([url.host isEqualToString:@"myAppB.com"]) {
// 此处处理逻辑
}
}
}
当用户通过Universal Link方式打开AppB时,NSUserActivity的activityType属性被设置为NSUserActivityTypeBrowsingWeb,表示是通过打开链接而来的;URL地址是通过NSUserActivity的webpageURL属性传递过来的,根据这个URL地址可以进行特殊的逻辑处理。
参考文章:
iOS - 关于对App跳转方法的hook
iOS Universal Link(通用链接)
H5唤起APP指南(附开源唤端库)