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