Launching with UIApplicationShortcutItem

后端 未结 6 639
南旧
南旧 2021-01-31 17:38

I\'m implementing some 3D touch quick actions for my iOS 9 app in swift, and I have a curious issue. When my app is in the background and I launch with the quick action, everyth

相关标签:
6条回答
  • 2021-01-31 18:11

    I finally got this working. Here's what my AppDelegate.swift file ended up as;

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

    Much of this was taken from Apple's sample code for UIApplicationShortcuts, and while I'm having my app launch an alert to prove that it is recognizing the proper shortcut was chosen, this could be adapted to your code to pop the view controller.

    I think the func applicationDidBecomeActive was the critical part that I was missing, and removing the self.handleShortCut(shortcutItem) from didFinishLaunchingWithOptions (otherwise it was calling handleShortCut twice, it seemed).

    0 讨论(0)
  • 2021-01-31 18:11

    I tried all the above, and it didn't solve the problem than I tried handling the shortcut after delay in handleShortcut method:

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

    and added a method for every action, and it worked like a charm

    0 讨论(0)
    1. In Xcode, open Product -> Schemes -> Edit Schemes
    2. In your Run Scheme, change the Launch setting to 'Wait for executable to be launched'

    Now, if you turn on debugging and run your app, Xcode will wait for you to launch your app from the home screen so you are able to test launching it using a 3D Touch Shortcut Item.

    0 讨论(0)
  • 2021-01-31 18:19

    For 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
    }
    
    0 讨论(0)
  • 2021-01-31 18:22

    XCode 11.6, Swift 5

    We can attach a process at runtime. XCode will wait until the process is started and will get attached to it when an App is launched manually.

    XCode -> Debug -> Attach to process by PID or Name -> ("Enter the name of an app in the pop-up")

    Directions:

    1. Make sure an application is freshly installed on a device or a simulator.
    2. Kill the application.
    3. In XCode attach the name of the process as mentioned above.
    4. Open the application through the desired shortcut

    P.S: If you are using SceneDelegate a shortcutItem can be found in

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
           switch connectionOptions.shortcutItem?.localizedTitle {
           case "Search":
           break
           case "DoSomething":
           break
           default:
           break
           } 
        }
    

    Happy Debugging :)

    0 讨论(0)
  • 2021-01-31 18:34

    Replace your didfinishlaunching method with this one.

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool {
    
      if let shortcutItem =
           launchOptions?[UIApplicationLaunchOptionsShortcutItemKey]
           as? UIApplicationShortcutItem {
    
        handleShortcut(shortcutItem)
        return false
      }
      return true
    }
    
    0 讨论(0)
提交回复
热议问题