macOS 앱스토어 제출 삽질기

macOS 앱스토어 제출 삽질기

MP4 파일의 moov atom을 앞으로 옮겨주는 간단한 macOS 앱을 만들었다. “Fast-start” 최적화라고 불리는 것. 웹에서 영상 스트리밍 시 바로 재생되게 해준다.

앱 자체는 하루 만에 만들었는데, 앱스토어 제출이 예상보다 오래 걸렸다.


Fastlane 설정

수동으로 앱스토어 제출하는 건 너무 귀찮다. Fastlane을 사용했다.

# 초기 설정
fastlane init

Fastfile

default_platform(:mac)

platform :mac do
  desc "Build and upload to App Store Connect"
  lane :release do
    # 버전 증가
    increment_build_number

    # 앱 빌드
    build_mac_app(
      scheme: "QuickMoov",
      export_method: "app-store",
      output_directory: "./build"
    )

    # 앱스토어 커넥트 업로드
    upload_to_app_store(
      skip_screenshots: true,
      skip_metadata: false,
      precheck_include_in_app_purchases: false
    )
  end
end

암호화 플래그

앱을 업로드하면 이런 질문이 나온다:

“Does your app use encryption?”

HTTPS 사용해도 “Yes”를 선택해야 하나? 헷갈린다.

결론: 표준 HTTPS만 사용하면 No. 하지만 매번 물어보는 게 귀찮으니 Info.plist에 미리 설정.

<key>ITSAppUsesNonExemptEncryption</key>
<false/>

이 플래그가 있으면 업로드 시 질문을 건너뛴다.


데모 모드

앱 심사 시 리뷰어가 앱을 테스트한다. 문제는 리뷰어가 테스트 파일을 가지고 있지 않다는 것.

해결: 데모 모드

앱 실행 시 --demo 플래그가 있으면 샘플 파일을 자동으로 로드.

// main.swift 또는 AppDelegate
if CommandLine.arguments.contains("--demo") {
    // 번들에 포함된 샘플 파일 로드
    DemoMode.shared.activate()
}

앱 심사 시 “Notes for Reviewer”에 이렇게 적었다:

Launch the app with --demo flag to load sample files automatically.


스크린샷 자동화

앱스토어에 올릴 스크린샷을 매번 수동으로 찍기 귀찮다. Fastlane snapshot으로 자동화.

# Snapfile
devices([
  "Mac"
])

languages([
  "en-US",
  "ko"
])

scheme("QuickMoovScreenshots")
output_directory("./screenshots")
clear_previous_screenshots(true)

UI 테스트로 스크린샷 캡처

// QuickMoovScreenshotsUITests.swift
func testCaptureScreenshots() {
    let app = XCUIApplication()
    app.launchArguments = ["--demo"]
    app.launch()

    // 메인 화면
    snapshot("01_MainScreen")

    // 파일 분석 화면
    app.buttons["Analyze"].click()
    snapshot("02_AnalysisResult")

    // 변환 완료 화면
    app.buttons["Optimize"].click()
    sleep(2)
    snapshot("03_OptimizationComplete")
}

실행:

fastlane snapshot

영어, 한국어 스크린샷이 자동으로 생성된다.


메타데이터 관리

앱 이름, 설명, 키워드 등을 코드로 관리.

fastlane/metadata/
├── en-US/
│   ├── name.txt
│   ├── description.txt
│   ├── keywords.txt
│   ├── privacy_url.txt
│   └── support_url.txt
└── ko/
    ├── name.txt
    ├── description.txt
    └── keywords.txt

description.txt 예시

QuickMoov optimizes your video files for web streaming.

Features:
• Move moov atom to the beginning (fast-start)
• Remove unnecessary free atoms
• Reduce file size
• Drag and drop interface
• Supports MP4, MOV, M4V, M4A, 3GP

Perfect for content creators, web developers, and anyone who shares videos online.

업로드 시 자동으로 반영:

fastlane deliver

개인정보 처리방침

앱스토어에 올리려면 개인정보 처리방침 URL이 필요하다. 개인 정보를 수집하지 않아도.

GitHub Pages로 간단하게 만들었다:

# Privacy Policy

QuickMoov does not collect any personal data.

The app processes video files locally on your device.
No data is transmitted to external servers.

Last updated: January 28, 2026

URL: https://github.com/kyungw00k/quickmoov/blob/main/PRIVACY.md


전체 제출 흐름

# 1. 버전 업데이트 (Xcode에서)
# 2. 빌드 및 업로드
fastlane release

# 3. App Store Connect에서 심사 제출
# (자동화도 가능하지만 수동으로 최종 확인)

삽질 정리

문제 해결
암호화 질문 반복 ITSAppUsesNonExemptEncryption 플래그
리뷰어 테스트 파일 없음 --demo 플래그로 데모 모드
스크린샷 수동 캡처 Fastlane snapshot + UI 테스트
메타데이터 관리 fastlane/metadata 폴더
개인정보 처리방침 GitHub에 PRIVACY.md

결론

Fastlane 설정만 해두면 이후 업데이트는 편하다.

# 버전 올리고
# fastlane release
# 끝

하지만 처음 설정하는 데 반나절 정도 걸렸다. 스크린샷 자동화가 가장 삽질이 많았다.

앱 만드는 것보다 앱스토어 제출이 더 오래 걸릴 수 있다.

Back