iOS APP跳转

2,975 阅读3分钟

场景:通过一些方式,跳转打开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

image.png

  • 打开应用工程,添加Associated Domains项,如下图:

image.png

  • applinks:开头,后面填写网址,如下图:

image.png

  • 创建apple-app-site-association文件(注意没有后缀),编写如下内容,注意TeamID BundleID请如实填写:
{
    "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时,NSUserActivityactivityType属性被设置为NSUserActivityTypeBrowsingWeb,表示是通过打开链接而来的;URL地址是通过NSUserActivitywebpageURL属性传递过来的,根据这个URL地址可以进行特殊的逻辑处理。

参考文章:
iOS - 关于对App跳转方法的hook
iOS Universal Link(通用链接)
H5唤起APP指南(附开源唤端库)