Я пытаюсь настроить локальные уведомления и продолжать получать следующую ошибку в моей консоли, когда я нажимаю на уведомление: < /p>
Ошибка утверждения в -[_ ttc7swiftuip33_acc2c5639a76f611e170e831fca49118swiftuiapplical _performblockafterCatransActionCommitsytSynchronizes:], uiApplication.m: 3421 Завершение приложения из -за исключения Uncaught 'nsinternalinconsistenceexception', причина: «Вызов должен быть сделан в основной нити» *** Степень вызовов: (0x18c89a8c8 0x1898117c4 0x18a79803030303030303030303030.0x1930303030303030.0x193030303030.0x193030303030.0x193030303030.0x1930303030.0x1930303030.89.89.89.0x1898117. 0x193454778 0x193454B24 0x104467AAC 0x104469F55 0x10446AC21 0x10446B4C9 0x10446ACFD 0x10446B62D 0x10446B369 0x10446B771118AD43aLe Завершение из -за непредучаного исключения типа nsexception < /p>
Я пытаюсь настроить локальные уведомления и продолжать получать следующую ошибку в моей консоли, когда я нажимаю на уведомление: < /p> Ошибка утверждения в -[_ ttc7swiftuip33_acc2c5639a76f611e170e831fca49118swiftuiapplical _performblockafterCatransActionCommitsytSynchronizes:], uiApplication.m: 3421 Завершение приложения из -за исключения Uncaught 'nsinternalinconsistenceexception', причина: «Вызов должен быть сделан в основной нити» *** Степень вызовов: (0x18c89a8c8 0x1898117c4 0x18a79803030303030303030303030.0x1930303030303030.0x193030303030.0x193030303030.0x193030303030.0x1930303030.0x1930303030.89.89.89.0x1898117. 0x193454778 0x193454B24 0x104467AAC 0x104469F55 0x10446AC21 0x10446B4C9 0x10446ACFD 0x10446B62D 0x10446B369 0x10446B771118AD43aLe Завершение из -за непредучаного исключения типа nsexception < /p> [code]final class NotificationManager: NSObject, UNUserNotificationCenterDelegate { @MainActor static let shared = NotificationManager()
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse) async { guard let link = response.notification.request.content.userInfo["deeplink"] as? String, let url = URL(string: link) else { return }
// Post notification instead of directly opening URL // This ensures all handling happens in the right context DispatchQueue.main.async { NotificationCenter.default.post( name: .handleDeepLink, object: url ) } } }
for day in days { let content = UNMutableNotificationContent() content.title = title content.body = body content.sound = .default content.userInfo = ["deeplink" : "sparky://codeoftheday/\(Code.allCodes.randomElement()?.ruleNumber ?? "2-028")"]
var date = DateComponents() date.hour = hour date.minute = minute date.weekday = day.rawValue
let trigger = UNCalendarNotificationTrigger(dateMatching: date, repeats: true)
// make a stable id per weekday so you can reschedule/update let perDayID = "\(id).\(day.rawValue)" let request = UNNotificationRequest(identifier: perDayID, content: content, trigger: trigger) try await center.add(request) } } }
extension Notification.Name { static let handleDeepLink = Notification.Name("handleDeepLink") static let appDidReceiveURL = Notification.Name("appDidReceiveURL") static let showCodeOfTheDay = Notification.Name("showCodeOfTheDay") static let widgetToolSelected = Notification.Name("widgetToolSelected") }
@main struct MyApp: App { var body: some Scene { WindowGroup { NavigationStack { ContentView() } .task { NotificationManager.shared.configure()
do { let granted = try await UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) if granted { print("Notifications Granted") } } catch { print(error.localizedDescription) } } .onOpenURL { url in handleDeepLink(url) } .onReceive(NotificationCenter.default.publisher(for: .handleDeepLink)) { notification in guard let url = notification.object as? URL else { return } handleDeepLink(url) } } } }
guard let host = url.host else { print("No host in URL") return }
// Convert the hyphenated URL format back to a tool name let toolName: String if host == "nema-configurations" { toolName = "configurations" } else { toolName = host .replacingOccurrences(of: "-", with: " ") .localizedCapitalized }
if toolName.lowercased() == "calculator" { if !self.navManager.showingCalculator { self.navManager.showingCalculator = true } } else if toolName.lowercased() == "notes" { if !self.navManager.showingNotes { UserDefaults.standard.set(0, forKey: "jobsNotesTab") self.navManager.showingNotes = true } } else if toolName.lowercased() == "jobs" { if !self.navManager.showingNotes { UserDefaults.standard.set(1, forKey: "jobsNotesTab") self.navManager.showingNotes = true } } else if toolName.lowercased() == "install assistant" { if !self.navManager.showInstallAssistant { self.navManager.showInstallAssistant = true } } else if toolName.lowercased() == "codeoftheday", let ruleNumber = url.pathComponents.last { let code = Code.allCodes.first { $0.ruleNumber == ruleNumber }
} else if let tool = self.toolStore.findTool(byName: toolName) { self.navManager.popToRoot() self.navManager.navigate(to: tool.route) self.selectedToolRoute = tool.route } else { print("Could not find tool for name: \(toolName)") } } } [/code] Я пробовал несколько вещей, таких как использование Appdelegate, но, кажется, ничего не работает.