在 iOS 9 及更高版本的操作系统中,Apple 引入了 Universal Links 来取代 openURL 方法。如果 A 应用使用 Universal Links 唤起 B 应用,并且 B 应用调用了 openURL 方法携带参数,那么当 B 应用通过 openURL 返回到 A 应用时,A 应用的 - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options: 方法不会被执行。
这是因为 Universal Links 提供了更安全和更可靠的方式来处理应用之间的跳转,而不再依赖于 URL Scheme 和 openURL 方法。使用 Universal Links,应用可以直接通过 HTTP/HTTPS 链接与其他应用通信,而无需通过 URL Scheme。
要解决这个问题,你需要在 A 应用中实现 - (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler 方法,该方法会在从 B 应用返回到 A 应用时被调用。在这个方法中,你可以通过 userActivity.webpageURL 获取传递的参数,并执行相应的操作。
以下是一个示例代码:
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler {
NSURL *url = userActivity.webpageURL;
// 在这里处理传递的参数并执行相应的操作
return YES;
}
注意:在使用 Universal Links 时,需要确保 A 应用和 B 应用都正确配置了 Associated Domains,并且关联的域名已经在开发者账号中进行了设置。
如果 A 应用没有执行 - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options: 方法,也没有执行 - (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler 方法,并且你的应用使用了 SceneDelegate,那么很可能是因为你在 SceneDelegate 中没有正确处理应用间跳转的情况。
从 iOS 13 开始,Apple 引入了多窗口支持和 SceneDelegate,取代了之前的 AppDelegate。当应用通过 URL Scheme 或 Universal Links 唤起另一个应用时,系统会创建一个新的 Scene 来展示被唤起的应用。在这种情况下,需要在 SceneDelegate 的相关方法中处理应用间跳转。
首先,确保你的工程中有一个 SceneDelegate 文件,并且在 Info.plist 中正确配置了场景支持。
然后,在 SceneDelegate 中实现以下方法来处理应用间跳转:
// 处理通过 URL Scheme 唤起应用的情况
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
guard let url = URLContexts.first?.url else {
return
}
// 在这里处理传递的参数并执行相应的操作
}
// 处理通过 Universal Links 唤起应用的情况
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let url = userActivity.webpageURL else {
return
}
// 在这里处理传递的参数并执行相应的操作
}
请注意,在使用 SceneDelegate 时,application(:open:options:) 和 application(:continue:restorationHandler:) 方法将不再被调用。而是使用上述的 SceneDelegate 中的对应方法来处理应用间跳转。
确保在 SceneDelegate 的配置和实现中正确处理应用间跳转的情况后,A 应用就能够正常执行相应的方法,并处理传递的参数了。
在iOS 13及更高版本中,苹果引入了Scene Delegate来管理应用程序的不同场景。当你删除了OC A应用的SceneDelegate文件后,该应用将默认回退到使用AppDelegate来处理应用程序生命周期和事件。
当B应用打开URL并返回到A应用时,A应用不会走application:(UIApplication *)app openURL:(NSURL *)url方法的原因是,这个方法属于AppDelegate,并且在没有SceneDelegate的情况下,应用程序只会使用AppDelegate进行事件处理。
如果你想让A应用能够响应URL的打开操作,可以在AppDelegate的application:didFinishLaunchingWithOptions:方法中添加逻辑来处理URL。具体的实现步骤如下:
在AppDelegate.m文件中找到application:didFinishLaunchingWithOptions:方法。
在该方法内部添加以下代码来处理URL:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 其他代码...
NSURL *url = launchOptions[UIApplicationLaunchOptionsURLKey];
if (url) {
[self handleOpenURL:url];
}
return YES;
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
[self handleOpenURL:url];
return YES;
}
- (void)handleOpenURL:(NSURL *)url {
// 处理URL打开操作的逻辑
}