ios swift ios9 3dtouch

ios - Lanzamiento con UIApplicationShortcutItem



swift ios9 (4)

Estoy implementando algunas acciones rápidas táctiles 3D para mi aplicación iOS 9 de manera rápida, y tengo un problema curioso. Cuando mi aplicación está en segundo plano y se inicia con la acción rápida, todo sale según lo planeado. Cuando mi aplicación está totalmente muerta (es decir, la eliminé en el menú multitarea), y ejecuto la acción rápida, la aplicación falla. Estoy teniendo problemas para depurar esto ya que una vez que finalizo la aplicación, la sesión de depuración en Xcode se separa. ¿Hay alguna manera de conectarme a la aplicación para depurar como de costumbre, o hay algo en mi código que la esté causando? Gracias por adelantado.

Código:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { var launchedFromShortCut = false //Check for ShortCutItem if let shortcutItem = launchOptions?[UIApplicationLaunchOptionsShortcutItemKey] as? UIApplicationShortcutItem { launchedFromShortCut = true self.handleShortCutItem(shortcutItem) } return !launchedFromShortCut } func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void) { self.handleShortCutItem(shortcutItem) } func handleShortCutItem(shortcutItem: UIApplicationShortcutItem) { //Get type string from shortcutItem if let shortcutType = ShortcutType.init(rawValue: shortcutItem.type) { //Get root navigation viewcontroller and its first controller let rootNavigationViewController = window!.rootViewController as? UINavigationController if let rootViewController = rootNavigationViewController?.viewControllers.first as! LaunchViewController? { //Pop to root view controller so that approperiete segue can be performed rootNavigationViewController?.popToRootViewControllerAnimated(false) switch shortcutType { case .Compose: rootViewController.shouldCompose() break } } } }

¡Gracias!


  1. En Xcode, abra Producto -> Esquemas -> Editar esquemas
  2. En su esquema de ejecución, cambie la configuración de inicio a "Espere a que se inicie el ejecutable"

Ahora, si activa la depuración y ejecuta su aplicación, Xcode esperará a que inicie la aplicación desde la pantalla de inicio para que pueda probarla con un elemento de acceso directo táctil 3D.

Ver captura de pantalla en Xcode de la configuración


Finalmente conseguí este trabajo. Aquí está lo que mi archivo AppDelegate.swift terminó como;

class AppDelegate: UIResponder, UIApplicationDelegate { // Properties var window: UIWindow? var launchedShortcutItem: UIApplicationShortcutItem? func applicationDidBecomeActive(application: UIApplication) { guard let shortcut = launchedShortcutItem else { return } handleShortcut(shortcut) launchedShortcutItem = nil } func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // Override point for customization after application launch. var shouldPerformAdditionalDelegateHandling = true // If a shortcut was launched, display its information and take the appropriate action if let shortcutItem = launchOptions?[UIApplicationLaunchOptionsShortcutItemKey] as? UIApplicationShortcutItem { launchedShortcutItem = shortcutItem // This will block "performActionForShortcutItem:completionHandler" from being called. shouldPerformAdditionalDelegateHandling = false } return shouldPerformAdditionalDelegateHandling } func handleShortcut( shortcutItem:UIApplicationShortcutItem ) -> Bool { // Construct an alert using the details of the shortcut used to open the application. let alertController = UIAlertController(title: "Shortcut Handled", message: "/"/(shortcutItem.localizedTitle)/"", preferredStyle: .Alert) let okAction = UIAlertAction(title: "OK", style: .Default, handler: nil) alertController.addAction(okAction) // Display an alert indicating the shortcut selected from the home screen. window!.rootViewController?.presentViewController(alertController, animated: true, completion: nil) return handled } func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void) { completionHandler(handleShortcut(shortcutItem)) }

Gran parte de esto se tomó del código de muestra de Apple para UIApplicationShortcuts, y mientras mi aplicación lanza una alerta para demostrar que está reconociendo que se eligió el método abreviado adecuado, esto podría adaptarse a su código para abrir el controlador de vista.

Creo que la func applicationDidBecomeActive fue la parte crítica que faltaba, y eliminar el self.handleShortCut(shortcutItem) de didFinishLaunchingWithOptions (de lo contrario, llamaba a handleShortCut dos veces, parecía).


Intenté todo lo anterior, y no resolví el problema, por lo que intenté manejar el acceso directo después de la demora en el método handleShortcut:

self.performSelector("action1", withObject: self, afterDelay: 0.5)

y agregó un método para cada acción, y funcionó a la perfección.


Reemplace su método de lanzar didfinishlaunching con este.

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool { if let shortcutItem = launchOptions?[UIApplicationLaunchOptionsShortcutItemKey] as? UIApplicationShortcutItem { handleShortcut(shortcutItem) return false } return true }