C.W.K.
Stream
Lesson 05 of 06 · published

포커스를 안 받는 macOS dev 바이너리

~12 min · tauri, macos, gotcha, dev

Level 0웹 관광객
0 XP0/56 lessons0/13 achievements
0/100 XP to next level100 XP to go0% complete
"예쁜 새 창에 문장을 치는데 그게 터미널에 나타나는 걸 보게 될 거야. 왜인지 — 그리고 왜 네 잘못이 아닌지 알려줄게."

증상

macOS에서 tauri dev를 돌리면 창이 뜨고, 텍스트 필드를 클릭하고, 타이핑을 시작하는데 — 아무것도 안 박혀. 글자가 직전에 포커스였던 앱(보통 터미널이나 에디터)으로 가. 마우스 클릭은 되는데 키보드 입력은 안 돼. Tauri 버그처럼 느껴져. 정확히는 아냐.

원인: 아직 진짜 앱이 아냐

tauri dev를 돌리면 macOS가 맨 cargo debug 바이너리를 띄워 — 패키징된 .app 번들이 아니라. 맨 바이너리는 진짜 앱처럼 macOS LaunchServices에 등록이 안 돼서, 일부 macOS 버전에선 frontmost 애플리케이션으로 절대 승격이 안 돼. frontmost 앱이 소유하지 않은 창은 마우스 이벤트는 받아도 key window가 못 돼 — 그리고 key window의 웹뷰만 키보드 이벤트를 받아. 그게 버그 전부고, dev 모드 특정이야.

좋은 소식과 고치는 법

빌드된 .app엔 이 문제가 없어 — 제대로 된 번들이라 정상 등록되고, 다른 앱처럼 frontmost가 돼. 그러니 사용자한텐 절대 안 닿아. dev 루프에선 빠른 우회로가 앱 뜨고 나서 Cmd-Tab으로 그 앱에 가는 거야. 진짜 고치는 법은 macOS한테 프로세스를 승격·활성화하라고 살짝 미는 작은 setup() 훅이야. 이 버그가 Cinder를 개발 중에 물었어. 완전한 Cocoa 레벨 고침은 windows 트랙의 네이티브 활성화 레슨에 있어 — 지금은 그냥 증상을 알아둬서 오후 하나를 안 날리게.

Code

응급처치: macOS한테 dev 프로세스를 진짜 앱처럼 다루라고 부탁·rust
// Tauri 레벨 레버 (선언적). 맨 dev 바이너리엔 이것만으론 부족할 때가
// 많아 — 깊은 Cocoa 고침은 windows 트랙에 — 근데 존재한다는 걸 제일
// 먼저 알아야 해.
use tauri::{ActivationPolicy, Manager};

tauri::Builder::default()
    .setup(|app| {
        #[cfg(target_os = "macos")]
        app.set_activation_policy(ActivationPolicy::Regular);

        if let Some(w) = app.get_webview_window("main") {
            let _ = w.set_focus();
        }
        Ok(())
    });

External links

Exercise

Mac이면 재현해봐: tauri dev 돌리고, 창을 클릭하고, Cmd-Tab 먼저 안 하고 타이핑해봐. 글자가 박히는지 봐. 그다음 Cmd-Tab으로 앱에 가서 다시 해봐. 버그를 맞든 안 맞든(macOS 버전 따라 달라), 맨 dev 바이너리가 왜 패키징된 .app이랑 다르게 행동하는지 한 문장으로 설명해봐.
Hint
핵심 개념은 'frontmost 앱' + 'key window'. 맨 바이너리는 진짜 .app처럼 LaunchServices에 등록이 안 돼서 macOS가 frontmost로 승격을 안 할 수 있고 — key window의 웹뷰만 키보드 이벤트를 받아.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.