3D Touch Быстрые действия вообще не работают - PullRequest
2 голосов
/ 18 октября 2019

Я прошел через все остальные вопросы, и я не могу понять, что не так. Я скачал пример проекта с сайта Apple для разработчиков Добавление быстрых действий на главный экран , и это не проблема, но когда я запускаю новый проект Xcode и копирую его, он точно не работает для меня. Я должен что-то упустить. На данный момент я просто хочу, чтобы он печатал в консоли с надписью «нажал ярлык». Когда я добавляю print("Shortcut pressed") в проект Apple, я скачал, он работает нормально.

На данный момент я просто пробую случайные вещи.

Я обновил свой info.plist с помощью массива и словаряи строки, и я просто копирую и вставляю значения, чтобы не допустить ошибок при опечатке.

UIApplicationShortcutItems, Item 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.
    }


}

Спасибо.

1 Ответ

1 голос
/ 20 октября 2019

Похоже, ваше приложение основано на Scene. Для приложений на основе сцены вы можете почти забыть о 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
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...