web-dev-qa-db-ja.com

UIApplicationShortcutItemで起動する

SwiftでiOS 9アプリにいくつかの3Dタッチクイックアクションを実装していますが、興味深い問題があります。アプリがバックグラウンドにあり、クイックアクションで起動すると、すべてが予定どおりに進みます。アプリが完全に停止し(マルチタスクメニューからアプリを強制終了した)、クイックアクションで起動すると、アプリがクラッシュします。アプリを強制終了すると、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
            }
        }
    }
}

ありがとう!

26
Connor Hicks

ようやくこれが機能しました。これが私の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_は欠けていた重要な部分であり、didFinishLaunchingWithOptionsからself.handleShortCut(shortcutItem)を削除したと思います(そうでない場合、handleShortCutを2回呼び出していたようです) 。

22
ZbadhabitZ
  1. Xcodeで、Product-> Schemes-> Edit Schemesを開きます。
  2. 実行スキームで、起動設定を「実行可能ファイルの起動を待つ」に変更します。

これで、デバッグをオンにしてアプリを実行すると、Xcodeはホーム画面からアプリを起動するのを待機するため、3Dタッチショートカットアイテムを使用してアプリの起動をテストできます。

設定のXcodeのスクリーンショットを参照

48
Andrew Varvel

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
}
2
atul Pol

上記すべてを試しましたが、handleShortcutメソッドの遅延後にショートカットを処理するよりも問題は解決しませんでした。

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

すべてのアクションにメソッドを追加し、それは魅力のように機能しました

1
Omar Albeik

これで、didfinishlaunchingメソッドを置き換えます。

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