Уведомления о главном сбое потока [закрыто]IOS

Программируем под IOS
Ответить
Anonymous
 Уведомления о главном сбое потока [закрыто]

Сообщение Anonymous »

Я пытаюсь настроить локальные уведомления и продолжать получать следующую ошибку в моей консоли, когда я нажимаю на уведомление: < /p>

Ошибка утверждения в
-[_ ttc7swiftuip33_acc2c5639a76f611e170e831fcaiftcplcplcplcplcplcplcplcplcplcplcplcplcplcplcplcprcplcprcplcprcplcplcr _performblockafterCatransActionCommitsytSynchronizes:], uiApplication.m: 3421 Завершающее приложение из -за исключения Uncaught
'nsinternalinconsistencyexception', причина: «Вызов должен быть сделан на магистрали
< /p>
< /blockquote>
. />(0x18c89a8c8 0x1898117c4 0x18a798e80 0x19343e5b8 0x193454778
0x193454b24 0x104467aac 0x104469f55 0x10446ac21 0x10446b4c9
0x10446ACFD 0x10446B62D 0x10446B369 0x10446B771 0x18AD432A9)
libc ++ abi: завершение из -за непред -исключения типа nsexception < /p>
< /blockquote>

Код: Выделить всё

final class NotificationManager: NSObject, UNUserNotificationCenterDelegate {
@MainActor static let shared = NotificationManager()

@MainActor func configure() {
UNUserNotificationCenter.current().delegate = self
}

func userNotificationCenter(_ center: UNUserNotificationCenter,
willPresent notification: UNNotification) async -> UNNotificationPresentationOptions {
[.banner, .list, .sound]
}

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

enum Notifications {
@MainActor
static func schedule(id: String = UUID().uuidString,
title: String,
body: String,
hour: Int,
minute: Int,
days: Set) async throws
{
guard !days.isEmpty else { return }

let center = UNUserNotificationCenter.current()

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

@MainActor
private func handleDeepLink(_ url: URL) {
print("Handling deep link: \(url)")

guard url.scheme == "sparky"  else {
print("Invalid URL scheme: \(url.scheme ?? "nil")")
return
}

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 }

self.navManager.popToRoot()
self.navManager.codeOfTheDay = code

} 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)")
}
}
}
Я пробовал несколько вещей, таких как использование Appdelegate, но, кажется, ничего не работает.

Подробнее здесь: https://stackoverflow.com/questions/797 ... read-crash
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»