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

발판 넷, 각각 우아하게 실패

~12 min · ladder, insertion-methods, graceful-degradation, cgevent

Level 0불씨 없음
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"모든 앱에 텍스트를 넣는 한 방법은 없어. 네 방법이 있고, 각각이 포기할 때의 계획이 있어."

왜 방법이 아니라 사다리

macOS 엔 어디서나 되는 단일 안정적 '이 텍스트를 포커스된 필드에 삽입' 호출이 없어. 앱마다 다른 표면을 노출하니, 삽입은 사다리 야: 적용되는 최선 방법을 시도하고, 안 되면 다음 발판으로 내려가. 각 발판이 깨끗함을 넓이와 맞바꿔.

네 발판

1. AX 교체            제일 깨끗, 클립보드 안 건드림
   |  (앱이 안정적 편집 가능 값 + 범위를 노출하는 곳만)
   v  실패 -> 
2. 클립보드 + Cmd+V    대부분 앱과 큰 텍스트의 넓은 기본
   |  (클립보드 건드림; 저장/복원 예의 필요)
   v  실패 / 적대적 ->
3. Unicode 키 이벤트   키 입력 합성, 클립보드 부작용 없음
   |  (느림; 짧은 텍스트나 붙여넣기-적대 타깃에 좋음)
   v  실패 ->
4. 클립보드 전용       최후 수단: 복사 + "수동 붙여넣기" 알림

발판 1, AX 교체: 포커스된 요소가 편집 가능 값과 선택 범위를 안정적으로 노출하면, 접근성으로 교체 — 클립보드 안 건드림, 최대한 깨끗. 검증된 앱에서만 써. 발판 2, 클립보드 + 합성 Cmd+V: 큰 텍스트와 대부분 앱의 넓은 기본; 거의 어디서나 되지만 클립보드를 건드려, 그래서 다룰 클립보드 예의를 빚져. 발판 3, Unicode 키 이벤트: CGEvent 로 문자를 합성 — 클립보드 부작용 없지만 느림; 짧은 텍스트나 붙여넣기-적대 타깃에 좋음. 발판 4, 클립보드-전용: 아무것도 안 되면, 텍스트를 복사하고 붙여넣으라고 유저한테 말해.

실패 말고 격하해

사다리의 핵심은 삽입이 그냥 실패 하지 않고 — 격하한다는 거야. 최악의 경우(클립보드 + 알림)조차 유저를 텍스트에서 한 키 입력 거리에 두고, 뭐가 벌어졌는지 명확한 메시지를 줘. 단일-방법 설계랑 비교해: AX-전용 고르면 그걸 안 노출하는 모든 앱에서 깨지고; 붙여넣기-전용 고르면 타깃이 붙여넣기를 거부할 때 막혀. 사다리는 항상 되는 발판 하나 가 있다는 뜻이고, 유저는 늘 자기 단어를 갖게 돼.

보편 방법이 없는 연산엔, 보장된 바닥이 있는 사다리를 지어. 이상적 접근이 가끔만 될 때, 기능 전체를 거기 걸지 마. 방법을 최선-부터-넓음 순으로 정렬하고 마지막 발판을 실패-불가 폴백(여기선 클립보드 + 알림)으로 만들어. 모든 유저가 어떤 발판엔 도달; 아무도 막다른 길 안 만나.
맹목적으로 시도 말고 타깃 카테고리에서 발판을 골라. 스냅샷의 카테고리(브라우저, 에디터, 터미널, 미상)가 어느 발판이 될 것 같은지 이미 알려줘, 그래서 매번 맨 위에서 실패해 내려가는 대신 맞는 높이에서 시작할 수 있어. 신뢰할 에디터는 AX 에서 시작; 미상 앱은 붙여넣기에서 시작; 터미널은 통째로 자기 프로파일을 받아.

Code

사다리: 각 발판 시도, 바닥 보장·swift
func insert(_ text: String, into t: TargetSnapshot) async -> InsertOutcome {
    // 발판 1 — 제일 깨끗, AX 가 검증된 곳만.
    if t.category.axReliable, await axReplace(text, in: t.focusedElement) { return .inserted(.ax) }

    // 발판 2 — 넓은 기본; 클립보드 건드림(예의 빚짐).
    if await pasteInsert(text, into: t) { return .inserted(.paste) }

    // 발판 3 — 키 입력 합성; 클립보드 부작용 없음, 느림.
    if await keyEventInsert(text, into: t) { return .inserted(.keyEvents) }

    // 발판 4 — 실패-불가 바닥: 복사 + 유저한테 알림.
    clipboard.copy(text)
    notify("삽입 못 함 — 텍스트 복사됨. Cmd+V 로 붙여넣어.")
    return .clipboardOnly
}

External links

Exercise

네 작업에서 어디서나 되는 단일 방법이 없는 연산을 골라(파일 타입 렌더링, 포맷 내보내기, 기기 연결). 가진 방법을 제일 깨끗-부터-넓음 순으로 정렬하고, 실패-불가 바닥을 정의해. 유저가 바닥에서 뭘 경험하고, 받아들일 만해?
Hint
좋은 바닥은 화려하진 않지만 안정적이고 솔직해 — 삽입엔 '클립보드에 복사됨, 수동 붙여넣기'. 테스트는 바닥이 여전히 유저가 최소 노력과 명확한 설명으로 목표를 달성할 수 있게 두는지야. 바닥이 '에러, 아무 일 안 벌어짐' 이면, 아직 사다리가 아냐; 가끔 실패하는 방법이야.

Progress

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

댓글 0

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

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