이번 글을 쓰는 저도 iOS 개발에 첫 발을 떼내었고 아마 대부분 이 글을 보시는 분이라면 트윅 개발에 첫 걸음을 시도하려는 분들일 것입니다. 여기에서 우리는 Mac이나 Windows/Linux PC없이 THEOS를 iPhone에 설치할 예정입니다. 심지어 어렵지도 않아요.


시작하기

기본 원리

먼저 여러분이 만들 트윅은 시스템의 특정 함수나 이벤트에 훅을 걸어 자신이 원하는 코드로 대체시키는 작업을 하게 될 겁니다. 그리고 기본적으로 iOS 트윅의 개발은 iOS 앱을 개발할 때와 같이 다음과 같은 언어를 사용합니다.

  • C/Obj-C
  • Swift 4~

하지만 트윅이 훅을 걸기 위해서는 Obj-C를 사용해야 하는 것으로 알려져 있습니다. 그렇기 때문에 트윅 개발에 있어서 첫 언어는 Obj-C가 될 것입니다. 그리고 만든 코드를 컴파일하여 설치하면 여러분의 아이폰에 트윅이 로드가 될 것입니다.

THEOS (Cross-compiler)

그리고 저희는 Mac OS에서 Xcode를 사용하여 개발하는 것이 아니기 때문에 (애초에 Mac을 사용하지 않는걸요...) THEOS라는 크로스 컴파일러를 사용하여 iPhoneOS-ARM을 Target으로 설정하고 코드를 컴파일해줄겁니다.

준비물

  • iPhone (Jailbroken, Unc0ver/Checkra1n)
  • Cydia or any other package manager

개발 환경 만들기

Windows에서는 아직 iOS로의 크로스 컴파일이 불가능하기 때문에 보통은 WSL이나 가상머신을 사용하게 됩니다. 하지만 여기에서 저희는 iPhone에 직접 THEOS를 설치할 것입니다. 이미 글을 읽으며 찾아보신 분들은 알겠지만 Git 등으로 메뉴얼하게 설치 작업을 해야 합니다. 다행히도 그렇지 않아도 훨씬 더 쉬운 방법이 있습니다. Theos Installer 2 패키지를 사용하면 훨씬 쉽게 개발을 시작할 수 있습니다.

SSH로 iPhone(remote)에 접근하기

실제로 직접 iPhone으로 코딩을 하는 것은 무리이기 때문에 Mac/PC를 연결하실 분들은 아래 방법 중 하나를 통해 iPhone에 접근하는 것을 권장드립니다. 그 전에 패키지 매니저(Cydia, Installer...)에서 OpenSSH 패키지를 설치해주세요. 기본 레포지토리에 있는 패키지로도 충분합니다. 접근할 때는 root 계정과 기본 비밀번호인 alpine을 사용하면 됩니다. (반드시 연결 후에 바꾸어주세요)

3uTools 사용하기

첫 번째 방법은 3uTools를 사용하는 것입니다. Windows 환경에 있으신 분들만 사용할 수 있으며 이미 내부에서 매우 쉽게 SSH 터널링을 구현해놓았습니다. 아래에서 추가적으로 OpenSSH 패키지를 사용하여 직접 연결하는 방법을 참고해도 됩니다. 먼저 USB 케이블을 컴퓨터에 연결하고 아이폰이 컴퓨터에 인식이 되길 기다려주세요. 그리고 Toolbox 탭에서 Open SSH Turnel 버튼을 통해 간단하게 터널이 열립니다. (아이폰의 화면이 꺼져도 연결이 끊기지 않습니다)

그리고 PuTTy를 통해 localhost에 접근하면 됩니다.

메뉴얼하게 연결하기

먼저 OpenSSH 패키지는 iPhone의 화면이 꺼지면 중지되기 때문에 미리 화면 꺼짐 시간을 설정 해제하도록 합니다. 설정 앱의 '디스플레이 및 서체', '자동 잠금'에서 변경할 수 있습니다.

그리고 iPhone이 같은 네트워크 혹은 접근할 수 있는 네트워크 상에 있는지 확인한 후 IP 주소를 사용하여 SSH 연결을 수립하면 됩니다.

따라서 저와 같은 경우에는 192.168.0.4로도 SSH 연결이 가능합니다. 물론 여기에서도 반드시 첫 연결 후 비밀번호를 반드시 변경해주셔야 합니다.

Theos Installer 설치하기

패키지 매니저에 저장소 추가하기

그리고 필수적으로 몇 가지 저장소를 추가할 겁니다.

패키지 설치하기

그리고 Theos Installer 2 패키지를 설치합니다.

Theos 설치하기

이제 다시 iPhone 쉘로 돌아와서 theosinstaller 13.1 명령어를 통해 간단하게 Theos를 설치해줍니다. 저는 iOS 13용 Theos를 개발할 예정이기 때문에 13.1로 시작을 합니다. 설치를 하면 거의 모든 작업 환경이 즉시 설정됩니다.

  • Sam Binger의 Toolchain
  • iOS 13.1 Private SDK
  • THEOS

작업 디렉터리 만들기

홈 디렉터리에서 작업하다보면 실수로 시스템 상에 타이핑 에러가 발생할 수 있기 때문에 저는 /var/_seia에 폴더를 만들고 Symlink를 추가해주었습니다.

mkdir -p /var/_seia
ln -s /var/_seia

이제 모든 기본적인 준비가 완료되었습니다!

개발시작하기

새 프로젝트 만들기

Theos에서는 /var/theos/bin/nic.pl 명령어로 새로운 프로젝트 생성이 가능합니다. 16번 옵션을 통해 템플릿을 먼저 생성하겠습니다. 여기에서 nic는 New instance create를 뜻합니다.

이 뒤에 나오는 질문은 대부분 기본적인 프로젝트의 요구 사항이나 메타데이터입니다.

Choose a Template (required): 16
Project Name (required): tutorial
Package Name [com.yourcompany.tutorial]:
Author/Maintainer Name [System Administrator]: Seia-Soto <seia@outlook.kr>
[iphone/tweak_with_simple_preferences] MobileSubstrate Bundle filter [com.apple.springboard]:
[iphone/tweak_with_simple_preferences] List of applications to terminate upon installation (space-separated, '-' for none) [SpringBoard]:

여기에서 주요하게 볼 것은 MobileSubstrate Bundle filter나 마지막의 List of applications to terminate upon installation입니다.

  • MobileSubstrate Bundle filter: 어디에 Tweak이 적용될 지 알려줍니다.
  • List of applications to terminate upon installation: 설치 시에 종료되어야 할 애플리케이션 목록입니다.

컴파일하기

기본적으로 저희가 Theos Installer로 설치한 경우에는 기본적으로 13.1 Private SDK가 포함되어 있어 특별한 작업없이도 armv7, arm64 그리고 arm64e 모두 컴파일이 가능합니다. 간단히 make package install 명령어를 사용하면 배포할 수 있는 deb 파일로 패키징 후 설치까지 모두 완료됩니다. 저와 같은 경우에는 설치는 하지 않을 것이기 때문에 make package 명령을 대신 입력하겠습니다.

그럼 이렇게 하나의 배포 가능한 패키지가 나오게 됩니다.