본문 바로가기
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

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

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