Подтвердить что ты не робот

Запуск с помощью UIApplicationShortcutItem

Я быстро внедряю быстрые действия по 3D-касанию для моего приложения iOS 9, и у меня есть любопытная проблема. Когда мое приложение находится в фоновом режиме, и я запускаю его с быстрым действием, все идет так, как планировалось. Когда мое приложение полностью мертво (т.е. Я его убил из меню многозадачности), и я запускаю его с быстрым действием, приложение выходит из строя. У меня возникли проблемы с отладкой, так как как только я убью приложение, сеанс отладки в Xcode отключается. Есть ли способ подключиться к приложению для отладки, как обычно, или есть что-то в моем коде, которое могло бы вызвать его? Спасибо заранее.

код:

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

Спасибо!

4b9b3361

Ответ 1

Наконец-то я получил эту работу. Здесь мой файл AppDelegate.swift оказался следующим:

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

}

Большая часть этого была взята из Apple пример кода для UIApplicationShortcuts, и пока у меня появляется приложение для запуска приложения, чтобы доказать, что он распознает правильный ярлык, было выбранный, это может быть адаптировано к вашему коду, чтобы вызвать контроллер вида.

Я думаю, что func applicationDidBecomeActive была важной частью, которой я отсутствовал, и удалив self.handleShortCut(shortcutItem) из didFinishLaunchingWithOptions (в противном случае это вызывало handleShortCut дважды).

Ответ 2

  • В Xcode откройте "Продукт" - "Схемы" → "Редактировать схемы"
  • В вашей схеме запуска измените параметр запуска на "Ожидание запуска исполняемого файла"

Теперь, если вы включите отладку и запустите приложение, Xcode будет ждать, когда вы запустите приложение с главного экрана, чтобы вы могли протестировать его запуск с помощью пункта быстрого доступа к 3D-касанию.

См. снимок экрана в Xcode настройки

Ответ 3

Я пробовал все выше, и это не решило проблему чем я пытался обработать ярлык после задержки в методе handleShortcut:

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

и добавил метод для каждого действия, и он работал как шарм

Ответ 4

Замените метод didfinishlaunching на этот.

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

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

    handleShortcut(shortcutItem)
    return false
  }
  return true
}

Ответ 5

Для 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
}