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

네이티브 탈출구: objc2 & Frontmost

~15 min · tauri, macos, objc2, native

Level 0웹 관광객
0 XP0/56 lessons0/13 achievements
0/100 XP to next level100 XP to go0% complete
"Tauri API는 흔한 95%를 덮어. 마지막 5%엔, 문을 잠그는 대신 OS 자체의 열쇠를 쥐여줘."

크로스 플랫폼 API로 부족할 때

Tauri 창 API는 일부러 크로스 플랫폼이라, 모든 OS 특정 버릇을 노출 못 해. 가끔 네이티브 윈도잉 층을 직접 불러야 해: macOS는 AppKit/Cocoa(objc2 크레이트로), Windows는 Win32 API(windows-rs로), Linux는 GTK. Tauri는 자기 추상 안에 널 가두지 않아 — 밑바닥 핸들에 닿아 OS랑 대화할 수 있어. 그 탈출구가 Tauri를 진지한 네이티브 앱에 쓸 만하게 만들어.

Cinder 사례: Frontmost 활성화

scaffold 트랙의 macOS 포커스 버그 기억해 — 클릭은 받는데 키 입력은 안 받던 dev 바이너리, 그리고 always-on-top 플로팅 창이 key window가 안 되던 사촌 문제. macOS는 key window에만 키보드 이벤트를 보내는데, 제대로 활성화된 포그라운드 앱이 아닌 프로세스는 영영 못 가질 수 있어. Tauri의 set_focus()만으론 안 고쳐졌어. 진짜 고침은 Cocoa로 내려갔어: set_activation_policy(Regular)로 프로세스를 승격하고, objc2NSApplication.activate()를 직접 불러.

게이트하고, 핀하고, 주석 달아

네이티브 코드는 플랫폼 특정이라 #[cfg(target_os = "macos")] 뒤에 살아야 해 — 다른 플랫폼은 그거 없이 깨끗이 컴파일돼. objc2 크레이트는 버전 관리돼(Cinder가 objc2-app-kit이랑 objc2-foundation을 핀해), 그리고 이런 코드는 다음 독자한테 안 뻔하니까 있는지 주석 달아. 네이티브 탈출구는 강력하고 오용하기 쉬워. 하중 받는 것으로 대하고 푸는 버그를 문서화해.

Code

objc2로 Cocoa에 내려가기 (cfg 게이트)·rust
// macOS 전용: 앱을 앞으로 가져와 창이 key가 되고 실제로 키보드 이벤트를
// 받게. 프로세스가 활성화된 포그라운드 앱이 아닐 때 Tauri의 set_focus()만
// 으론 부족해. (Cinder의 실제 고침.)
#[cfg(target_os = "macos")]
builder = builder.setup(|app| {
    use tauri::{ActivationPolicy, Manager};
    app.set_activation_policy(ActivationPolicy::Regular);

    use objc2_app_kit::{NSApplication, NSApplicationActivationPolicy};
    use objc2_foundation::MainThreadMarker;
    if let Some(mtm) = MainThreadMarker::new() {
        let ns_app = NSApplication::sharedApplication(mtm);
        ns_app.setActivationPolicy(NSApplicationActivationPolicy::Regular);
        ns_app.unhide(None);
        ns_app.activate();
    }
    if let Some(win) = app.get_webview_window("main") {
        let _ = win.show();
        let _ = win.set_focus();
    }
    Ok(())
});
플랫폼 스코프 네이티브 의존성·toml
# 네이티브 의존성은 Cargo.toml에서 플랫폼 스코프 + 버전 핀.
[target.'cfg(target_os = "macos")'.dependencies]
objc2 = "0.5"
objc2-app-kit = "0.3"
objc2-foundation = "0.3"

External links

Exercise

오늘 objc2를 쓸 필요는 없어, 근데 추론해봐: macOS에서 Tauri의 set_focus()가 왜 키보드 입력 전달에 실패할 수 있는지, Cocoa 레벨 activate()가 뭘 더하는지 네 말로 설명해. 그다음 네 앱이 네이티브 크레이트를 꺼낼 만한 OS 특정 동작 하나를 짚어. 탈출구가 정당한 때를 아는 게 진짜 기술이야.
Hint
핵심 개념: macOS는 키보드 이벤트를 'key window'에만 보내고, 활성화된 포그라운드 앱만 안정적으로 그걸 가져. set_focus는 Tauri한테 정중히 부탁하고, NSApplication.activate()는 OS한테 앱 전체를 frontmost로 만들라고 해. 탈출구는 Tauri의 이식성 API가 표현 못 하는 OS 사실용이야.

Progress

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

댓글 0

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

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