JHHK

欢迎来到我的个人网站
行者常至 为者常成

App间的相互跳转

目录

一、配置

要通过 URL Scheme 实现从 App A 跳转到 App B,然后从 App B 返回到 App A,你可以按照以下步骤进行:

一、配置 App B 的 URL Scheme

首先,App B 需要支持 URL Scheme,以便 App A 能够调用它。

1、在 App B 中配置 URL Scheme
在 App B 的 Info.plist 文件中,注册一个唯一的 URL Scheme。例如,将 Scheme 命名为 appb。

打开 App B 的 Info.plist 文件。 添加以下配置:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLName</key>
        <string>appb</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>appb123456</string>
        </array>
    </dict>
</array>

2、处理 URL 调用
在 App B 中的 AppDelegate 中,实现 URL Scheme 处理逻辑。
这个方法会处理从 App A 调用的 URL,并执行相应操作。App B被调用起来后会来到这个方法中。

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options {
    if ([url.scheme isEqualToString:@"appb123456"]) {
        NSLog(@"App B launched with URL: %@", url.absoluteString);
        // 处理传入的参数
    }
    return YES;
}

3、App A 跳转到 App B
在 App A 中,你需要构造一个 URL,并使用这个 URL Scheme 来跳转到 App B。

NSURL *url = [NSURL URLWithString:@"appb123456://xxxx/yyy?key=value"];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
    [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:^(BOOL success) {
        if (success) {
            NSLog(@"Successfully launched App B.");
        } else {
            NSLog(@"Failed to launch App B.");
        }
    }];
} else {
    NSLog(@"App B is not installed.");
}

4、LSApplicationQueriesSchemes 这个配置项是干什么用的?
LSApplicationQueriesSchemes 是 iOS 中的一个 Info.plist 配置项,用于声明你的应用可以查询哪些 URL Scheme(即哪些 URL Scheme 可以通过 canOpenURL: 方法检测是否已安装对应的应用)。在iOS 9 及以后,Apple 引入了隐私和安全机制,限制了应用可以查询的 URL Scheme 数量(50个)
没有在 Info.plist 中声明它要查询的 URL Scheme,调用 canOpenURL: 时会返回NO,即使目标应用已经安装。

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>appb123456</string> <!-- App B 的 URL Scheme -->
    <string>wechat</string> <!-- 微信的 URL Scheme,示例 -->
    <string>alipay</string> <!-- 支付宝的 URL Scheme,示例 -->
</array>

二、说明

iOS9之前,app通过scheme方式被调起之后会来到该方法,已经废弃,需要兼容iOS9之前的话需要实现该方法

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url;

与上边方法类似,只是提供了更多的信息,iOS9时已经被废弃

- (BOOL)application:(UIApplication *)application 
            openURL:(NSURL *)url 
            sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

iOS9及之后,app通过scheme方式被调起会来到该方法

- (BOOL)application:(UIApplication *)application 
            openURL:(NSURL *)url 
            options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options

通过Universal Links,App被调起会来到该方法

- (BOOL)application:(UIApplication *)application
  continueUserActivity:(NSUserActivity *)userActivity
  restorationHandler:(void(^)(NSArray<id<UIUserActivityRestoring>> * __nullable restorableObjects))restorationHandler;

行者常至,为者常成!





R
Valine - A simple comment system based on Leancloud.