Twitter Facebook Google+ Flickr Tumblr
Comments Closed

MacStories에 올라온 Alex Guyot의 “Automating iOS: A Comprehensive Guide to URL Schemes and Drafts Actions”라는 글이다. iOS를 정말 자세히 파고들다 보면 최종적으로 만나게 되는게 URL scheme과 x-callback-url이라는 것인데, 이에 대해 아주 자세하고 친절하게 쓰여진 가이드다. 너무 친절하고 길게 쓰여져서 번역하다가 관두고 싶었다. 조금 iOS를 쓴다고 하는 사람조차도 개발자가 아니고서는 URL scheme에 대해서 알지 못하는 경우가 많고, 들어봤다 하더라도 다른 사람이 만들어놓은걸 복사해서 쓰는 정도가 대부분이다. 이 가이드를 통해 URL scheme과 x-callback-url의 구조에 대해 이해하고 적재적소에 사용할 수 있게 되길 바란다. 가이드 자체는 Drafts를 기준으로 쓰여졌지만, 이걸 이해한다면 다른 앱에서도 똑같이 활용할 수도 있다.

번역에 있어서, Drafts라고 영문으로 표기된건 앱을 뜻하는 것이고, 한글로 드래프트라고 쓴 건 앱 내에서 새로 만든 텍스트를 뜻하는 것이다. 드래프트의 적절한 한글 번역이 생각나지 않아 그대로 썼다. 혼동하지 않길 바란다.


Feature Image

나는 2013년 초 Drafts의 URL action을 만들고 실행하는 법을 공부하기 시작했다. Federico Viticci가 하는 것 이상으로 iOS 앱들을 함께 연동시키는 시도를 하기로 결정했을 때였다. 나는 며칠간 열정적으로 URL scheme에 대한 정보를 검색했고, 어떻게 액션을 만들고, Drafts의 URL action 엔진을 이용해서 액션을 실행하는지 배웠다. 그리고 Federico가 했던 세 개의 앱보다 더 많은 수의 앱을 연결하는 최적의 방법을 이해하기 시작했다. 의기양양하게 앉아 내 아이패드가 자동으로 다섯개의 앱(Drafts, Dropbox, Due, Instapaper, Chrome)을 연동하는 액션 시퀀스를 실행하는걸 보면서도 내가 여기에 글을 쓰고, 내가 만든 액션에 대한 블로그를 시작하고, Drafts의 베타 테스팅을 하게 되는 기회를 가질거라곤 생각하지 않았다. 또한 전세계에 있는 비슷한 다른 사람들처럼 모든 종류의 흥미로운 것들을 연결할 수 있는 기회를 가질거라는 생각도 하지 못했다.

1년이 채 안됐지만, 그때부터 iOS 자동화(iOS automation)는 더 파워풀해지고 유명해졌다. 마치 거의 매주 x-callbakc-url을 지원하는 새로운 앱이 추가되는 느낌이다. 다른 앱들이 잘 경쟁하고는 있지만, Drafts는 아직까지 그 분야의 앱 중에서 가장 앞서나가고 있고, 지난 2월부터 더욱 파워풀한 워크플로우를 지원하는 새로운 기능들을 추가해오고 있다. 다른 앱들 중에는 Launch Center Pro와 Pythonista가 주목할만하며, 가장 최근의 도전자인 Editorial for iPadViticci 덕분에 또다른 각광을 받고 있다. 작년 연초부터 정말 많은 변화들이 있었지만, 한가지 중요한 부분은 놀랍게도 그렇지 않았다. iOS 자동화가 앞을 향해 나아가며 재미를 위한 관문이 되고 있는 반면, 앱 사이의 커뮤니케이션이 가능하도록 URL action을 만드는것을 배우는 방법은 거의 변하지 않았다. 많은 새로운 곳들의 소개 덕에 정보는 더 쉽게 접근할 수 있었지만, 여전히 흩어져있고, 정리되지 않았다. URL scheme에 대한 내용은 엄청나게 복잡한게 아니다. 하지만 개인이 올바른 소스를 찾아 공부하기 위해 몇시간씩 인터넷을 돌아다니다보면, 그 과정은 혼란스럽고, 지루하고, 필요한 것 이상으로 더 많은 시간을 소모하는 일이 되어버린다.

내가 처음 The Axx를 시작한 이래로 (그리고 원하는 사람이 사용할 수 있도록 내 액션을 올려두는 Action Page를 만든 이래로), 나는 반복적으로 이러한 액션들을 이해하고 만들 수 있도록 쉽고 빠르게 설명해주는 곳이 있냐는 질문을 받았다. 나는 이 질문에 좋은 대답을 해줄 수 없다는 것에 지쳐갔다. 결국 나는 그 대답을 위한 소스를 만드는데 최선을 다해보기로 결정했다. 이 글에선 아무것도 모르는 초심자들에게 필요한 정보들을 모아놓으려 했다. 스스로 Drafts와 URL action을 이용해 복잡한 워크플로우를 만들고 이해할 수 있는 지식을 가장 빠르고 쉬운 방법으로 얻을 수 있도록 말이다. 나는 여기서 Drafts에만 집중할 생각이지만, 이 가이드를 통해서 배우는 것들은 Launch Center ProEditorial 같은 다른 앱에서도 쉽게 적용할 수 있다. 중급자나 심지어 이미 액션을 만들어 쓰는 고급 사용자라 하더라도, 나는 이 글의 마지막 몇 섹션을 통해서 흥미로운 팁을 전해줄 수 있을거라고 생각한다.

시작하기 전에, “액션을 실행하기 위해 URL을 허용(Allow URLs to trigger actions)”(Drafts의 “URL Security” 아래의 설정 패널 하단에서 찾을 수 있다.)을 켜둬라. 이 설정은 디폴트가 꺼져 있는 상태다. 이 설정은 당신이 액션을 외부에서 URL을 통해 발동시킬 수 있도록 해줄 것이다. URL은 Drafts나, Launch Center Pro, 혹은 사파리의 북마크를 이용해 앱을 연동시켜주는데 가장 핵심적인 요소이다.

자 이제 시작한다. URL scheme과 Drafts Action들에 대한 종합적인 가이드이다.

목차

  • 기초
  • Drafts URL Scheme
  • Variable Tags
  • Drafts를 유용하게 만들기
  • 드롭박스 액션
  • 에버노트 액션
  • 이메일 액션
  • 메시지 액션
  • URL 액션: 모든것을 함께 묶어버리는 것
  • 기타 앱들의 URL Scheme과 그것들을 당신의 워크플로우에 추가하기
  • 자바스크립트를 이용해 액션을 실행하기
  • 팁과 주의사항
  • 전문적인 워크플로우를 만들기 위한 팁과 트릭
  • 하나의 시퀀스에서 3개 혹은 그 이상의 액션을 연동시키기
  • 드래프트를 쳐내기
  • 쓰레드로서 긴 액션 시퀀스에 대한 생각
  • “AllowEmpty” 매개변수 사용하기
  • 결론

기초

iOS에서 당신의 워크플로우를 개선하고 자동화시키는 방법은 Drafts를 나중에 어딘가로 보낼 텍스트 입력의 중심 허브로 사용하는 것이다. 당신의 트윗, App.net, 구글 플러스, 페이스북 포스트, 캘린더 이벤트, 블로그 포스트들 말이다 – 이 모든것을 Drafts에서 시작한다면, Drafts를 이용해 자동화 시킬 수가 있다.

Drafts에서는 모든 출력 데이터들이 Action List에서 시작된다. 액션 리스트는 앱의 우상단에 있는 공유 아이콘을 통해 접근할 수 있다. 아이콘을 탭하면, 당신이 설치해둔 모든 액션의 리스트들이 당신이 어떤 draft를 열든 그 위 화면에 표시된다.(당신이 Drafts에 저장한 개별 페이지는 “드래프트”로 언급된다. “노트”나 그와 비슷한 다른 용어와는 반대의 의미에서 말이다.) 액션을 탭하면 액션 리스트 바로 아래에 현재 어떤 드래프트가 열려있든 상관없이 즉각적으로 액션이 실행된다. 액션은 당신이 드래프트에 입력한 텍스트로 무엇이든 할 수 있는 능력을 가지고 있다. 소셜 네트워크에 텍스트를 포스팅 하는 것뿐만 아니라, 드롭박스에 업로드를 할 수도 있고, 에버노트에 보내거나, 작성한 텍스트로 이메일이나 메시지를 보낼 수도 있다. 또한 다른 앱으로 보내 그 텍스트를 이용해 다른 일을 하게 할 수도 있다. 일단 어떻게 커스텀 액션을 만드는지를 배우고 나면, Drafts에서 다른 곳으로 텍스트를 보내는 옵션은 기본적으로 제한이 없어진다.

Drafts for iOS

Drafts는 액션 리스트에 몇가지 미리 설치된 액션(Built-in action)을 갖고 있다. 일단 설정에서 Drafts를 트위터, 페이스북, App.net, 에버노트, 드롭박스 계정에 연결하면, 당신은 이러한 서비스들을 위한 빌트인 액션을 사용 할 수 있다. 이런 대부분의 기본 액션들은 이름 그 자체로 액션에 대한 설명을 한다: 그것들은 당신이 지금 열어놓은 드래프트에 있는 글 전부를 그대로 연동해둔 서비스로 보내버린다. 이런 것들과 같은 단순한 액션은 당신이 만들 더욱 복잡한 워크플로우를 만드는 재료가 된다. 모든 워크플로우는 단순한 액션들을 연결시킴으로서 만들어지기 때문이다.

여기 기초적인 예가 있다. 내가 만든 Cross Post 액션은 내가 쓴 텍스트를 트위터와 App.net에 자동으로 포스팅한다. 하지만 자동으로 한다는 말이 동시에 포스팅 한다는 얘긴 아니다. 여기에 중요한 차이점이 있다. 어떻게 복잡한 URL action을 만드는지 배우기 위해서는 반드시 이 차이점을 이해하고 있어야 한다. 나는 Drafts에게 동시에 트위터와 App.net에 포스팅을 하라고 명령할 수는 없다. 대신 현재 글을 트윗하고, 그 다음에 새로운 드래프트를 동일한 텍스트로 열고, App.net에 포스팅 하라고 명령할 수 있다. 이게 내가 만든 Cross Post 액션이 작동하는 방식이고, 모든 복잡한 액션들이 작동하는 방식이다. 당신은 오직 하나의 드래프트로 하나의 액션만을 실행할 수 있다. 하지만 한편으로 당신은 Drafts에서 제공하는 고급 툴들을 이용해 더 많은 일들을 할 수 있다.(x-callback-url이라는 것과 빌트인 되어 있는 variable tag로 가능하다.) (이전 드래프트에 있었던 텍스트가 보존된) 완전히 새로운 드래프트를 만들고 완전히 다른 액션을 이어서 실행하는 것이다. 이게 잘 이해가 안된다면, 날 탓해라. 곧 설명할 URL들을 이용해 좀 더 명확하게 설명할 것이다.

모든 Drafts의 액션은 앱의 “URL schemes”을 이용한 “URL actions”이라는 짧은 코드로 구성된다. 당신은 Drafts의 Settings > URL actions에서 플러스 버튼을 탭해서 새로운 URL action을 추가할 수 있다. 그리고 첫번재 박스에 액션의 이름을 타이핑하고, 두번째 박스에 URL을 입력하면 된다. “Tag Help” 버튼을 이용해서 액션에서 사용할 [variable tags] 리스트(곧 설명할 것이다)를 찾아볼 수도 있다. 액션을 추가하기 전에 그것들이 무엇을 하는지, 그리고 어떻게 만들어지는지를 이해해야 한다.

Drafts for iOS

iOS 앱들은 샌드박싱 되어있다. 이 얘기는 운영체제(그리고 몇가지 앱들)하고만 매우 제한적인 방법으로 상호 작용 할 수 있다는 얘기다. 이런 제한적인 방법들 중엔 URL action을 통해서 이루어지는 것이 있다. 어떤 앱에서 링크를 탭하면 자동으로 관련있는 웹페이지를 열기 위해 당신을 사파리로 이동시켜주는 방법이고, 주소를 탭했을 때 지도 앱에서 특정 위치에 핀을 꽂아주는 방법이 URL action이다. 사파리와 지도는 둘 다 이러한 종류의 커뮤니케이션을 지원해주는 URL scheme을 가지고 있다. 서드파티 개발자들은 그들의 앱에 강력한 URL Scheme을 할당해서 앱들이 서로 “커뮤니케이션” 하는 작은 구멍을 만든다. 그리고 이런 작은 구멍은 엄청난 것들을 가능하게 해줄 수 있다.

URL scheme은 당신이 이미 친숙한 웹사이트 URL과 비슷한 방식으로 만들어졌다. 모든 웹사이트들이 각자의 퍼스널 도메인 네임을 가지고 있듯이, 모든 iOS 앱도 당신의 자동화 워크플로우에서 사용될 수 있는 각자의 “도메인 네임”을 가지고 있다. 그리고 앱에 의해 지원되는 모든 액션은 똑같은 이름으로 시작한다. 이 앱의 “도메인 네임”은 모든 가능한 액션들과 조합되고, 앱의 URL scheme을 구성한다.

웹사이트의 도메인 네임은 항상 “http://yourwebsite.com”이나 이와 비슷하게 생겼다. 하지만 앱의 “도메인 네임”(URL scheme의 첫번째 레벨)은 항상 yourapp://으로 생겼다. 또한 웹사이트 URL의 끝에 “http://yourwebsite.com/about”의 식으로 다른 주소를 추가해서 사이트의 홈페이지보다 더 깊숙한 페이지로 가는것처럼, 앱 URL도 같은 방식으로 작동한다. yourapp:// 뒤에 다른 문구를 추가하는 것은 다른 페이지를 보여주는게 아니라 실제 액션을 실행한다는 차이가 있을 뿐이다. 만약 이 개념이 아직 어려운 사람은, Drafts URL scheme을 배우면 더 명확하게 알 수 있을 것이다.

The Drafts URL Scheme

당신이 빠르고 쉽게 액션을 만들어 연동시키기 전에, Drafts URL scheme의 계층구조를 이해할 필요가 있다.

Drafts의 “도메인 네임”은 조금 뻔하지만 drafts://이다. 만약 당신이 Drafts가 설치된 iOS 기기에서 이 글을 읽고 있다면, 사파리의 주소창에 “drafts://”라고 타이핑하고 엔터를 눌러봐라. (만약 당신이 구글 크롬이나 사파리가 아닌 다른 브라우저를 쓰고 있다면, URL을 따라가기 위해서 옴니바 아래에 뜨는 두번째 옵션을 눌러야 할 것이다. 그렇지 않으면 브라우저는 URL을 따라가는게 아니라 그 단어를 구글 검색해 버릴것이다.) 걱정하지 않아도 된다. 이 페이지에서 벗어나는 일은 없을 것이다. 대신 당신이 켜놓은 웹브라우저에서 벗어나 Drafts를 열고 당신이 설정해둔 Drafts의 첫페이지를 띄워줄 것이다. (만약 당신이 앱 시작시에 새로운 드래프트를 만들도록 설정해뒀다면, 새 드래프트가 뜰 것이다.) 여기까지 성공했다면, 다시 돌아와서 이 글을 계속 읽어라.

Drafts for iOS

축하한다: 만약 이걸 처음으로 해봤다면, 당신은 처음으로 URL action을 이용해 앱을 켠 것이다. 하지만 이건 실제로 아무것도 하지 않는다. 고로 이게 액션에 대한 많은 얘기를 한다고 하기는 힘들다. 그래서 Drafts URL scheme의 나머지 부분들이 따라오는 것이다. drafts://는 오직 scheme의 기본 레벨(top level)일뿐이다. 그 다음 레벨에 들어섰을때, 우리는 두가지 옵션을 갖게 된다 – 두가지 루트를 선택할 수 있다. Drafts는 drafts://create?drafts://import_action?이라는 세컨드 레벨을 지원한다. 여기에 대해 알아보기 전에 짚고 넘어가야 할게 하나 더 있다: x-callback-url이라는 것이다.

x-callback-url은 Greg Pierce가 만든 약속(specification)이다. Pierce는 Drafts의 개발자이기도 하다. x-callback-url은 개발자가 자유롭게 빌트인 URL scheme에 넣을 수 있는 것으로, 앱이 특정 액션을 완료한 후 “성공” 했다는 매개변수를 보낼 수 있게 해주는 기능을 한다. 이건 마치 “만약 ㅇㅇ 한다면, ㅁㅁ 해라 (if, then)”라는 다른 프로그래밍 언어의 표현방법과 비슷하다. 당신이 x-callback-url을 지원하는 앱의 액션을 실행시킬 때, 당신은 앱에게 일단 첫번째 액션이 완료되면 두번째 액션을 실행하라고 말할 수 있게 된다. 이건 iOS 자동화에서 가장 중요한 부분이다. x-callback-url이 없다면, 향상된 iOS 자동화는 불가능하다.

다시 Drafts URL scheme으로 돌아가자. ’x-callback-url’을 Drafts URL의 탑 레벨 끝에 추가하는것을 잊지말아야 한다. 어떤 Drafts 액션에서든 시작은 꼭 drafts://x-callback-url/이 되어야 한다. x-callback-url을 추가해야 나중에 당신의 액션들을 연동시켜주는데 필수적인 다른 x-callback 매개변수들을 추가할 수 있다. 당신이 연동이 필요없는 단순한 액션을 만든다고 할지라도, 그냥 모든 액션에 “x-callback-url”을 포함시키는게 좋다. 나중에 필요할 때 잊어먹는 불상사를 방지하고, 그게 일반적으로 좋은 형태라고 생각되기 때문이다.

이제 다시 Drafts URL scheme의 두번째 레벨로 돌아가 보자. (기술적으로는 “x-callback-url/” 다음이니 세번째 레벨이 맞지만, “x-callback-url/”이 모든 Drafts 액션에 포함되기 때문에 그냥 탑 레벨로 간주하기로 한다.) 우리는 “import_action?”을 무시할 수 있다. 이 명령의 유일한 기능이 새로운 Drafts 액션을 임포팅 하는것뿐이기 때문이다. 이 명령은 링크를 통해 자동으로 새로운 액션을 설치할 때 사용하는 것이다. 이는 액션을 공유할 때는 중요할 수 있지만, 액션을 만들 때는 그다지 유용하지 않다. 그래서 우리는 drafts://x-callback-url/create?라는 URL을 선택할 것이다. 만약 당신이 아까 “drafts://”를 주소창에 입력했던 것처럼 지금 바로 웹브라우저에서 이 액션을 실행한다면, 당신이 Drafts가 실행될때 어떤 화면을 처음에 띄워줄지 설정해둔것과는 상관없이 iOS는 브라우저에서 Drafts로 넘어가 새로운 빈 드래프트를 자동으로 띄워줄 것이다. 원한다면 한번 해봐라. 그리고 다시 이 글로 돌아와라.

아직까지 우리는 Drafts URL scheme의 두번째 레벨을 살펴보고 있다. 그리고 “create?” 루트의 좀 더 다재다능한 면을 살펴보도록 하겠다. 이 루트를 계속해서 쫓다보면 Drafts는 현재 여기서 오직 한가지 명령만을 지원하고 있다. “text=”를 URL에 추가하는 것이다. drafts://x-callback-url/create?text=의 형태가 된다. “text=” 다음에는 우리가 새로운 draft에 띄우고 싶은 어떤 단어든 올 수 있다. 성가신 부분은 뒤따라오는 텍스트가 액션에서 하드코딩 되어야 한다는 것이다. 다시 말하면 퍼센트-인코딩(percent-encoded) 되어야 한다는 뜻이다. 쉬운 예를 하나 들어보면, 새로운 draft가 단순히 “Hello Word”라고 쓰여지도록 만든다고 해보자. “Hello World”를 퍼센트-인코딩 하면 스페이스를 “%20”으로 바꿔줘야 한다. 우리가 만든 URL action에 추가한다면, drafts://x-callback-url/create?text=Hello%20World가 될 것이다. 웹 브라우저에서 이 액션을 실행하면 이제 새로운 드래프트에 이미 작성해둔 “Hello World”라는 텍스트가 뜨는걸 볼 수 있을 것이다.

Drafts for iOS

이 URL에 무슨 일이 있었는지 다시 한번 살펴보자. iOS가 URL action을 작성된 순서대로 인식하기 때문에 우리가 만든 액션은 현재 형태에서 이미 4가지 작업을 하고 있다:

  • drafts://는 Drafts 앱을 열라고 iOS에게 말한다.
  • x-callback-url/은 Drafts가 x-callback 매개변수들을 사용할 수 있게 해준다. (이건 조금 있다 살펴볼 것이다.)
  • create?는 Drafts에게 새로운 드래프트를 만들라고 명령한다.
  • text=Hello%20World는 Drafts에게 새로운 드래프트에 “Hello World”를 입력하라고 명령한다.

자, 이제 우리는 Drafts에서 Hello World라고 쓰여진 새로운 드래프트를 띄우게 됐다. 이제 이 텍스트를 이용해 트윗을 해보자. 이미 Drafts에 우리가 쓴 드래프트를 트윗할 수 있는 액션이 있기에 이를 이용해 액션 리스트를 열고 트윗 버튼을 누르면 된다. 하지만 iOS 자동화는 이런 과정들을 건너뛰는 방법에 대한 얘기고, 우리는 단지 첫번째 과정을 건너 뛴 상태까지만 왔을뿐이다. 액션 리스트를 열고 트윗 액션을 찾아서 그걸 누르는 대신에, 우리는 우리가 만든 URL에 몇가지 단어를 더 추가해서 Drafts에게 우리가 만든 드래프트에서 자동으로 트윗 액션을 실행하도록 해보자. 그렇게 하기 위해선 Drafts URL scehem의 다음 레벨에 이 명령어를 추가해야 한다: “&action=” 말이다. 이미 눈치챈 사람도 있겠지만, 등호 표시 다음에는 우리가 실행하고자 하는 액션의 이름이 따라와야 한다. 우리의 예시에서는 “Hello World”를 트윗하려 하니까, 액션은 “Tweet: username”이 되어야 한다. 이 지점이 액션이 우리에게 완전히 다르게 다가오는 순간이다.

Drafts에서 각각의 트윗 액션은 “Tweet: username”의 포맷으로 되어 있다. “username”에는 당신이 트윗을 올리고자 하는 트위터 계정 이름이 들어간다. 이건 당신이 만든 액션을 공유할때 늘 염두에 둬야 하는 부분이다. 만약 당신이 다른 액션을 호출한다면, 다른 사람의 액션 리스트에도 당신의 액션 리스트에 있는 것과 같은 제목을 가진 액션이 있어야 한다는것을 생각해둬야 한다. 그렇지 않으면 당신의 액션은 아무것도 하지 않을 것이다. 내 경우엔 “Tweet: the_axx”라고 쓰게 된다. 다시 한번 말하지만, 우리는 꼭 퍼센트-인코딩 된것을 사용해야 한다. 이번엔 우리의 액션 제목에서 그렇게 해야 한다. 콜론을 퍼센트-인코딩 하면 “%3A”가 되고, 스페이스는 여전히 “%20”이 된다. 결국 우리의 최종 결과물은 drafts://x-callback-url/create?text=Hello%20World&action=Tweet%3A%20the_axx가 된다. 물론 당신의 경우엔 “the_axx”가 당신의 트위터 아이디가 될 것이다.

이제 우리의 액션이 진정한 액션이 됐다. 매우 단순한 액션이지만, 액션은 액션이다. 사실 우리가 방금 만든 액션은 정확하게 “Hello World”라는 텍스트가 있는 드래프트에서 기본으로 들어있는 트윗 액션을 실행했을때 발생하는 이벤트를 다시 만든 것 뿐이다. 이건 내가 초반에 언급했던 기초적인 도구가 되는 액션을 만든 것이다. 우리는 이러한 액션을 다른 것들과 조합해서 “Hello World”라는 트윗을 한 후, 똑같은 텍스트를 가진 새로운 드래프트에서 다른 액션을 실행하도록 할 수 있다. 우리가 해야 할 일은 액션들을 함께 연동시키는것뿐이다.

내가 앞서 얘기했다시피, 우리는 동시에 두가지 액션을 실행시킬 수 없다. 혹은 여러개의 액션을 하나의 드래프트에서 실행할 수도 없다. 우리는 일단 하나를 실행하고, 첫번째 액션이 끝나면, 그 다음에 x-callback 매개변수를 이용해 Drafts에게 똑같은 텍스트를 가진 새로운 드래프트를 만들고, 그 다음 액션을 실행하라고 명령할 수 있을 뿐이다. x-callback 매개변수에는 모두 4가지가 있다: x-source, x-success, x-error, x-cancel가 있다. 여기서 내가 다룰 것은 x-success와 약간의 x-cancel이다. 다른 두가지는 x-callback-url 웹사이트에서 살펴볼 수 있다.

Drafts URL action에 x-success 매개변수를 추가하는 것은 Drafts에게 첫번째 액션이 성공하면 다음 액션을 실행하라는 명령을 내리는 것과 같다. 다시 말해, 일단 첫번째 액션이 완료되면, 다음 액션이 실행된다는 뜻이다. 이건 첫번째 액션이 성공하는 것을 전제하기 때문에, 만약 첫번째 액션이 실패하면 두번째 액션은 실행되지 않는다는 사실을 기억해야 한다. 이게 URL action의 각 부분을 여러번 테스트하고 살펴보는 것이 중요한 이유다. 당신의 두번째 액션이 완벽하게 타이핑 되었다고 하더라도, 만약 첫번째 액션에 한글자의 에러라도 있다면 전체 URL 액션은 실패하게 된다. 두번째 액션은 실행될 기회조차 얻지 못하기 때문이다.

다시 우리의 URL action으로 돌아가보자. 우리는 이제 Drafts URL scheme의 다음 부분인 “&x-success=”를 추가해야 한다. 두번째 액션을 연동시키기 위해서 말이다. 그럼 URL은 이렇게 된다: drafts://x-callback-url/create?text=Hello%20World&action=Tweet%3A%20the_axx&x-success=. 우리의 액션은 이제 6가지 일을 한다.

  • drafts://는 Drafts 앱을 열라고 iOS에게 말한다.
  • x-callback-url/은 Drafts가 x-callback 매개변수들을 사용할 수 있게 해준다. (이건 조금 있다 살펴볼 것이다.)
  • create?는 Drafts에게 새로운 드래프트를 만들라고 명령한다.
  • text=Hello%20World는 Drafts에게 새로운 드래프트에 “Hello World”를 입력하라고 명령한다.
  • &action=Tweet%3A%20the_axx는 기본으로 설치된 “Tweet: the_axx”라는 액션을 실행하고 “Hello World”라는 텍스트를 내 트위터 계정에 포스팅 해준다.
  • &x-success=는 Drafts에게 “Hello World”라는 텍스트가 성공적으로 트윗되면 다른 액션을 실행하라고 명령한다.

이제 두번째 액션을 만들어야 한다. 마지막에 다음 액션을 지정하는 것만 제외하면, 첫번째 액션을 만드는것과 정확하게 같기 때문에 어렵지 않을 것이다. 앞서 배운 Drafts URL action의 모든 부분을 사용해서 만든 두번째 액션은 다음과 같다: drafts://x-callback-url/create?text=Hello%20World&action=Post%20to%20App.net 이 액션을 분해해 보면 꽤 익숙한게 보일 것이다:

  • drafts://는 Drafts 앱을 열라고 iOS에게 말한다.
  • x-callback-url/은 Drafts가 x-callback 매개변수들을 사용할 수 있게 해준다. (이건 조금 있다 살펴볼 것이다.)
  • create?는 Drafts에게 새로운 드래프트를 만들라고 명령한다.
  • text=Hello%20World는 Drafts에게 새로운 드래프트에 “Hello World”를 입력하라고 명령한다.
  • &action=Post%20to%20App.net은 기본 설치되어 있는 “Post to App.net”이라는 액션을 실행하고, 당신의 App.net 계정으로 “Hello World”라는 텍스트를 포스팅 해줄 것이다.

이제 거의 끝났다. 마지막 한 단계만 남았다: 당신의 액션에서 “&x-success=” 뒤에 타이핑 할 두번째 액션은 반드시 퍼센트-인코딩 되어야 한다. 전체 스트링을 직접 손으로 퍼센트-인코딩 하는것은 엄청나게 짜증나고 어려운 과정이다. 운좋게도 Drafts는 우리를 이와 같은 짜증으로부터 구해줬다. Drafts는 당신의 액션에서 일정 부분을 퍼센트-인코딩 하고자 할 때 그걸 가능하게 해주는 환상적인 기능을 갖고 있다. 퍼센트-인코딩 하고자 하는 부분을 {{두개의 물결모양 괄호}}로 둘러싸주면 된다. 그래서 두번째 액션 전체를 인코딩 하는 대신에, 두개의 물결모양 괄호로 둘러싸주면 된다. 그래서 {{drafts://x-callback-url/create?text=Hello%20World&action=Post%20to%20App.net}}를 x-success 매개변수 끝에 추가해주면 된다. 사실 앞선 설명한 액션에서도 똑같은 방법을 쓸 수 있다. “Hello%20World” 대신에, “{{Hello World}}”라고 쓸 수 있고, “Tweet%3A%20the_axx” 대신에 “{{Tweet: the_axx}}”라고 타이핑 할 수 있다.

하지만, 당신의 두번째 액션을 인코딩 하는것과 관련해서 알아둬야 할 한가지 중요한 점이 있다. 당신이 실행할 두번째 액션에 있는 텍스트와 당신이 실행되라고 지정해둔 액션은 두번 인코딩 되어야 한다. 당신의 두번째 액션이 첫번째 액션의 위치에서 실행될 때 어떻게 쓰여져야 할지를 생각해본다면 쉽게 이해할 수 있을 것이다: 첫번째 액션에서 텍스트와 실행하려는 액션은 이미 인코딩이 된 것이다. 그래서 이미 인코딩 되어 있는 부분이 이젠 한번 더 인코딩 된다. 이건 다소 혼란스러운 부분일 수 있다. 하지만 물결모양 괄호로 둘러싸면 알아서 두번 인코딩을 해주기 때문에 손으로는 한번만 인코딩을 하면 된다 (당신의 액션을 자동으로 인코딩 하는 방법은 매우 다양하다. 그건 이 글의 뒷부분에서 언급할 것이다). 손으로 한번 인코딩 하고, 물결모양 괄호를 이용해 두번째 인코딩은 자동으로 하면 된다 (물결모양 괄호를 중복해서 사용 – 물결모양 괄호 안에 다시 한번 물결모양 괄호를 넣는것 – 하는 것은 작동하지 않는다. 내가 직접 해봤다.)

이제 됐다. 여기 “Hello World”를 트윗해주고, 그 다음에 App.net에도 포스팅 해주는 우리의 첫 Drafts URL action이 만들어졌다.

drafts://x-callback-url/create?text={{Hello World}}&action={{Tweet: the_axx}}&x-success={{drafts://x-callback-url/create?text=Hello%20World&action=Post%20to%20App.net}}

다시 한번 축하한다. 당신은 이제 그 어떤 복잡한 Drafts URL action도 만들 수 있는 지식을 갖게 됐다. 모든 복잡한 Drafts URL action은 같은 포맷으로 만들어지기 때문이다: [First Action]&x-success={{[Second Action]}} 식으로 말이다. 이제 당신은 Drafts URL scheme의 계층 구조를 이해했기 때문에, 어떤 액션을 함께 연동시킬지는 당신의 마음대로다. 심지어는 두가지 액션 이상을 함께 연동시키는것도 가능하다. 같은 방식으로 몇가지 추가적인 트릭을 이용해서 말이다. 이 부분은 나중에 살펴볼 것이다. 그전에 일단은 이 튜토리얼에서 초보자 딱지를 떼기 위해 한가지 더 살펴봐야 할 부분이 있다: variable tag가 그것이다.

Variable Tags

지난 섹션에서는 어떻게 Drafts URL scheme을 기본적인 Drafts action으로 만들고, 이런 액션들 중 두가지를 연동해서 복잡한 액션을 만들어 활용할 수 있는지 배웠다. 하지만 한가지 매우 짜증나는 일이 남는다: 당신은 액션을 실행하기 위해서 액션 내에 포함된 텍스트를 하드-코딩 해야 한다. 이 제한은 당신이 액션의 코드를 바꾸지 않는 이상, 당신이 만든 어떤 액션이든 똑같은 단어에서만 작동하게 만든다. 만약 이게 액션으로 할 수 있는 전부라면, 기본적으로 쓸모가 없다고 봐도 될 것이다. 운 좋게도, Drafts는 우리를 다시 한번 여기서 구해준다. Drafts는 여러가지 용도로 쓸 수 있는 [variable tags]를 지원한다. 이 태그들은 [이중 각괄호]로 묶이고, URL action 내에 위치할 수 있다. 당신이 어떤 글을 쓰고 있던 글의 다양한 위치에서 텍스트를 뽑아낼 수 있게 해준다. 더 좋은건 당신이 아무것도 하지 않더라도, 이 텍스트들이 자동으로 퍼센트-인코딩 된다는 것이다. 여기 가장 자주 사용할법한 주요 태그들을 나열한다:

  • [[draft]]는 당신이 액션을 실행할 때, 드래프트에 있는 전체 텍스트들을 대체한다.
  • [[title]]은 당신이 액션을 실행할 때, 드래프트의 첫번째 줄에 있는 텍스트를 대체한다.
  • [[body]]는 당신이 액션을 실행할 때, 첫번째 줄을 제외한 나머지 텍스트들을 대체한다.
  • [[clipboard]]는 당신이 액션을 실행할 때, 실행되는 시점에서 iOS 시스템 클립보드에 있는 컨텐츠들을 대체한다.
  • [[line|n]]은 당신이 액션을 실행할 때, 전체 텍스트에서 지정된 특정 줄에 있는 컨텐츠를 대체한다. 어떤 줄에 있는 텍스트를 선택할지는 “n” 태그에 숫자를 넣으면 된다.
  • [[line|n..]]은 당신이 액션을 실행할 때, 당신이 지정한 “n”위에 있는 텍스트를 제외한 컨텐츠를 대체한다. 이건 당신이 몇번째 줄에서 시작할지 선택할 수 있다는것만 제외하면, [[body]] 태그와도 매우 비슷하다. (예를 들어 [[line|4..]]는 4번째 줄 이후에 있는 모든 텍스트로 대체될 것이다. 4번째 줄까지 포함해서 말이다.)
  • [[line|..n]]은 당신이 액션을 실행할 때, 텍스트의 첫번째 줄부터 n번째 줄까지에 있는 컨텐츠를 대체한다. “n”은 숫자로 바꾸면 된다. (고로 [[line|..4]]는 첫 4줄만 대체할 것이다.)
  • [[line|a..b]]는 당신이 액션을 실행할 때, “a”와 “b”번째 줄 사이의 범위 내에 있는 컨텐츠를 대체한다. “a”와 “b”는 서로 다른 숫자로 바꾸면 된다. (고로 [[line|2..4]]는 2,3,4번째 줄 텍스트로 대체될 것이다.
  • [[Selection]]은 당신이 액션을 실행할 때, 현재 드래프트를 편집하면서 마지막으로 선택한 텍스트를 대체한다. 만약 아무것도 선택한게 없으면 자동으로 전체 텍스트로 대체된다.

태그에는 현재 날짜나 시간을 넣을 수 있는 것들도 있다. 그 외에도 몇가지 다른 태그들이 있지만, 여기서는 언급하지 않겠다. 모든 사용가능한 태그들은 Drafts의 커스텀 액션 만들기 페이지에 있는 “Tag Help” 섹션에서 찾아볼 수 있다.

위에 리스트된 태그들은 Drafts에서 복잡한 워크플로우를 만드는데 엄청나게 중요하다. 우리가 앞서 예시로 만든 액션에서 첫번째와 두번째 액션에 모두 있는 Hello%20World[[draft]]로 바꿀 수 있다. 그럼 우리는 140자나 그보다 적은 텍스트를 가지고 Cross Post 액션을 실행할 수 있다. 우리가 타이핑한 어떤 것이든 트위터에 올라가고, App.net에 포스팅 되는 결과를 볼 수 있을 것이다. 우리가 액션에 들어가는 텍스트를 하드코딩하지 않았기 때문에, 우리는 액션을 우리가 크로스 포스팅 하길 원하는 어떤 드래프트에서라도 반복적으로 사용할 수 있을 것이다. 사실 이게 실제로 내가 Cross Post 액션을 디자인하고 몇달간 내 사이트에 올려둔 것과 같은 것이다. 그 액션의 코드는 [[draft]] 태그를 사용했다는 것만 제외하면 정확하게 우리가 써내려간것과 동일하다. 여기 완성된 코드가 있다. (Post to App.net과 Tweet:the_axx의 순서가 바뀐건 별로 중요하지 않다.)

drafts://x-callback-url/create?text=[[draft]]&action={{Post to App.net}}&x-success={{drafts://x-callback-url/create?text=[[draft]]&action=Tweet%3A%20the_axx}}

우리는 이 액션들에 포함된 [[draft]][[title]]로 바꾸고 우리가 쓴 텍스트의 첫번째 줄만 포스팅 할 수도 있다. 또는 [[body]]로 바꿔서 첫번째 줄을 제외한 나머지 부분을 포스팅 할 수도 있다. 나는 트윗을 하고 App.net에 포스팅을 하는게 직관적인 액션이라고 생각했고, 보통 트윗을 할 때 다른 텍스트를 별도로 쓰는 경우는 없었기에 그대로 [[draft]]라고 두었다.

만약 당신이 좀 더 흥미로운 것을 만들고 싶다면, Post to App.net 액션에 포함된 텍스트를 [[body]]로 바꾸고 트윗 액션에 있는걸 [[title]]로 바꿀 수도 있다. 그리고 당신은 140자를 첫번째 줄에 쓰고, 256자의 긴 버전을 두번째 줄에 쓰면 된다. 액션을 실행하면 먼저 첫줄의 140자를 트위터로 보내고, 다시 돌아와서 256자의 긴 버전을 트위터보다 다소 덜 제한적인 App.net으로 포스팅 할 것이다. 이게 각기 다른 [[variable tag]]를 조합해서 복잡한 과정을 단순화 시키는 똑똑한 방법의 쉬운 예 중 하나다.

Drafts for iOS

이제 당신은 기본적인 Drafts action URL을 작성하는 방법을 배웠고, x-success 매개변수를 이용해 두번째 액션을 연동하는 방법도 배웠다. 또한 당신이 작성한 텍스트에서 어떤 부분이 액션에서 사용될지를 적당한 variable tag를 선택할 수도 있게 됐다. 이제 다음 단계로 넘어갈 준비가 된 것이다.

Drafts를 유용하게 만들기

일단 당신이 Drafts 액션 만들기를 마스터하게 되고 두가지 액션을 함께 연동시킬수 있게 된다면, 다음 단계는 개인적으로 Drafts를 유용하게 할 수 있는 최고의 방법을 찾아내는 것이다. 이를 위해 당신의 작업흐름을 살펴볼 필요가 있다. 작업 흐름은 iOS 기기에서 텍스트를 포함하고 있고, 한단계 이상을 요구하는 것이라면 어떤 것이든 될 수 있다. 당신이 자주 반복적으로 하는 단조로운 여분의 과정을 없애버릴 방법을 찾고 있다면, Drafts로 최적화 시킬 수 있는 방법도 찾을 수 있을 것이다.

우리의 예시 액션으로 계속해보자면, 내 경우 Cross Post 액션은 내가 자주 하는 단순한 작업흐름을 최적화 해줬다: 트위터와 App.net에 둘다 포스팅 하는 일 말이다. 이전엔 Tweetbot을 찾아서 열고, 앱이 다 열리길 기다린 후에, 작성 버튼을 누르고, 트윗을 타이핑하고, 타이핑한 텍스트를 선택하고 복사한 후에 트윗을 포스팅 했다. 그리고 Tweetbot을 떠나서 Felix를 찾아서 열고, 역시나 다시 한번 앱이 다 열리길 기다린 후에 작성 버튼을 누르고 텍스트를 붙여넣어서 포스팅을 했다. 무엇보다도 이 과정은 성가시고 쓸데없이 시간이 많이 소비되는 일이었다. Cross Post 액션을 만든 후에 나는 이 작업흐름을 다음과 같이 줄였다: Drafts를 열고(난 Drafts를 내 독에 올려둬서 어디 있는지 페이지를 넘겨가며 찾지 않아도 되게 했다.), 내 트윗/포스트를 타이핑 한 후에, 액션 리스트를 열고 Cross Post를 누른다. 포스트를 작성하는 시간을 제외하면 이 모든 과정이 5초면 된다. 이건 내가 매일 사용하는 작업흐름이고 심지어는 하루에도 몇번씩이나 사용한다.[1]

하지만 Drafts가 정말 빛나는 부분은 작업흐름을 단순화시키기 위해서 빌트인 되어 있는 다른 종류의 커스텀 액션을 사용할 때이다. Drafts는 다섯 가지 종류의 액션을 지원한다: 드롭박스 액션, 에버노트 액션, 이메일 액션, 메시지 액션, 그리고 URL 액션이다. 우리는 이미 URL 액션에 대해서 언급을 했지만, 나머지 4가지 액션들도 매우 유용하다. 특히 URL 액션과 조합되어서 사용될 때 말이다.

드롭박스 액션

만약 당신이 텍스트 파일을 드롭박스에 업로드 한다면 Drafts는 iOS에서 이 과정을 개선시켜 줄 수 있는 환상적인 템플릿 시스템을 가지고 있다. 각각의 커스텀 액션에서 당신은 파일을 저장하는 경로, 파일명(타임스탬프를 쓸 수도 있고, 텍스트의 첫줄, 혹은 당신이 미리 선택해둔 파일 이름을 쓸 수도 있다.)을 지정해줄 수 있고, 새로운 파일을 만들지 아니면 기존에 존재하는 파일에 병합할 것인지 선택할 수도 있다. 템플릿은 앞서 언급한 variable tags를 모두 사용할 수 있다. 뿐만 아니라 당신이 하드코딩한 텍스트로 업로드 하는 각각의 파일 포맷을 원하는대로 지정할 수도 있다. 파일명 섹션은 variable tags를 이용할 수 있기에 더욱 복잡한 이름을 쓸 수도 있다. 작성한 텍스트의 첫번째 줄과 날짜나 시간 스탬프를 조합하는 식으로 말이다.

일단 드롭박스 액션을 만들면, 당신은 당신이 만든 템플릿에 적합한 형식으로 텍스트를 작성하고 액션을 실행해서 텍스트를 당신이 원하는대로 정확한 위치에 업로드 할 수 있다. 이러한 액션은 당신이 원하는대로 무제한적으로 만들어낼 수가 있다.

에버노트 액션

에버노트 액션은 드롭박스 액션과 매우 비슷한 방식으로 작동한다. 당신은 에버노트 노트의 제목을 지정할 수 있고, 어떤 노트북으로 들어갈지를 정하고, 태그를 추가하고, 새로운 노트를 만들지 기존의 노트에 병합을 할지도 정할 수 있다. 노트의 템플릿을 정하고, 심지어는 노트를 마크다운 HTML로 보낼지 말지도 결정할 수 있다.[2]

드롭박스 액션과 같이, 일단 에버노트 액션을 당신이 원하는 방식으로 만들어놓으면, 형식에 맞게 작성된 텍스트에서 액션을 실행하는 것만으로도 자동으로 노트가 만들어지고 에버노트로 보내진다. 템플릿과 제목 필드에 [variable tags]를 사용할 수 있고, 무제한적인 에버노트 액션을 만들수도 있다.

이메일 액션

커스텀 이메일 액션의 경우 이메일에서 To, CC, BCC, 제목, 본문 영역을 지정할 수 있다. 여느때와 같이 [variable tags]를 이용할 수 있고, 당신이 원하는대로 이메일 액션을 만들 수 있다. 에버노트 액션과 똑같이 이메일을 마크다운 포맷으로 보낼 수도 있다.

일단 액션을 만들고, 적합한 포맷의 텍스트에서 실행하면 그게 다다. 물론 액션의 개수에는 제한이 없다.

메시지 액션

메시지 액션은 좀 더 단순하다. 당신은 메시지 수신자와 템플릿을 지정할 수 있고, [variable tags]를 사용해서, 원하는 사람에게 원하는 형식으로 메시지를 보낼 수 있다.

액션을 만든 후에는 적합한 형식의 텍스트에서 실행해 지정된 수신자에게 보낼 수 있다. 원하는만큼 액션을 만들 수 있다. 개인적으로는 이게 엄청나게 유용한 부분을 찾지 못했지만 말이다. 나는 Launch Center Pro의 단축키를 이용해 친구에게 메시지를 보내는 것을 좀 더 선호한다.

URL 액션: 모든것을 함께 묶어버리는 것

Drafts에 있는 모든 종류의 커스텀 액션들은 x-callback-url을 지원한다. 이 얘기는 모든 액션들이 당신이 원하는대로 연동 될 수 있다는 뜻이다. 일단 당신이 기본적인 Drafts URL scheme을 알고 있다면 워크플로우를 자동화시키는 것은 쉬운 일이다. 우리가 Cross Post에서 사용한 액션에서 {{Post to App.net}}tweet%3A%20the_axx를 다른 커스텀 액션의 제목으로 바꾸고 둘을 연동하기만 하면 된다.[3]

당신은 템플릿 액션 타입을 우리가 얘기했던 오리지널 액션들과 조합할 수도 있다. 당신은 당신이 트윗을 하거나 App.net에 포스팅 한 모든 것들의 리스트를 에버노트나 드롭박스에 보관하고 싶을 수도 있다. 그러면 일단 트위터나 App.net에 포스팅을 하고 그 다음에 드롭박스 파일이나 에버노트 노트에 병합하도록 하면 된다. 이건 파일을 병합 템플릿으로 만들고, 트윗 혹은 App.net에 포스팅하는 액션을 연동시키는것만큼이나 쉽다. 보다시피, Drafts URL action의 기본적인 레이아웃을 한번 이해하기만 하면, 액션 리스트에서 두가지 액션을 연동시키는것은 아주 단순하다.

Drafts를 사용하기 시작하는것은 다소 긴 과정일 수 있다. 일단 내가 위에 언급한 모든것들을 배우고, iOS 작업 흐름에서 텍스트가 필요한 것들을 하나하나 확인해본 후에, 어떤 것을 자동화 시킬 수 있을지 보고, 자동화시키기 위해서 필요한 액션을 만든다. 이 모든 과정들이 다소 시간이 걸리긴 하지만, 난 최종 결과물이 매우 달콤하다고 알려주고 싶다.

기타 앱들의 URL Scheme과 그것들을 당신의 워크플로우에 추가하기

당신의 워크플로우에는 Drafts가 기본으로 지원하지 않는 앱들이 있을 수도 있다. 이러한 앱들에서는 자동화가 불가능하다. 하지만 점차적으로 x-callback-url을 지원하는 앱들은 증가하고 있다.[4]

x-callback-url을 지원하는 각각의 앱들은 Drafts의 그것과는 구분되는 URL scheme을 가지고 있다. 하지만 당신이 일단 Drafts URL scheme을 이해하고 있는 한, 당신의 워크플로우에 필요한 다른 앱들의 URL scheme도 이해할 수 있을 것이다. 지원하는 앱들의 대부분은 똑같은 시작 포맷을 갖는다: yourapp://x-callback-url/ 말이다. 하지만 그 다음엔 Drafts와는 다른 명령어로 갈라질 수 있다. x-callback-url을 지원하는 앱이라면, 당신은 앱 URL scheme에 대한 정보를 위에 있는 링크(역자주: x-callback-url.com)를 통해 찾아보면 된다.

당신의 Drafts 워크플로우에 서드파티 앱을 추가할 때는, 액션이 drafts://로 시작하지 않는다. 당신은 그 앱이 가진 URL scheme에 적절한 URL을 사용해서 커스텀 URL 액션을 추가해야 한다. 예를 들어, 유명한 캘린더 앱인 Fantastical의 경우, 일정 입력에 x-callback-url을 지원한다. 당신은 당신의 Drafts 액션 리스트에 현재 텍스트를 Fantastical로 보내는 액션을 만들수 있다. Fantastical에서 텍스트를 분석해서 일정으로 추가할 수 있도록 말이다. 액션을 실행하면 Drafts에서 Fantastical로 앱이 전환되면서 자동으로 당신의 텍스트를 분석할 것이다. 그리고 x-success 매개변수를 설정해서 일정이 만들어지고 나면 다시 Drafts로 돌아오도록 설정할 수 있을 것이다. 액션을 실행하고 나서, 만들어진 일정에 만족하고 그걸로 확정하기로 했다면 Fantastical에서 “Add” 버튼을 누르면 된다. 그러면 일정을 추가할뿐만 아니라 x-success 매개변수를 트리거 시켜서 다시 Drafts로 돌아올 수 있게 해줄 것이다.

이와 같은 Drafts URL action은 우리가 앞서 배운 Drafts scheme이 아니라 Fantastical URL scheme을 따른다. 고로 다음과 같아 진다:

fantastical2://x-callback-url/parse?sentence=[[draft]]&x-success={{drafts://}}

이번에는 우리가 Fantastical로 시작을 했지만 그럼에도 액션을 연동시키는 형식은 우리가 두가지 Drafts 액션을 연동시켰던것과 완전히 똑같은 방식이라는걸 알아야 한다: [First Action]&x-success={{[Second Action]}}으로 말이다. 이번에는 첫번째 액션이 Drafts의 것이 아니라 Fantastical의 액션이었을 뿐이다.

Fantastical 액션을 하나하나 분해해보자. 몇가지 단어의 차이만 제외하면 Drafts URL scheme과 매우 비슷하다는걸 알아챌 수 있을 것이다.

  • fantastical2://는 iOS에게 Fantastical을 실행하라고 명령한다 (“2”가 URL scheme에 추가된 이유는 Fantastical2가 오리지널 Fantastical에서 완전히 새로운 앱으로 출시되었기 때문이다.)
  • x-callback-url/은 Fantastical이 빌트인 x-callback 매개변수를 사용할 수 있게 해준다.
  • parse?는 Fantastical이 새로운 일정을 분석할 준비를 하게 해준다.(Drafts URL scheme에서 “create?”에 해당하는 Fantastical의 명령어다.)
  • sentence=[[draft]]는 특별한 케이스다. Fantastical은 [[draft]]를 인식하지 못한다. 만약 이 액션을 웹브라우저에서 실행한다면 Fantastical은 쓸모없는 “[[draft]]”라는 텍스트로 일정을 만들 것이다. 하지만 우리는 이 액션을 Drafts에서 만들어서 실행하고 있다. Drafts는 [[draft]]를 보는 즉시 작성해둔 텍스트를 퍼센트-인코딩해서 태그를 대체해줄 것이다. 그래서 URL이 Fantastical에 도달했을때는 “Meeting on Monday at 10”(당신이 Fantastical이 분석할 수 있는 문장을 입력한다고 가정한 것이다.)이라는 식으로 보일 것이다. 그러면 Fantastical은 이 문장을 분석해서 다음주 월요일 오전 10시에 실제 제목이 “Meeting”인 일정을 만들어줄 것이다.
  • &x-success=는 Fantastical에게 “Add” 버튼을 누르면 다른 액션을 시작하라고 말해준다.
  • {{drafts://}}는 Fantastical의 작업이 끝나면 iOS에게 Drafts를 실행해서 원래 위치로 돌아오도록 해준다 (당신이 단지 앱을 열려고 하고 더 이상 어떤 일을 하려고 하지 않는다면 x-callback-url을 이 URL action에 사용하지 않아도 된다.)

이게 모든 URL action이 작동하는 기본적인 방식이다. Drafts이건 아니건 x-callback 액션을 하고 있다면 말이다. x-callback 능력이 없는 앱을 위한 액션은 더욱 단순해진다. x-callback-url과 x-success 매개변수를 지워버리고 단순한 기본적인 액션으로 두면 된다.

(Drafts가 아닌) 서드파티 액션을 Drafts 액션 리스트를 통해 실행하는 것은 Drafts의 멋진 [variable tags]를 액션에서 쓸 수 있게 해준다. 이것은 여러개의 앱을 연동시키는 고급 워크플로우에서 더욱 중요한 부분이 된다.

자바스크립트를 이용해 액션을 실행하기

만약 당신의 워크플로우가 URL이나 페이지의 제목 혹은 페이지에서의 인용 같은 웹페이지 데이터가 필요하다면, 이러한 데이터를 이용해서 새로운 드래프트를 자동으로 생성해주는 자바스크립트 북마크를 만들 수 있다. 이는 어느정도 자바스크립트에 대해 알아야 하는 부분이 있고, 이 글에서 가르치고자 하는게 아니기 때문에, 여기서 자세한 부분에 대해 다루지는 않을 것이다. 하지만 만약 관심이 있다면, Federico가 몇가지 이러한 종류의 워크플로우에 대해서 Drafts 2.5 리뷰에 예시를 든 것을 확인하면 된다. 그리고 다른 Macstories 글들을 통해 더 많은 것들을 찾아볼 수 있을 것이다.

팁과 주의사항

나는 URL 액션을 만들고 실행하면서 여러번 에러를 겪었다. 그리고 에러를 겪으면서 몇가지 배운 팁이 있다. 이 섹션을 읽으면서 부디 똑같은 실수를 하지 않길 바란다.

두가지 Drafts 액션을 함께 연동시킬 땐, [First Action]&x-success={{[Second Action]}} 템플릿 디자인을 절대 잊어버리지 말아라. 나는 종종 단순하게 &x-success=Post%20to%20App.net로 끝나는 액션을 만들어서 실행하곤 했다. 이런 에러(역자주: 퍼센트-인코딩이 한번만 됨)를 알아채고 나면 언제나 멍청하다는 생각이 들지만, 난 여전히 이 실수를 잊을만하면 한번씩 하곤 한다. 당신이 같은 방식으로 시작하는 두가지 액션을 함께 연동시키고, 유일한 차이가 액션 제목일 때는, URL을 시작하는 부분에서 두번 퍼센트-인코딩 해줘야 한다는걸 잊어버리기 쉽다. 앞의 것과 완전히 똑같은 것이라고 할지라도 말이다.

두번째 액션을 물결모양 괄호로 묶어줘야 한다는것을 잊지 말아라. 들어가는 괄호 “{{”를 정확히 입력하고도, 액션을 타이핑하다가 나오는 괄호 “}}”를 입력하지 않는 경우가 있다. 나오는 괄호를 입력하는걸 잊으면 액션은 아무런 설명없이 에러가 날 것이다. 그리고 다른 전체 액션이 올바르게 쓰여졌다면 더더욱 정말 찾아내기가 힘들다. 유일한 에러가 마지막 괄호 두개를 입력하지 않은 것 뿐인데도 말이다.

이번엔 팁이다. URL 액션을 작성할때는, “text=” 섹션을 당신의 드래프트를 위한 템플릿으로 생각해라. 당신은 “%0A”를 퍼센트-인코딩 된 줄바꿈(아니면 엔터 버튼을 한번 눌러라)으로 사용하거나, “%20”을 퍼센트-인코딩 된 스페이스로 사용할 수 있다. 이 두가지를 [[variable tag]] 사이에 넣고, 몇가지 하드코딩된 단어들을 함께 넣어 액션을 실행한 후에 미리 형식이 지정된 드래프트로 만들 수 있다. 예를 들어: 만약 당신이 매번 당신의 블로그에 포스팅을 할때마다 그걸 “New Post: [URL of the post]” 형식으로 트윗하고 싶다면, 단순히 새로운 포스트의 URL을 붙여넣고, 자동으로 “New post:[[draft]]” 형식으로 트윗을 작성하는 액션을 디자인하면 된다. [[draft]]에는 URL이 오면 된다. 이를 위해 “text=” 다음에 올 명령어는 New%20Post%3A%20[[draft]]가 될 것이다. 이게 당신의 트윗을 위한 템플릿이 되는 것이다. 내가 이러한 종류의 템플릿을 자주 사용하는 때는 자바스크립트 북마크를 이용해서 웹사이트의 정보를 뽑아낼 때이다. 당신의 액션을 템플릿으로 만듬으로서 당신은 웹페이지의 제목을 첫줄에 놓고 URL을 두번째 줄에, 혹은 둘 다를 첫번째 줄에 넣고 스페이스로 간격을 줄 수도 있다. 워크플로우에 대해서 생각할 때, 항상 똑같은 제목을 사용하거나, 다른 단어를 항상 똑같은 자리에 넣지 않는지를 살펴봐라. 이런것들은 액션에 하드 코딩해버려서 시간을 더 많이 절약할 수 있게 해주는 것들이다.

액션이나 액션의 일부를 인코딩 할 때는 퍼센트-인코딩을 (혹은 디코딩까지도) 위해 Launch Center Pro 같은 앱을 사용할 수 있다. Drafts를 떠나길 원하지 않는다면, 그리고 디코딩을 신경쓰지 않는다면, Drafts 내에서 빠른 액션을 실행해서 인코딩을 위해 Drafts의 {{물결모양 괄호}} 도구를 사용할 수도 있다. 당신이 해야할 일은 당신이 인코딩 하길 원하는 텍스트를 클립보드(작성해둔 글에서 아예 사라질 수 있도록 잘라내기를 할 것을 추천한다.)에 복사하고, 클립보드의 컨텐츠를 퍼센트-인코딩 하는 액션을 실행한다. 이 액션은 열려있는 모든 드래프트들을 보존하기에, 드래프트에서 URL action을 만들고 있는데, 일부를 인코딩하고 나머지는 그대로 두고 싶다면, 인코딩 할 부분을 클립보드에 잘라내서 액션을 실행하면 된다. 액션은 클립보드에 있는 컨텐츠를 퍼센트-인코딩 해서 새로운 드래프트로 만들어줄 것이다. 액션이 실행되고 나면 인코딩된 텍스트를 원하는 장소에 붙여넣고 액션을 만들기로 계속할 수 있다. 이게 그 액션이다: (Encode Clipboard action을 직접 임포팅하는 링크)

drafts://x-callback-url/create?text={{[[clipboard]]}}&action={{Copy to Clipboard}}&x-success={{drafts://x-callback-url/create?text=[[draft]]}}

[[line|n]] 태그를 사용할 때는 Drafts가 줄바꿈을 하기 전까진 텍스트의 양에 상관없이 한 줄로 쳐버린다는걸을 잊지 말아라. 만약 당신이 전체 문단을 엔터를 치지 않고 작성했다면, [[line|1]] 태그는 액션이 실행됐을때, 전체 문단으로 대체될 것이다. [[line|2]]도 비슷한 방식으로 첫번째와 두번째 줄바꿈 사이에 있는 텍스트를 전부 대체한다. [[title]] 태그도 똑같은 방식으로 작동한다. 사실 [[title]][[line|1]] 태그 사이에는 아무런 차이가 없다.

당신이 액션을 실행했을때 Drafts가 하는 첫번째 일은 모든 variable tags들을 그에 맍는 텍스트들로 치환하는 것이다. 이게 그 어떤 일보다 먼저 일어난다는것을 기억하는게 중요하다. 모든 변수들은 액션이 실행되기 전에 치환돼서 채워지기 때문에, 첫번째 액션과 두번째 액션 사이에서 이 변수들을 다른 텍스트로 바꿀 수는 없다. 이건 [[clipboard]] 태그에 관련해서 알아둘만하다. 흔한 에러는 당신의 첫번째 액션이 텍스트를 클립보드로 복사하는것이고, 연동해둔 액션이 [[clipboard]] 태그를 활용하는거라면, 첫번째 액션에서 복사된 것이 두번째 액션에서 [[clipboard]]로 쓰일거라고 생각하는 것이다. 실제에선 Drafts는 첫번째 액션을 실행되기 전에 클립보드에 있던 내용을 가져다 쓸 것이다. 이는 액션이 완료되었을 때 매우 혼란스러운 결과를 도출해내게 된다. 당신이 일전에 복사해둔 어떻게 얻게 됐는지도 모를 텍스트가 쓰이기 때문이다. 이 문제는 액션을 두가지 다른 액션으로 나눔으로써 해결 할 수 있다. 첫번재 액션은 텍스트를 클립보드로 복사하고, x-sucess를 이용해서 새로운 클립보드 텍스트를 사용하는 두번째 액션을 실행하는 것이다. 하지만 Drafts 3.5에서는 보통 클립보드에 복사해 넣는 대신 [[line|a..b]] 태그를 이용해서 드래프트를 나눠버릴 수 있어서 이게 더 쉬워졌다. 이전 버전에서는 [[variable tag]]가 다소 제한적이었기에, 클립보드에서 텍스트를 가져오는 꼼수를 더 자주 써야 했지만, 그것들은 더 이상 필요가 없어졌다. 하지만 그게 필요하다면, 앞서 언급한 방법은 여전히 도움이 될 것이다. 나는 이 방법을 몇가지 복잡하고 긴 액션 시퀀스에서 사용한다.

전문적인 워크플로우를 만들기 위한 팁과 트릭

당신이 초심자라면, 그리고 iOS 자동화와 URL scheme을 만드는 것에 대해 알고 있는게 방금 읽은게 전부라면, 여기서부터는 계속하기보다는 실제 활용해보고, 기초를 확실히 아는게 더 나을 수도 있다. 지금부터 설명되는 방법들은 다소 혼란스럽고 올바르게 다루기에는 어려울 수 있는 것들이다.

하나의 시퀀스에서 3개 혹은 그 이상의 액션을 연동시키기

일단 두가지 URL action을 함께 연동시키는 법을 마스터 했다면, 세개나 그 이상을 함께 연동시켜서 정말 복잡한 워크플로우를 만들기 시작하는 것은 실제로 정말 쉽다. 단지 몇가지 트릭만 알면 된다.

쉽게 생각하면 또 다른 “&x-success=”를 두가지 액션 뒤에 추가하고, 세번째 액션을 써 넣는 것이 떠오른다. 이론적으로 이건 작동한다. 하지만 실제로 Drafts는 이걸 다소 혼란스러워한다. 그리고 나는 이러한 종류의 것이 작동하는것을 본 적이 없다. 심지어 이게 작동한다 하더라도 이렇게 만들만한 가치가 있는지 의심스럽다. 세번째 액션은 세번 인코딩 되어야 하고, 세번 인코딩 하는건 혼란스럽고 너무 많은 작업을 필요로 하기 때문이다.

내가 찾은 세개나 그 이상의 액션을 연동하는 가장 좋은 방법은 그것들을 연결하는 “shell” 액션을 사용해서 두개를 한번에 그룹핑 해버리는 것이다. 내 Triple Cross Post 액션을 예로 들어보겠다. Triple Cross Post는 Cross Post 액션처럼 텍스트를 트위터와 App.net에 포스팅하고, 세번째 서비스에도 추가적으로 포스팅을 한다: 세번째 서비스는 페이스북이다. 이 액션을 만들기 위해선 세 가지 액션을 먼저 두가지 단순한 블록 액션(재료가 되는 액션)으로 나누는 것부터 시작한다. Triple Cross Post 액션은 세가지 기본적인 액션을 사용할 것이다: Post to App.net, Tweet: the_axx(다시 한번 말하지만 사용자계정은 당신의 것으로 바꿔서 써야 한다.), Post to Facebook 액션이 그것이다. 이것들을 두개로 그룹핑하면 된다. 우리는 두개를 하나로 묶고, 하나는 그대로 둘 것이다. 이제 당신은 짝을 이루는 개별 액션들을 만들게 됐다. 우리는 이미 이 글의 앞부분에서 액션을 만들어봤다. Cross Post action 말이다:

drafts://x-callback-url/create?text=[[draft]]&action={{Post to App.net}}&x-success={{drafts://x-callback-url/create?text=[[draft]]&action=Tweet%3A%20the_axx}}

두번째 세트가 하나의 액션이기 때문에, 우리는 새로운 액션을 만들 필요가 없다. 이젠 세가지 액션을 하나의 “shell” 액션으로 조합해야 한다. Shell은 연동된 액션과 같은 형식을 가지고 있다: [First Action]&x-success={{[Second Action]}}로 말이다. 하지만 이번엔 우리의 두번째 액션이 이미 만들어둔 연동된 액션이 된다. 방금 만든 Cross Post 액션 말이다. 그럼 이렇게 된다.

drafts://x-callback-url/create?text=[[draft]]&action={{Post to Facebook}}&x-success={{drafts://x-callback-url/create?text=[[draft]]&action=Cross%20Post}}

Drafts가 이걸 보고 나면 첫번재 액션을 실행해서 텍스트를 페이스북으로 포스팅한다. 그리고 두번째 액션을 만나게 되면, 첫번째 액션은 끝나고 Cross Post 액션을 실행하게 된다: App.net과 트위터에 포스팅 해주는 액션 말이다. 나는 이게 마치 Drafts가 두번째 액션을 “unwrapping” 하는 것과 비슷하다고 생각한다. 세가지 액션을 한번에 실행하려고 시도하는 대신, 연동된 액션 안에 또다른 연동된 액션을 넣어버리는 것이다.

똑같은 전략이 세개 이상의 액션을 연동시킬 때도 사용된다. 단지 연동된 액션 안에 또다른 연동된 액션을 넣기만 하면 된다. 가끔 Drafts가 이 액션들을 연달아 실행하면서 문제를 발생시킬 때도 있다는것을 알아둬라. 당신이 두가지 연동된 액션을 하나의 shell 액션에 넣어버렸을 때, 첫번째 액션이 실행되기 전에 너무 빠르게 두번째 액션이 실행이 되어서 당신의 첫번째 액션 일부를 건너뛰게 되는 것이다. 만약 당신이 내 Drafts Stress Test 액션을 살펴보게 된다면, 당신은 내가 shell 액션을 필요한것보다 좀 더 사용해서 이를 피해간다는걸 알 수 있을 것이다. 다른 것에 하나의 더블 액션보다 더 많은 액션을 넣지 않기 위해서 말이다. 나는 모든것을 [[draft]] 텍스트를 붙잡아 다음 shell로 보내주는 “continueTest” 액션으로 연결시킨다. 하지만 당신에겐 적어도 두가지 연동된 액션을 하나의 shell에 넣으라고 말하고 싶다. 만약 당신의 워크플로우가 그걸 필요로 한다면 말이다. 그렇게 하더라도 실제 작동할 때도 있고, 불필요한 여분의 액션을 만드는 시간을 절약해주기도 한다.[5] 나는 어떤 원인 때문에 버그가 발생하는지는 정확하게 설명하지 못하겠다. 어떤 때는 버그가 생기기도 하고, 어떤 때는 안 생기기도 한다. 어쩔 수 없이 당신은 어림짐작으로 추측을 해봐야 하고, 바로 확인해봐야한다.

보다시피, 이처럼 긴 연동 액션을 만들 때에는, 액션이 점차 혼란스러워질 수 있다. 분명히, 긴 연동 액션은 내 스트레스 테스트만큼이나 커서 실용적이지 못할 수도 있다. 나는 단순히 Drafts의 한계를 시험해보려 했지만, 당신은 유용한 연동 액션을 만들려 했을수도 있다. 25개의 액션보다는 적지만 여전히 3개보다는 많은 액션 말이다. 이 방법은 당신의 연동 액션이 불분명한 이유로 인해 작동하지 않을때 기억해두면 유용할수 있다. 보통 당신의 코드가 완벽하더라도, 앱이 실수할 수 있다는것을 감안해야 한다.

드래프트를 쳐내기

내가 가장 유용하다고 생각하는 고급 기술은 내가 드래프트를 “쳐낸다”고 부르는 것이다. 이것은 일련의 리스트로 정리된 데이터를 다루거나, 텍스트의 각기 다른 줄에 대해 똑같은 액션을 실행하고 싶을때 유용하게 쓸 수 있는 기능이다. 각각의 줄을 일일히 별개의 드래프트에 타이핑하고 직접 각각의 드래프트에 대해 액션을 실행하는 대신, 이 테크닉을 이용해서 모든 과정을 자동화 시킬 수 있다.

이 과정에 대해 가장 내가 좋아하는 예시는 내 Improt action이다. 이 액션은 엄청나게 긴 리스트의 액션 제목과 URL을 자동으로 하나하나 임포팅 해준다. 또 Parse In Fantastical Action도 좋아하는데, 이 액션은 긴 리스트로 작성된 여러개의 이벤트를 Fantastical에서 자동으로 하나하나 분석해준다.

나는 여기서 더 많은 독자들에게 유용할 것으로 보이는 Parse In Fantastical 액션을 예시로 쓸 것이다. 위에 있는 링크에서 볼 수 있는 Parse In Fastastical 액션은 단순화된 버전이다. 하지만 이 섹션이 전문가 섹션이기 때문에, 좀 더 복잡한 버전을 보여줄 것이고, 이 복잡한 버전은 드래프트를 쳐낼 때의 유용함을 더 잘 보여줄 수 있을 것이다 (나는 이 버전을 The Axx나 Unapologetic에 포스팅하지 않았다). 더 복잡한 버전의 Parse In Fantastical 액션은 Fantastical에서 새로운 이벤트를 분석해줄뿐만 아니라, 이벤트에 노트도 추가해준다. 이 액션을 실행하면, 당신의 리스트는 각각의 이벤트와 그에 맞는 노트들이 두 줄에서 짝을 지어 위치할 것이다. 그리고 짝지어 진 것들 사이에는 빈 줄이 들어갈 것이다.

Drafts가 한줄의 텍스트를 분석하기 위해 Fantastical에 보내려면, 그 줄은 반드시 분리되어 있어야 한다. 우리는 첫번째 줄을 [[line|1]] 태그를 이용해 첫번째 이벤트로 분리시킬 수 있다. 그리고 두번째 줄은 첫번째 이벤트에 대한 노트로서 [[line|2]] 태그를 이용해 분리시킬 것이다. 우리는 하나의 이벤트와 노트를 Fantastical에서 분석시키기 위해 이 두가지의 변수들을 액션에서 이용할 수 있다. 단 이 과정에서 가장 중요한 부분은 당신의 리스트에서 첫번째와 두번째 줄을 제외한 나머지 부분을 놓치지 말라는 것이다. Drafts에서 [[line|4..]] 태그는 드래프트의 네번째 줄에 있는 텍스트부터 끝에 있는 텍스트까지를 모두 다 대체할 수 있다는 것을 기억해라. 우리는 이러한 방법을 나머지 리스트에 적용해서 각각의 부분을 Fantastical로 분석할 것이다. 우리의 첫번째 액션이 오직 처음의 두 줄에만 집중했지만, 우리는 [[line|4..]]를 연동된 액션에 위치시켜서 우리가 Fantatstical[6]로 넘어갔다 하더라도 되돌아와 작업을 할 수 있다. 여기 노트 매개변수를 포함하는 Parse In Fantastical 액션이 있다.

fantastical2://x-callback-url/parse?sentence=[[line|1]]&notes=[[line|2]]&x-success={{drafts://x-callback-url/create?text=[[line|4..]]&action=Parse%20In%20Fantastical}}&x-cancel={{drafts://}}

보다시피 연동 액션의 첫번째에서 우리는 처음 두 줄을 [[line|1]][[line|2]] 태그를 이용해서 분리해내고, 그것들을 분석하기 위해 Fantastical로 보낸 후, 노트를 추가했다. Drafts가 variable tag를 액션이 처음 시작할때 채워넣기 때문에, 우리는 [[line|4..]] 태그를 우리의 두번째 액션에서 사용할 수 있고, 그래서 Fantastical이 작업을 끝냈을때, 다시 Drafts로 돌아와서 우리 리스트의 나머지 부분들이 우리를 위해 기다리게 해 둘 수가 있다. 나는 이 과정을 “쳐낸다”고 부른다. 왜냐하면 우리가 나머지 부분을 그대로 유지하면서도, 효과적으로 드래프트에서 첫 두줄을 쳐내기 때문이다. 이제 x-success 매개변수와 함께, 우리는 “Parse In Fantastical”을 한번 더 실행시켜서 액션을 원래의 것에 다시 연동시킬 수 있다. 우리가 [[line|4..]]를 사용했기 때문에, 우리의 새로운 드래프트는 처음의 리스트에서 4번째 줄부터 시작하는 전체 리스트를 갖는다. 고로 이 새로운 드래프트에서 처음 두 줄은 두번째 이벤트를 위한 매개변수가 되고, 이는 다시 Fantastical로 가서 이벤트와 노트로 분석된다. 이 과정은 당신의 리스트에 있는 모든 이벤트와 노트에 대해 반복되고, 세번째 줄은 전혀 사용되지 않기 때문에, 마치 아무것도 없는것처럼 될때까지 계속된다.

세번째 줄을 비워놓는것은 장점이 될 수도 있고, 에러를 발생시킬수도 있다. 이 경우에는 우리가 매겨변수들을 Drafts에서 타이핑 해 넣을때 그 사이에 빈 줄을 남겨놓음으로서 이를 활용했다. 덕분에 우리가 Fantastical에 보내는 데이터는 훨씬 가독성이 높아졌고, 우리가 액션을 실행하기 전에 빠르게 다시한번 살펴볼 수 있었다. 하지만 한편으로 당신이 variable tag를 줄마다 사용한다면 주의를 할 필요가 있다. 왜냐하면 당신이 잘못된 곳에 위치해 있거나, 절대 거기 있어서는 안되는 variable tag에서 줄 번호 사이에 갭을 남겨두면, 데이터를 완전히 잃어버리거나 액션이 잘못된 명령을 내리도록 매개변수를 보내버리기 때문이다.

마지막으로 한가지가 더 있다. 당신은 아마 첫번째 Fantastical 액션에서 x-cancel 매개변수가 끝에 포함되어 있다는걸 알아챘을 수도 있다. 이것은 x-callback-url 매개변수의 또 다른 것들 중 하나이다. 이미 x-success 매개변수가 첫번째 액션을 성공적으로 완료했을 때, 다른 액션을 실행하라는 의미인 것을 알고 있을 것이다. x-cancel이 하는 것은 예상하는 그대로이다: 그건 첫번째 액션이 취소되면 다른 액션을 실행하라는 의미이다. 취소한다는 것은 어떤 앱에서 액션이 실행되느냐에 따라 다양한 형태로 적용될 수 있다. Fantastical의 경우엔 꽤나 직관적이다: 만약 이벤트를 만드는 화면에서 “Add” 버튼 대신에 “Cancel” 버튼을 눌렀다면, 우리가 x-cancel 매개변수에 설정해둔 URL action을 실행할 것이다. x-success에 설정해둔 액션 대신에 말이다. 우리가 취소를 하지 않는다면 우리의 액션이 영원히 실행될것이기 때문에, 이건 시퀀스를 끝내는 방법이 된다. 우리가 만든 리스트에서 이벤트가 더 이상 없을때는 Fantastical이 한번 더 열리긴 할것이다. 단지 비어 있는 상태로 열리겠지만 말이다. 왜냐하면 분석할 새로운 리스트 아이템이 없기 때문이다. 이 시점에서 당신은 cancel 버튼을 누르면 되고, 그러면 Fantastical은 x-success 액션 대신 x-cancel 액션을 실행하게 될 것이다. 우리가 x-cancel을 drafts://로 설정해뒀기 때문에, 다시 Drafts로 돌아갈 것이고 반복된 액션이 끝나면서 워크플로우가 완료된다.

이 “쳐내기” 전략을 사용하면 당신이 원하는 어떤 리스트에서라도 필요로 하는 액션을 사용하는게 가능하다. 당신은 단지 당신의 리스트가 적절한 형식을 갖추고 있는지 확인하고, [[line|n..]] 태그가 정확한 줄 번호를 가리키고 있어서 다음 액션을 실행할때 이전의 액션에서 쳐내고 남은 부분의 첫번째가 적절한 매개변수로 작동할 수 있게만 하면 된다. 단순한 액션 시퀀스라면 [[body]][[line|2..]] 태그를 이용해서 나머지 리스트를 치환해서 쓸 수도 있다. 어차피 두 태그 모두 똑같은 기능을 하기 때문이다.

이 전략은 우리를 다음 팁으로 데려다 줄것이다. 당신의 연동 액션과 시퀀스를 쓰레드로 생각하는 것 말이다.

쓰레드로서 긴 액션 시퀀스에 대한 생각

어떻게 세개나 그보다 많은 액션을 함께 연동 시킨 액션 시퀀스를 만들수 있을지, 혹은 어떻게 당신의 쳐내기 방법이 제대로 작동하게 할 수 있는지를 설명할 수 있는 가장 좋은 방법은 쓰레드로서 모든 액션 스퀀스에 대해 생각해보는 것이다.

Drafts Stress Test에서 나는 25개의 액션을 6개의 앱과 8개의 서비스에 걸쳐 내가 처음 시작할때 사용했던 것과 똑같은 텍스트를 사용해서 연동시켰다. 이렇게 어마어마한 연동 액션을 만드는것은 이 모든 것을 쓰레드로 상상할때만 가능하다. 매번 Drafts는 하나의 액션을 끝내고, 다음 액션을 풀어내기에, 나는 내 텍스트의 쓰레드를 잃지 않도록 확실히 해야만했다. [[draft]] 변수는 전체 프로세스에서 똑같이 유지된다. 이것은 쳐내기에서와 비슷하게 작동한다: 만약 당신의 액션이 동일한 전체 드래프트에서 텍스트의 다른 부분을 뽑아낸다면, 각각의 액션에서 메인 텍스트를 보존하는걸 확실히 해야만 한다. 내가 위에서 예시로 든 Parse In Fantastical에서는 우리는 각각의 액션이 x-success 매개변수에서 [[line|4..]]를 포함하는걸 확실히 했어야 했다. 그래야 우리는 액션이 진행될 때, 리스트의 나머지 부분을 잃지 않을 수 있었다. 이 예시는 좀 더 까다로운 문제를 생각해볼 수 있게 해준다: 당신은 쓰레드를 관통하면서 올바른 태그를 사용해 당신이 원하는 정보를 끄집어낼수 있는지 완전히 확신할 수 있어야 한다. 왜냐하면 단 하나의 숫자로 인해 발생한 에러조차 다음 액션에서 중요한 부분을 잃게 만들수 있기 때문이다. 일괄처리되는 Parse action에서 이러한 에러는 당신의 노트가 이벤트 제목으로 설정되고, 이벤트 제목이 노트로 설정되는 결과를 불러일으킬 수 있다. 일단 이러한 에러가 발생하면 시간을 절약하는 대신 많은 시간을 허비하게 된다.

당신의 액션을 쓰레드로 생각하는 것은 이런 함정을 피할 수 있도록 내가 해줄 수 있는 최고의 조언이다. 모든 액션을 시퀀스로 쌓아서 임포팅 하기 전에 그것들을 살펴보고 쓰레드로 텍스트가 액션을 거쳐가면서 변하는 모습을 시각화해보는 것은 당신이 워크플로우에서 치명적인 에러가 발생하지 않도록 해주는 최고의 예방법이다.

“AllowEmpty” 매개변수 사용하기

Drafts의 최신 버전은 옵션으로 “allowEmpty” 매개변수를 포함하고 있다. 당신은 어떤 URL 액션이든 “&allowEmpty=NO”를 추가해서 비어있는 드래프트를 만났을때 액션이 멈추도록 할 수 있다. 이를 우선적으로 이용해 계속적으로 무한 반복되는 액션을 멈출 수 있다. 앞서 살펴본것처럼 당신의 텍스트를 쳐내다가 드래프트의 끝에 도달하게 됐을때 말이다. 우리가 살펴본 Parse In Fantastical 액션에서는 모든 이벤트와 노트가 만들어지고, 마지막에 Fantastical에서 비어 있는 텍스트가 전송되면 직접 “Cancel” 버튼을 눌러줘야 했고, 그러면 다시 Draft로 돌아가면서 반복이 끝났다. 하지만 allowEmpty 매개변수를 추가하면 이 마지막 과정에서 빈 텍스트를 Fantastical로 보내지 않고 액션을 종결시킬 수 있게된다.

allowEmpty의 트릭은 URL action의 어디에 매개변수를 놓을지 아는 것이다. 다음과 같이 모든것의 가장 뒤쪽에 추가할 때를 보자.

fantastical2://x-callback-url/parse?sentence=[[line|1]]&notes=[[line|2]]&x-success={{drafts://x-callback-url/create?text=[[line|3..]]&action=Parse%20In%20Fantastical}}&x-cancel={{drafts://}}&allowEmpty=NO

이는 에러를 발생시키진 않지만, 마지막에 위치시키면 여전히 Drafts에서 Fantastical로 빈 텍스트를 보내는 과정을 거치게 된다. 대신 매개변수를 중간에 놓아라. 빈 드래프트가 생기는 시점 바로 뒤에 말이다. 동시에 Parse In Fantastical 액션이 마지막으로 실행되기 바로 앞에 놓아야 한다:

fantastical2://x-callback-url/parse?sentence=[[line|1]]&notes=[[line|2]]&x-success={{drafts://x-callback-url/create?text=[[line|3..]]&allowEmpty=NO&action=Parse%20In%20Fantastical}}&x-cancel={{drafts://}}

Drafts는 액션을 단계별로 따라갈 것이고, 이 포맷으로는 먼저 텍스트를 Fantastical로 보낼 것이다. 그리고 성공적으로 이벤트를 만들고 나서 다시 Drafts로 돌아올 것이다. 그 다음에 세번째줄 아래에 남아있는 텍스트를 이용해서 새로운 드래프트가 만들어질 것이고, Drafts는 드래프트에 남아있는 텍스트가 있는지 확인할 것이다. 만약 텍스트가 남아있다면, 다시한번 액션으로 돌아가서 계속해서 실행될 것이고, 더 이상 남아 있는 텍스트가 없다면 allowEmpty 매개변수가 발동되고, NO로 설정되어 있기 때문에, 따라오는 액션은 실행되지 않고 취소될 것이다. 시퀀스는 Fantastical에서 취소 버튼을 누르도록 하는 대신 Drafts 안에서 종결될 것이다.

allowEmpty가 있다면, x-cancel 매개변수는 쓸모없어 보인다. 하지만 나는 여전히 x-cancel 매개변수를 포함시켜서 모든 이벤트가 만들어지기 전에 액션을 취소할 수 있게 해뒀다. x-cancel 매개변수 덕분에 시퀀스 중간에 Fantastical에서 Cancel 버튼을 눌러 취소할 수 있게 해주기 때문이다. 그렇게 해두면 중간에 취소하더라도 여전히 시작했던 Drafts로 다시 돌아올 수 있다.

결론

당신이 URL action을 만드는데 아무런 사전지식이 없이 이 글을 읽기 시작했고, 내가 이 글을 계획한대로 잘 썼다면, 당신은 이제 자신만의 고급 URL action 워크플로우를 만드는데 충분한것들을 알고 있을 것이다. 아마 정말 잘 만들려면 조금 더 연습이 필요할 것이다. 하지만 나는 당신이 이 글을 통해 이 주제에 대해 좀 더 잘 알 수 있었기를 바란다. 내 새로운 웹사이트인 Unapologetic을 확인해보고, 상단에 있는 뷰 컨트롤러에서 “Automation”을 선택하고 내가 올려둔 몇가지 흥미로운 액션들을 살펴봐라. 내가 매주 새로운 액션과 워크플로우를 올려둘테니, 정기적으로 살펴보는 것도 좋다. 당신은 여기 MacStories에서도 더 많은 훌륭한 액션들을 찾아볼 수 있다. Federico는 언제나 그의 글에 보석들을 흩뿌려놓곤 한다. 당신이 우리가 올려둔 어떤 액션이든 임포팅 할 수 있다면, 나는 당신이 Drafts의 설정에서 코드를 확인해보고, 설치한 모든 액션이 실제로 어떻게 작동하는지 이해해보라고 권하고 싶다. 그렇게 하면 Drafts와 URL action을 이용한 iOS 자동화에 대한 지식을 더 많이 쌓을 수 있을 것이다. 또한 당신이 자신의 것을 만들기 시작하는데 좋은 참고자료가 될 수 있을 것이다.

이제 뭔가 놀라운 것을 만들어 봐라. 그리고 당신이 놀라운 무언가를 만들었다는 소식을 듣게 되길 바란다.


  1. 하나를 더 추가한다: 나는 이 과정에서 Tweetbot이나 Felix를 열지 않기 때문에, 내가 무언가 더 생산적 일을 해야 할 때 타임라인에 시선을 빼앗기는 대신 빠르게 포스팅만 할 수 있다는걸 더 선호한다.  ↩

  2. 당신이 마크다운 포맷으로 글을 쓸 수 있고, 당신이 액션을 실행했을땐 Drafts가 마크다운을 HTML로 전환해서 그 형식에 맞게 노트를 생성해준다는 뜻이다.  ↩

  3. 두번째 액션 제목을 퍼센트-인코딩 하는걸 잊지 말아라. 그리고 당신의 트위터 계정이름을 사용해라.  ↩

  4. x-callback-url을 지원하는 앱들의 전체 리스트는 여기서 찾아볼 수 있다.  ↩

  5. 나는 당신이 시도해보기를 바란다. 일단 한번 작동하면, 항상 작동하기 때문이다. 이건 어쩌다 한번 작동하는것도 아니고, 같은 코드로 다른 때에 실패하는게 아니다. 만약 당신이 연동을 제대로 해냈고, 정상적으로 작동한다면 그건 언제나 항상 잘 작동할 것이다. 그리고 불필요한 액션을 만드는데 필요한 시간을 절약할 수 있다.  ↩

  6. 우리는 [[line|3]] 대신 [[line|4]]를 사용했다. 왜냐하면 세번째 줄이 매개변수 사이에서 비어있는 줄이기 때문이다. [[line|4]]를 호출하는 것은 세번째 줄을 잘라내서 가장 첫 줄이 매번 우리의 이벤트 제목이 되도록 해주고, 반복되는 액션이 다시 실행될 수 있게 해준다.  ↩