3D Touch Quick Actions完全失效,复制苹果示例代码仍无法运行
解决3D Touch Quick Actions在Xcode 11新项目中无响应的问题
你遇到的问题核心是Xcode 11默认启用了UIScene生命周期,而苹果的示例项目大概率还是基于旧的UIApplication生命周期开发的,导致你复制的AppDelegate代码无法触发快捷方式的回调逻辑。
问题根源
从Xcode 11开始,新建项目默认采用Scene-Based App架构,原来属于UIApplicationDelegate的很多回调会转移到UISceneDelegate中,包括3D Touch Quick Actions的处理逻辑。你在AppDelegate中实现的performActionFor shortcutItem方法,在Scene模式下不会被系统调用——这就是为什么点击快捷方式只会打开App,但完全没有打印"shortcut pressed"的原因。
解决方案:将快捷方式处理逻辑移到SceneDelegate
你需要在SceneDelegate.swift中添加对应的处理方法,具体步骤如下:
- 在
scene(_:willConnectTo:options:)方法中处理冷启动时的快捷方式参数:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { // 处理App完全关闭时,点击快捷方式启动的场景 if let shortcutItem = connectionOptions.shortcutItem { handleShortcutItem(shortcutItem) } guard let _ = (scene as? UIWindowScene) else { return } }
- 实现Scene模式下的快捷方式回调方法:
func windowScene(_ windowScene: UIWindowScene, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) { handleShortcutItem(shortcutItem) completionHandler(true) }
- 添加统一的处理函数(让代码更整洁,也方便后续扩展不同快捷方式的逻辑):
private func handleShortcutItem(_ shortcutItem: UIApplicationShortcutItem) { print("shortcut pressed") // 后续如果有多个快捷方式,可以通过shortcutItem.type区分处理 }
额外检查点
- 确认你的项目Info.plist中存在
UIApplicationSceneManifest配置(这是Xcode 11新项目默认自带的),如果手动移除过这个配置,AppDelegate的方法才会生效,但不建议这么做,应该遵循新的生命周期规范。 - 再次核对
UIApplicationShortcutItems的配置项,确保UIApplicationShortcutItemType等字段没有拼写错误——虽然你说已经严格复制,但细节失误往往是这类问题的元凶。
修改完成后,无论App是完全关闭状态点击快捷方式启动,还是在后台时被快捷方式唤起,都能正常触发打印逻辑了。
内容的提问来源于stack exchange,提问作者Kurt L.
相关产品推荐
相关产品推荐

