Hello all!
I'm sorry to cross post this question (I've already done on stackoverflow: https://stackoverflow.com/questions/67349440/swifui-quick-actions-using-navigationview-and-navigationlink), but here I hope to find more fortune than there.
Code created so far:
QuickActionViewModel.swift
QATestApp.swift
ContentView.swift
Home() has some stuff to see when the app opens.
I've statically create Shortcut items in the info.plist
Problem number one:
If I navigate away from home, send the app to background and then use one of the quick actions, none of them work.
I've added
to check and every time prints a value
Problem number two:
if I trigger one of the quick actions the app opens and show correctly
the related view. If I send on bg again and trigger another quick
action, the app open to the old one (correct, I sent to background with
this view open), shows the Home(), show the selected view and return to
the home almost istantly, with onreceive printing NIL.
Any help is really appreciated
I'm sorry to cross post this question (I've already done on stackoverflow: https://stackoverflow.com/questions/67349440/swifui-quick-actions-using-navigationview-and-navigationlink), but here I hope to find more fortune than there.
Code created so far:
QuickActionViewModel.swift
Code Block import Foundation class QuickActionsViewModel: ObservableObject { enum Action: Hashable { case one case two case three } @Published var action: Action? = nil }
QATestApp.swift
Code Block import CoreData import SwiftUI import UIKit var shortcutItemToHandle: UIApplicationShortcutItem? let quickActionsViewModel = QuickActionsViewModel() @main enum MainApp { static func main() { QATestApp.main() } } struct QATestApp: App { @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate @Environment(\.scenePhase) var lifeCycle var body: some Scene { WindowGroup { ContentView() .environmentObject(quickActionsViewModel) } .onChange(of: lifeCycle) { newLifeCyclePhase in if newLifeCyclePhase == .active { guard let name = shortcutItemToHandle?.type else { return } switch name { case "OneAction": quickActionsViewModel.action = .one case "TwoAction": quickActionsViewModel.action = .two case "ThreeAction": quickActionsViewModel.action = .three default: break } } } } } class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { let sceneConfiguration = UISceneConfiguration(name: "Custom Configuration", sessionRole: connectingSceneSession.role) sceneConfiguration.delegateClass = SceneDelegate.self return sceneConfiguration } } class SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { if let shortcutItem = connectionOptions.shortcutItem { handleShortcutItem(shortcutItem) } } func windowScene(_ windowScene: UIWindowScene, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) { shortcutItemToHandle = shortcutItem } private func handleShortcutItem(_ shortcutItem: UIApplicationShortcutItem, completionHandler: ((Bool) -> Void)? = nil) {} }
ContentView.swift
Code Block import Combine import Defaults import SwiftUI struct ContentView: View { @EnvironmentObject var quickActionsViewModel: QuickActionsViewModel var body: some View { NavigationView { VStack { Home() // quick actions links NavigationLink(destination: Text("One"), tag: .one, selection: self.$quickActionsViewModel.action) { EmptyView() } NavigationLink(destination: Text("Two"), tag: .two, selection: self.$quickActionsViewModel.action) { EmptyView() } NavigationLink(destination: Text("Three"), tag: .three, selection: self.$quickActionsViewModel.action) { EmptyView() } } } .navigationViewStyle(StackNavigationViewStyle()) .onReceive(self.quickActionsViewModel.$action, perform: { action in print(action.debugDescription) }) } }
Home() has some stuff to see when the app opens.
I've statically create Shortcut items in the info.plist
Code Block <key>UIApplicationShortcutItems</key> <array> <dict> <key>UIApplicationShortcutItemIconSymbolName</key> <string>book.fill</string> <key>UIApplicationShortcutItemTitle</key> <string>One</string> <key>UIApplicationShortcutItemType</key> <string>OneAction</string> </dict> <dict> <key>UIApplicationShortcutItemIconSymbolName</key> <string>book.fill</string> <key>UIApplicationShortcutItemTitle</key> <string>Twor</string> <key>UIApplicationShortcutItemType</key> <string>TwoAction</string> </dict> <dict> <key>UIApplicationShortcutItemIconSymbolName</key> <string>book.fill</string> <key>UIApplicationShortcutItemTitle</key> <string>Three</string> <key>UIApplicationShortcutItemType</key> <string>ThreeAction</string> </dict> </array>
Problem number one:
If I navigate away from home, send the app to background and then use one of the quick actions, none of them work.
I've added
Code Block .onReceive(self.quickActionsViewModel.$action, perform: { action in print(action.debugDescription) })
to check and every time prints a value
Problem number two:
if I trigger one of the quick actions the app opens and show correctly
the related view. If I send on bg again and trigger another quick
action, the app open to the old one (correct, I sent to background with
this view open), shows the Home(), show the selected view and return to
the home almost istantly, with onreceive printing NIL.
Any help is really appreciated