pile·
모바일·G마켓G마켓·

iOS에서 이벤트 기반 URL 요청이 잘 전송되는지 확인하기 (feat. 광고 트래킹.. 제대로 가고 있나요?)

G마켓이 수익과 직결되는 iOS 광고 트래킹 URL 요청이 배포 후에도 제대로 전송되는지, 일반 QA 로는 잡기 어려운 부분을 UITest 로 자동 검증한 사례를 다룬다. URLProtocol 로 네트워크 요청을 가로채 시뮬레이터 공유 폴더에 기록하고, 별도 프로세스인 UITest 에서 그 URL 을 검증하는 구조다.

핵심 포인트
  • 광고 트래킹은 수익과 직결되는데 코드 수정 시 깨질 위험이 있고 일반 QA 로는 발견이 어려워, 배포 전 자동 검증이 필요했다.
  • 단순 Fake 객체(플래그만 변경)로는 실제 URLRequest 네트워크 요청 여부를 못 잡는 게 핵심 문제였다.
  • URLProtocol 서브클래싱으로 요청을 가로채 URL 을 시뮬레이터 공유 폴더에 기록한다.
  • UITest 는 별도 프로세스라 메모리 공유가 안 돼, SIMULATOR_SHARED_RESOURCES_DIRECTORY 파일로 IPC 한다.
  • Protocol+DI 와 launchEnvironment 로 시나리오별 Fake JSON 을 주입해 네트워크 의존을 제거했다.
상세 정리
  • 문제: 광고 클릭→이벤트→URL 요청→광고 처리 시스템→비용 청구 흐름을 배포 전 검증해야 하는데, 일반 QA 로는 트래킹 누락을 발견하기 어려웠다.
  • Fake 한계: 플래그만 바꾸는 단순 Fake 객체로는 함수 호출 여부만 알 뿐 실제 URLRequest 전송을 확인할 수 없었다.
  • 요청 가로채기: CustomURLProtocol 이 URLProtocol 을 상속해 startLoading 에서 요청 URL 을 저장하고 임의 200 응답을 돌려준다.
  • 세션 설정: URLSessionConfiguration.ephemeral 에 protocolClasses 로 CustomURLProtocol 을 꽂아 테스트 시에만 가로채게 한다.
  • 크로스 프로세스: UITest 와 앱이 별도 프로세스라 메모리 싱글톤 공유가 안 돼, SIMULATOR_SHARED_RESOURCES_DIRECTORY 환경 변수의 storedUrls.txt 에 URL 을 append 한다.
  • 검증: numberOfTextInSharedFolder 로 기대 URL 등장 횟수를 세 XCTAssertEqual 로 판정한다.
  • UI 트리거: accessibilityIdentifier 컨벤션(타입명·프로퍼티명·enum 분리)으로 요소를 식별하고 tap·waitForExistence 등으로 상호작용한다.
  • Fake 데이터: 동적 네트워크는 지연·불안정해, SearchResultRepository 프로토콜을 실제·가짜 구현으로 나누고 launchEnvironment 로 시나리오별 JSON 을 선택한다.
  • 트레이드오프: 이 방식은 시뮬레이터 전용이라 실기기 테스트가 안 되고, 정적 JSON 은 안정적이지만 실제 API 변경을 반영하지 못한다.
왜 읽나iOS 에서 광고·분석 트래킹 같은 네트워크 사이드이펙트를 자동 검증하려는 모바일 개발자에게, URLProtocol 가로채기와 시뮬레이터 IPC 기반 UITest 설계 레퍼런스.
G마켓
G마켓 블로그
원문은 여기서 이어서 읽을 수 있어요
원문 읽기
읽음 (0)

이 글과 비슷한

  1. 모바일·당근당근 테크블로그·

    웹뷰 다음의 레일을 깔다: 당근이 Lynx를 선택한 이유

    당근 프론트엔드코어팀이 WebView 기반 화면의 첫 프레임 렌더링 문제를 해결하기 위해 Lynx를 도입한 기록이다. 레퍼런스가 거의 없는 기술을 코드베이스 직접 분석으로 검증한 뒤 프로덕션에 적용했고, 1.9백만 사용자 A/B에서 Android 18%, iOS 37%의 첫 프레임 단축을 달성했다.

    요약 이어보기
    #cross-platform#webview#mobile-performance+2
  2. 모바일·토스 SLASH토스 SLASH·

    토스의 디바이스 팜 만들기

    토스가 각 팀이 각자 운영하던 작은 디바이스 팜을 하나의 중앙 플랫폼 '네뷸라(Nebula)'로 통합한 과정을 다룬다. Appium 대신 자체 드라이버를 개발해 클릭 13.5배, 텍스트 입력 10배의 성능을 달성했고, Android와 iOS 미러링도 직접 내재화해 실기기 원격 조작과 화면 실시간 공유를 동시에 가능하게 만들었다. 현재 100대를 넘어 수백 대를 향해 24시간 가동 중이다.

    요약 이어보기
    #android#ios#appium+2