iOS 13下自定义Scheme唤起App后application:openURL:options:未触发
iOS 13下自定义Scheme唤起App但
application(_:open:options:)未被调用的解决办法 嘿,我之前在iOS 13+的项目里也碰到过一模一样的坑!问题出在iOS 13引入的**场景化架构(Scene)**上——Xcode 11默认创建的项目会启用UISceneDelegate,这时候原来AppDelegate里的application(_:open:options:)就会被弃用,回调逻辑会转到SceneDelegate的对应方法里。
下面是具体的解决步骤:
1. 在SceneDelegate中实现正确的回调方法
打开你的SceneDelegate.swift,添加这个方法来处理唤起请求:
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) { // 获取唤起App的目标URL guard let url = URLContexts.first?.url else { return } // 在这里编写你的URL处理逻辑,比如解析参数、跳转指定页面 print("收到唤起URL:\(url)") // 示例:如果是MyApp://product/456,解析商品ID if url.scheme == "MyApp", let productID = url.pathComponents.last { print("要跳转的商品ID:\(productID)") // 这里添加页面跳转或业务逻辑 } }
2. 优化Info.plist配置(可选但推荐)
你的CFBundleURLName字段建议改成反向域名格式的唯一标识符,比如com.yourcompany.MyApp,虽然这不是导致方法不调用的直接原因,但符合苹果官方规范,能避免和其他App的Scheme命名冲突。
3. 若想回到旧架构(不推荐)
要是你暂时不想适配Scene架构,也可以手动关闭它:
- 打开
Info.plist,删除UIApplicationSceneManifest这个完整的key(包括它下面的所有子项) - 这样App就会回到iOS 12及以前的架构,
application(_:open:options:)就能正常被调用了
⚠️ 注意:苹果现在更推荐使用Scene架构来适配iPad多窗口、Mac Catalyst等功能,除非有特殊需求,否则不建议关闭。
最后测试的时候记得把App从后台彻底退出再测试,避免缓存影响结果哦!
内容的提问来源于stack exchange,提问作者Jabson




