KO

내 게임을 Mac, iPhone, iPad 앱으로

JumPHP는 게임을 브라우저 없이 동작하는 진짜 Apple 앱으로 만들어 줘요. PHP 8.5, SDL, OpenGL, OpenAL이 앱 안에서 실행돼요. 컴퓨터에서, 그리고 네이티브 Android 앱에서와 같아요.

  • Mac: Apple 칩(M1 이후)과 Intel Mac용 앱, macOS 11 이상, .dmg 형식이에요.
  • iPhone과 iPad: .ipa 앱, iOS 14 이상이에요. 엔진이 그리는 터치 컨트롤과 게임의 화면 방향이 적용돼요. Xcode 시뮬레이터용 앱도 같이 만들어요.

Apple 앱을 만들려면 Xcode, 즉 Mac이 필요해요. 하지만 Mac이 없어도 괜찮아요. GitHub가 자기 Mac에서 만들어 줘요(공개 저장소는 무료). 어떤 컴퓨터에서든 할 수 있어요. 내 컴퓨터에 JumPHP 프로젝트(내 컴퓨터에서)와 GitHub 저장소가 필요해요. Claude가 전부 대신 해 줄 수 있어요. "내 게임의 Mac과 iPhone 앱을 만들어 줘"라고 부탁하세요.

명령 하나

bin/jumphp apple mon-jeu      # Mac + iPhone / iPad
bin/jumphp macos mon-jeu      # Mac만
bin/jumphp ios mon-jeu        # iPhone / iPad만(그리고 시뮬레이터)
  1. 처음 실행하면 앱의 식별자(io.github.vous.mon-jeu: App Store에 올린 뒤에는 바꿀 수 없어요)를 물어봐요.
  2. 버전을 games/mon-jeu/apple/app.json에 기록하고, 워크플로 .github/workflows/apple.yml을 프로젝트에 넣고, 커밋한 다음 내가 동의하면 푸시해요.
  3. GitHub가 Mac에서 앱을 만들고(처음에는 약 40분, 이후에는 약 10분: PHP와 라이브러리가 캐시돼요) 시험해 봐요. Mac 앱은 게임을 실행하고 화면 이미지를 남기며, iPhone 앱은 가상 iPhone에 설치되어 실행되고 촬영돼요.
  4. 앱과 스크린샷 두 장이 담긴 저장소의 release를 게시하고, games/mon-jeu/dist/apple/에 내려받아요(스크린샷은 check/에 있어요. 꼭 확인하세요).

이후 버전: bin/jumphp apple mon-jeu --version 1.1(빌드 번호는 매번 1씩 올라가요). Xcode가 있는 Mac에서는 --local로 모든 것을 그 자리에서 만들 수 있어요.

git 밖에 있는 파일(공개 저장소에 둘 수 없는 원작 게임의 데이터로, 플레이그라운드의 비공개 파일과 같아요): 명령이 이를 찾아서, 내가 동의하면 저장소의 초안 release에 올려요. 그 저장소에 쓸 수 있는 사람만 볼 수 있어요. GitHub의 Mac이 빌드하기 전에 이 파일들을 게임에 다시 넣어요. 이 경우 앱에 이 파일들이 포함되므로 앱의 release도 초안이 되고, 게시 여부는 내가 결정해요.

Apple 개발자 계정 없이(처음 시작할 때)

앱은 신원 없이 "ad hoc"으로 서명돼요.

  • Mac: 처음에는 앱을 오른쪽 클릭 > 열기를 하세요(macOS가 한 번 물어봐요). 나, 친구, 테스터가 쓰기에는 충분해요.
  • iPhone / iPad: iPhone은 자기 앞으로 서명된 앱만 설치해요. .ipa는 계정을 기다려요(아래 참고). 그때까지는 시뮬레이터용 앱(Xcode가 있는 Mac에서)을 쓰고, 웹 버전은 Safari에서 설치할 수 있어요(공유 > 홈 화면에 추가).

Apple 개발자 계정이 있다면(그다음 단계)

개발자마다 Apple Developer Program에서 자기 계정을 만들어요(연 99달러). 앱은 그 사람의 이름으로 게시되고, 인증서는 저장소의 시크릿에 보관돼요. 계정으로 할 수 있는 일은 다음과 같아요.

  • 오른쪽 클릭 없이 Mac 앱 열기: Developer ID 서명과 Apple의 공증
  • iPhone에 앱 설치, TestFlight에 올린 뒤 App Store에 게시

이것이 JumPHP의 다음 단계예요. App Store는 PHP로 만든 게임도 받아 줘요. 코드가 앱 안에서 실행되고 앱과 함께 배포되며, 이후에 다운로드하는 것이 없기 때문이에요(규정 2.5.2).

터치 컨트롤

iPhone과 iPad에서는 엔진이 브라우저와 Android에서처럼 화면 컨트롤을 그려요. 십자키(또는 조이스틱), A, B, START예요. game.yaml에서 설정해요.

game:
  touch: { pad: stick, a: Space, b: Escape, labels: { a: SAUT } }   # pad: stick = 조이스틱, 아니면 십자키

게임패드(블루투스, MFi)도 쓸 수 있어요. Mac에서는 컴퓨터처럼 키보드, 마우스, 게임패드를 써요.

앱 안에서

  • Mac(Apple 칩과 Intel)과 iPhone용으로 컴파일한 PHP 8.5에 JumPHP의 확장(SDL과 이미지·사운드·폰트 모듈, OpenGL, OpenAL, gd, openssl, mbstring…), SDL2, OpenAL Soft가 들어 있어요. JIT은 없어요. Apple이 iPhone에서 금지해요.
  • 내 게임이 그대로 앱 안에 들어가요. 저장 파일과 옵션은 앱 폴더(Application Support)에 저장되고 업데이트해도 유지돼요.
  • 이름, 아이콘(assets/icon.png, 없으면 제목의 첫 글자), 화면 방향(게임의 화면 비율)은 game.yaml에서 가져와요.
  • 3D 게임(gl(), opengl())도 동작해요. iPhone에서는 OpenGL ES, Mac에서는 OpenGL이에요(엔진이 셰이더를 알아서 변환해요).
  • HTTPS도 동작해요($engine->http(), wss://로 하는 온라인 게임).

기술적인 자세한 내용은 내 프로젝트의 docs/apple.md에 있어요.