개발 블로그로 돌아가기 릴리스 노트 · iPhone·iPad

SharkTTY 1.6: 모든 디스플레이를 한눈에

· Safafish

SharkTTY 1.6은 6월 27일에 Mac용 SharkTTY Desk 0.6.0과 함께 나왔습니다. 원격 데스크톱이 더 이상 하나의 화면을 뜻하지 않게 된 릴리스입니다. 다만 작업의 대부분은 그 아래에 있습니다. 포기해야 할 곳에서 포기하고, 다시 시도해야 할 곳에서 다시 시도하며, 둘 중 어느 쪽이었는지 알려 주는 연결입니다.

화면 하나가 아니라, 전부

1.6 이전에는 모니터가 세 대인 Mac에 접속해도 그중 하나만 볼 수 있었습니다. 어느 것을 볼지 고를 수는 있었고, 이야기는 거기서 끝이었습니다. 그래서 여러 디스플레이를 쓰는 Mac이 휴대폰에서는 실제보다 작게 느껴졌고, 정작 필요한 부분은 어김없이 지금 보고 있지 않은 디스플레이에 있었습니다.

1.6은 전부를 보냅니다. 통합 보기가 디스플레이들을 나란히 배치하고, 그중 아무거나 탭하거나 끌면 그 화면의 제어권을 가져옵니다 — 포인터는 손가락이 닿는 곳으로, 그것이 어느 디스플레이든 따라갑니다. 각 디스플레이는 한꺼번에가 아니라 필요할 때 스트리밍되며, 모니터 세 대짜리 Mac을 휴대폰 회선으로 쓸 수 있는 이유는 오직 그것뿐입니다.

같은 릴리스에서 세션을 벗어나지 않고도 저장된 데스크톱을 편집하고 공유 링크를 가져올 수 있게 되었습니다. 두 번째 기기의 접근을 설정하려고 먼저 연결을 끊을 필요가 없어졌습니다.

실제로 다시 이어지는 재연결

엘리베이터에서 끊기는 원격 데스크톱은 원격 데스크톱이 아닙니다. 1.6의 연결 경로는 단순한 우선순위를 중심으로 다시 만들어졌습니다. 먼저 직접 P2P 경로를 시도합니다. 더 빠르고 제3자가 끼지 않기 때문입니다. 직접 경로가 열리지 않을 때만 중계로 넘어갑니다. P2P 우선은 선호 설정 스위치가 아니라 스케줄링입니다 — 앱이 경로들을 경주시키고 먼저 응답하는 쪽을 택합니다.

이런 일이 대개 어긋나는 지점은 재시도이고, 어긋나는 방향은 둘입니다. 전부 다시 시도하면 잘못된 자격 증명이 네트워크 문제처럼 보이는 무한 루프가 됩니다. 아무것도 다시 시도하지 않으면 2초짜리 셀룰러 끊김이 세션을 끝냅니다. 그래서 1.6은 경우를 나눕니다. 인증 거부는 대체 경로 탐색을 즉시 멈춥니다. 같은 잘못된 키로 다음 경로를 시도해 봐야 똑같이 실패하기 때문입니다. 반면 전송 실패는 지터를 섞어 물러났다가 계속 시도합니다. 지터는 말만 들었을 때보다 훨씬 중요합니다 — 지터가 없으면 같은 순간에 끊긴 모든 클라이언트가 같은 순간에 돌아옵니다.

여기에 더해, 이제 앱은 네트워크가 돌아온 것을 알아채고 남은 백오프를 기다리는 대신 바로 회복합니다. WebSocket 경로에는 킵얼라이브가 붙어 유휴 세션이 중간 장비에 잘려 나가지 않게 되었고, 수락 루프는 이전 연결을 처리하는 동안 도착한 연결을 더 이상 떨어뜨리지 않습니다.

짧은 링크, 그리고 아무것도 복사하지 않는 연결

페어링 문자열은 호스트와 포트, 인증서 지문, 토큰이 들어 있는 긴 한 줄입니다. 스캔하기에는 괜찮지만 남에게 보내기에는 고약합니다. 1.6은 독립형 중계와 관리형 중계 모두에 짧은 링크를 추가했습니다. 앱이 링크를 해석해 토큰을 돌려받고 그것으로 연결합니다 — 눈으로 대조할 지문도, 붙여 넣을 것도 없습니다.

관련된 작은 수정이 하나 있는데, 굳이 말할 필요가 없었어야 할 부류입니다. 이제 QR 스캐너는 desk 페어링 문자열이나 짧은 링크가 아닌 코드를 무시합니다. 누군가 포스터에 붙여 둔 Wi-Fi QR 코드로 연결을 시도하는 대신에 말입니다.

중계 경로의 암호화

1.6에서 WebSocket 중계 프레임은 암호화되고, 관리형 중계는 알맞은 방에 나타난 것을 그냥 받아들이는 대신 티켓을 발급합니다. 둘 다 같은 방향의 걸음입니다. 중계가 할 일은 이미 서로 합의한 양 끝 사이에서 바이트를 전달하는 것이고, 그 바이트로 할 수 있는 일이 적을수록 좋습니다. 누구의 중계도 신뢰하고 싶지 않다면, 독립형 중계는 오픈 소스이니 직접 운영하면 됩니다.

추측 대신 협상하는 버전

이제 앱과 Mac 에이전트는 다른 무엇을 하기 전에 프로토콜 버전과 기능 비트를 주고받습니다. 화려하지 않지만, 오래된 앱이 새 에이전트를 만나는 첫 순간에 값을 합니다. 절반만 되다가 엉뚱한 데서 실패하는 연결 대신, 앱은 상대편이 무엇을 할 수 있는지 정확히 알고, 너무 오래된 앱에는 업데이트하라는 분명한 안내가 뜹니다. 이후의 모든 것이 그 기능 비트에 기대고 있습니다 — 1.8의 오디오 코덱 협상도 같은 구조입니다.

연결 코드 인증도 여기서 들어왔습니다. Mac 쪽에 속도 제한과 허용 목록이 함께 붙어, 유출된 코드를 조용히 무차별 대입할 수 없습니다.

여섯 개 언어, 완성

이 릴리스에서 인터페이스는 지원하는 여섯 개 언어 대부분이 아니라 전부에서 번역을 마쳤습니다. 터미널 앱에는 짧은 문자열이 잔뜩 쌓이는데, 그중 마지막 20퍼센트는 무언가 잘못되기 전까지 아무도 보지 않는 것들입니다 — 그리고 바로 그때가 오류를 모국어로 읽는 일이 중요해지는 순간입니다.

그리고 작은 것들

  • 터미널 안전 영역 여백. 이제 글자가 둥근 모서리와 홈 인디케이터 아래로 파고들지 않습니다.
  • 호스트별 키보드 기억. 어떤 호스트에서 쓰던 키보드가 돌아왔을 때도 그대로 나옵니다.
  • 원격 데스크톱의 xHD 화질 상한. 대역폭이 넉넉하고 픽셀을 그대로 보고 싶을 때를 위한 것입니다.
  • SSH 포트를 스테퍼 대신 직접 입력합니다. 2222까지 눌러 올려 본 적 있는 사람이라면 반가울 변화입니다.

1.6의 모든 기능은 무료입니다. 앱 내 구입은 선택적인 후원뿐이고, 후원은 어떤 기능도 열어 주지 않습니다.

다른 언어로 읽기: English · 中文 · 日本語 · Español · Français · 한국어 · Українська

앱 자체에 대한 자세한 내용은 SharkTTY 가이드에서, 사용자용 짧은 업데이트 안내는 새로운 기능에서 확인할 수 있습니다. 가장 빠른 문의 방법은 피드백 보드입니다. 개발 블로그로 돌아가기.