3D Touch 快速操作根本不起作用

3D Touch Quick actions not working at all

我已经完成了所有其他问题,但我无法弄清楚哪里出了问题。 我从 Apple Developer 站点 Add Home Screen Quick Actions 下载了示例项目,这没问题,但是当我开始一个新的 Xcode 项目并完全复制它时,它对我不起作用。我肯定错过了什么。此时我只想在控制台中打印 "shortcut pressed"。当我将 print("Shortcut pressed") 添加到我下载的 Apple 项目时,它工作正常。

此时我只是在尝试一些随机的事情。

我用数组、字典和字符串更新了我的 info.plist,我只是复制并粘贴这些值,以免出现任何拼写错误。

UIApplicationShortcutItems,项目 0,UIApplicationShortcutItemType,UIApplicationShortcutItemIconType,UIApplicationShortcutItemTitle

按下应用程序图标时出现快捷方式,但它只是打开应用程序。

这是我非常基本的 AppDelegate.Swift 文件,只是想让它做任何事情 会不会是我的项目设置问题,我的Xcode版本是最新的-版本11.1(11A1027)

我以前从未使用过快速操作,它接缝很简单,但接缝很简单,只需向 plist 添加一些行并向 AppDelegate.Swift 文件添加一些代码,但需要很长时间才能开始工作。

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

     var shortcutItemToProcess: UIApplicationShortcutItem?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        if let shortcutItem = launchOptions?[UIApplication.LaunchOptionsKey.shortcutItem] as? UIApplicationShortcutItem {
            shortcutItemToProcess = shortcutItem
            print("Shortcut pressed")
        }
        return true
    }

    func application(_ application: UIApplication, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void) {
        print("Shortcut pressed")
    }

    func applicationDidBecomeActive(_ application: UIApplication) {
        print("Shortcut pressed")
    }

    // MARK: UISceneSession Lifecycle

    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        // Called when a new scene session is being created.
        // Use this method to select a configuration to create the new scene with.
        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
    }

    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
        // Called when the user discards a scene session.
        // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
        // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
    }


}

谢谢。

看起来您的应用是基于场景的。对于基于场景的应用程序,您几乎可以忘记 AppDelegate 并专注于 SceneDelegate。您现在需要在 SceneDelegate 中覆盖两种方法,在 AppDelegate 中覆盖一种方法。为了清楚起见,我将模仿 Apple 的指南:

如果用户打开应用程序并且是全新启动,您可以在 AppDelegate:

中处理
     // AppDelegate.swift
     func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
         // Called when a new scene session is being created.
         // Use this method to select a configuration to create the new scene with.

         // Grab a reference to the shortcutItem to use in the scene
         if let shortcutItem = options.shortcutItem {
             shortcutItemToProcess = shortcutItem
         }

         // Previously this method only contained the line below, where the scene is configured
         return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
     }

如果当用户点击快捷方式项目时您的应用程序仍在后台 运行,您可以在 SceneDelegate:

中处理该问题
    // SceneDelegate.swift
    func windowScene(_ windowScene: UIWindowScene, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) {
        // When the user opens the app through a quick action, this is now the method that will be called
        (UIApplication.shared.delegate as! AppDelegate).shortcutItemToProcess = shortcutItem
    }

场景准备就绪后,您可以使用快捷方式执行所需操作:

    // SceneDelegate.swift
    func sceneDidBecomeActive(_ scene: UIScene) {
        // Is there a shortcut item that has not yet been processed?
        if let shortcutItem = (UIApplication.shared.delegate as! AppDelegate).shortcutItemToProcess {
            // In this sample an alert is being shown to indicate that the action has been triggered,
            // but in real code the functionality for the quick action would be triggered.
            var message = "\(shortcutItem.type) triggered"
            if let name = shortcutItem.userInfo?["Name"] {
                message += " for \(name)"
            }
            let alertController = UIAlertController(title: "Quick Action", message: message, preferredStyle: .alert)
            alertController.addAction(UIAlertAction(title: "Close", style: .default, handler: nil))
            window?.rootViewController?.present(alertController, animated: true, completion: nil)

            // Reset the shorcut item so it's never processed twice.
            (UIApplication.shared.delegate as! AppDelegate).shortcutItemToProcess = nil
        }
    }