web-dev-qa-db-fra.com

Lancer avec UIApplicationShortcutItem

J'implémente des actions rapides 3D Touch pour mon application iOS 9 dans Swift, et j'ai un problème curieux. Lorsque mon application est en arrière-plan et que je lance l'action rapide, tout se passe comme prévu. Lorsque mon application est totalement morte (c'est-à-dire que je l'ai supprimée à partir du menu multitâche), et que je lance l'action rapide, l'application se bloque. Je ne parviens pas à déboguer ceci car une fois l'application supprimée, la session de débogage dans Xcode est déconnectée. Existe-t-il un moyen pour moi de me connecter à l'application pour déboguer comme d'habitude, ou y a-t-il quelque chose dans mon code qui en serait la cause? Merci d'avance.

Code:

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
            }
        }
    }
}

Merci!

20
Connor Hicks

J'ai finalement eu ce travail. Voici ce que mon fichier AppDelegate.Swift a fini comme;

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))

}

Cela provient en grande partie de exemple de code d'Apple pour UIApplicationShortcuts. Lorsque mon application lance une alerte pour prouver qu'elle reconnaît que le raccourci correct a été choisi, il peut être adapté à votre code le contrôleur de vue.

Je pense que le func applicationDidBecomeActive était la partie essentielle qui me manquait et que je retirais la self.handleShortCut(shortcutItem) de didFinishLaunchingWithOptions (sinon, elle appelait handleShortCut deux fois, semblait-il).

20
ZbadhabitZ
  1. Dans Xcode, ouvrez Product -> Schemes -> Edit Schemes.
  2. Dans votre schéma d’exécution, définissez le paramètre de lancement sur «Attendre que le fichier exécutable soit lancé».

Désormais, si vous activez le débogage et exécutez votre application, Xcode attendra que vous lanciez votre application à partir de l'écran d'accueil afin que vous puissiez le tester à l'aide d'un élément de raccourci tactile 3D.

Voir la capture d'écran dans Xcode du paramètre

44
Andrew Varvel

Pour Swift 4.2

   func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    var isLaunchedFromQuickAction = false
    if let shortcutItem = launchOptions?[UIApplication.LaunchOptionsKey.shortcutItem] as? UIApplicationShortcutItem {
        isLaunchedFromQuickAction = true
        handleQuickAction(shortcutItem: shortcutItem)
    }

    return isLaunchedFromQuickAction
}
1
atul Pol

J'ai essayé tout ce qui précède et cela n'a pas résolu le problème .__

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

et ajouté une méthode pour chaque action, et cela a fonctionné comme un charme

1
Omar Albeik

Remplacez votre méthode didfinishlaunching par celle-ci. 

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool {

  if let shortcutItem =
       launchOptions?[UIApplicationLaunchOptionsShortcutItemKey]
       as? UIApplicationShortcutItem {

    handleShortcut(shortcutItem)
    return false
  }
  return true
}
0
Vishal Seth