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
}
}
}
}
ありがとう!
ようやくこれが機能しました。これが私の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回呼び出していたようです) 。
これで、デバッグをオンにしてアプリを実行すると、Xcodeはホーム画面からアプリを起動するのを待機するため、3Dタッチショートカットアイテムを使用してアプリの起動をテストできます。
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
}
上記すべてを試しましたが、handleShortcutメソッドの遅延後にショートカットを処理するよりも問題は解決しませんでした。
self.performSelector("action1", withObject: self, afterDelay: 0.5)
すべてのアクションにメソッドを追加し、それは魅力のように機能しました
これで、didfinishlaunchingメソッドを置き換えます。
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool {
if let shortcutItem =
launchOptions?[UIApplicationLaunchOptionsShortcutItemKey]
as? UIApplicationShortcutItem {
handleShortcut(shortcutItem)
return false
}
return true
}