Последовательность действий:
- Приложение запускается (только в строке меню политика активации IS_ACCESSORY).
- проверяет наличие разрешений на доступность.
Код: Выделить всё
AppDelegate - Если они отсутствуют, открывается NSWindow (Onboarding), созданный программно.
- Пользователь предоставляет разрешение -> нажимает «Начать».
- Закрытие вызывает window.close(), устанавливает ссылку на окно nil и вызывает startEngine(), чтобы начать мониторинг NSEvent.
- АВАРИЯ: приложение выходит из строя сразу или вскоре после закрытия окна и запуска механизма.
Сбой: Поток 1 (основной поток) завершает работу с objc_release. нет
libobjc.A.dylib`objc_release:
-> 0x187ff4120 : ldr x17, [x2, #0x20]
Код: Выделить всё
...
0x18802c7f4 ; objc_release_full
AppDelegate.swift
Код: Выделить всё
class AppDelegate: NSObject, NSApplicationDelegate {
var onboardingWindow: NSWindow?
let inputEngine = InputEngine.shared
func showOnboarding() {
let onboardingView = OnboardingView { \[weak self\] in
// Completion closure
self?.onboardingWindow?.close()
self?.onboardingWindow = nil
// Start the main app logic after a short delay
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
self?.startEngine()
}
}
onboardingWindow = NSWindow(
contentRect: NSRect(x: 0, y: 0, width: 450, height: 500),
styleMask: \[.titled, .closable\],
backing: .buffered,
defer: false
)
onboardingWindow?.contentView = NSHostingView(rootView: onboardingView)
onboardingWindow?.makeKeyAndOrderFront(nil)
}
func startEngine() {
// Sets up event monitors
inputEngine.startMonitoring()
}
}
Код: Выделить всё
struct OnboardingView: View {
let onComplete: () -\> Void
var body: some View {
Button("Get Started") {
// Trigger the completion in AppDelegate
onComplete()
}
}
}
- Я подозревал, что таймер внутри OnboardingView срабатывает после освобождения представления, поэтому я заменил его на onReceive(NSApplication.didBecomeActiveNotification). Сбой сохраняется.
- Я пытался использовать [weak self] везде в замыканиях.
- Сбой, похоже, связан с разрушением NSWindow или NSHostingView, совпадающим с запуском мониторов NSEvent в InputEngine.
Подробнее здесь: https://stackoverflow.com/questions/798 ... sing-onboa
Мобильная версия