macOS용 iOS(APNs) / Android(FCM) 푸시 테스트 앱입니다.
저장소: github.com/pkh0225/PushTester
- iOS (APNs)
- Auth Key (
.p8) 임포트 - Team ID, Bundle ID, Key ID, Device Token
- Sandbox / Production
- Priority, Push Type, JSON payload
- Auth Key (
- Android (FCM HTTP v1)
- Firebase 서비스 계정 JSON 임포트
- Project ID, FCM Device Token
- Priority, JSON payload
- 플랫폼 탭 기억
- 마지막에 선택한 iOS / Android 탭을 저장해 다음 실행 시 그대로 복원
- 3영역 레이아웃 (
HSplitView)- 왼쪽: 전송 히스토리
- 가운데: 입력 폼
- 오른쪽: 앱 내 저장목록
- 좌·우 패널은 툴바로 접기/펼치기
- 펼친 패널 기준으로 창 최소 너비 유지
- Payload 도구
- 커스텀 템플릿: 현재 Payload를 이름과 함께 저장·불러오기·관리 (iOS/Android 분리)
- JSON 유효성 표시: Payload 옆에서 실시간 검사, 전송 전에도 재검증
- Key 선택: 현재 JSON의 key 경로 목록에서 대상 선택
- String 치환 / 원복: 선택한 key의 value를 문자열로 변환 (object/array는 JSON 텍스트). 다시 누르면 원복
- 인코딩 / 원복: 선택한 key의 value를 URL percent-encoding. 다시 누르면 원복
- String / 인코딩 그룹은 각각 독립적인 Key 선택
- Payload 편집기에서 macOS 스마트 따옴표 치환 비활성화 (
"유지) - 세션 복원·Push Notification 전송 시 스마트 따옴표(
“ ” ‘ ’등)를 ASCII"/'로 교정
- 다중 토큰 전송
- Device Token 프리셋에 저장된 토큰을 개별/전체로 연속 전송
- Push 버튼 옆 ▾ 메뉴에서 선택
- 결과 요약(
Success n/m)과 토큰별 히스토리 기록
- 필드 프리셋
- Bundle ID, Team ID, Key ID, Device Token, Project ID 등 값 목록 관리
- 인증서(
.p8/ 서비스 계정 JSON) 목록 관리·선택 - 라벨 옆 ⚙으로 추가·수정·삭제 (변경 시 자동 저장)
- 입력칸 옆 ▼로 저장된 항목 선택 시 필드에 자동 입력
- 앱 내 설정 저장 (오른쪽 패널)
+로 현재 입력값을 이름과 함께 저장- 적용 / 편집(이름 포함) / 삭제
- iOS / Android 탭별 목록 분리
- 전송 히스토리 (왼쪽 패널)
- 전송 기록(성공·HTTP 실패 포함), 적용 / 편집 / 삭제
- 응답 상세: APNs/FCM 응답 헤더·바디 보기·복사
- 현재 플랫폼 히스토리 전체 삭제
- iOS / Android 탭별 목록 분리
- 설정 (타이틀바 가운데
PushTester옆 ⚙)- 앱 정보 (이름, 버전, 플랫폼, GitHub 링크, 간단한 설명)
- 설정 목록 UI (
AppSettingsCatalog로 항목 확장 가능) - 전체 데이터 초기화 (히스토리·저장목록·프리셋·인증서·Payload 템플릿·마지막 세션·플랫폼 탭·입력 폼)
- 마지막 세션 자동 저장/복원
- 세션 JSON 파일로 저장·불러오기 (하단 버튼)
- 창 크기·위치 기억
- macOS 14+
- Xcode 15+ (권장)
빌드본을 복사해 둔 경우:
~/Desktop/PushTester.app
cd /path/to/PushTester
open PushTester.xcodeproj또는:
xcodebuild -project PushTester.xcodeproj -scheme PushTester -configuration Debug -destination 'platform=macOS' buildBundle ID: com.local.PushTester
- 상단 탭에서 iOS 선택 (마지막 선택은 다음 실행 시 자동 복원)
- Apple Developer에서 발급한 APNs Auth Key (
.p8) 임포트 (또는 ▼에서 저장된 인증서 선택) - Team ID, Key ID, 앱 Bundle ID, Device Token 입력 (자주 쓰는 값은 프리셋으로 저장해 두면 편리합니다)
- Sandbox / Production 선택
- Payload 편집 후 Push Notification
- 상단 탭에서 Android 선택
- Firebase 콘솔의 서비스 계정 JSON 임포트 (또는 ▼에서 저장된 인증서 선택)
- Project ID, FCM Device Token 확인/입력
- Payload 편집 후 Push Notification
Payload 영역 헤더에 템플릿·변환·전송 컨트롤이 있습니다.
- 템플릿 메뉴로 저장해 둔 Payload를 불러오고, 저장으로 현재 내용을 이름으로 남깁니다. ⚙에서 목록을 관리합니다.
- 옆의 JSON 유효 / JSON 오류로 전송 전 상태를 확인합니다. 오류면 Push가 바로 막히고 상태바에 이유가 표시됩니다.
- Key 선택에서 변환할 JSON key 경로를 고릅니다.
- String 치환: int/bool/object/array 등을 문자열로 바꿉니다. object/array는 compact JSON 문자열이 됩니다.
- 같은 버튼을 다시 누르면 String 원복으로 이전 타입을 되돌립니다.
- 인코딩: 선택한 value를 URL percent-encoding 합니다. (object/array는 JSON 텍스트로 만든 뒤 인코딩)
- 다시 누르면 인코딩 원복입니다.
- Payload 편집 중에는 macOS가
"를 스마트 따옴표로 바꾸지 않습니다. 이미 섞여 있는 경우 세션 복원·Push 전송 시 ASCII로 교정됩니다.
- Device Token 라벨 ⚙으로 여러 토큰을 프리셋에 저장합니다.
- Push 버튼 오른쪽 ▾ 을 엽니다.
- 개별 프리셋 토큰으로 보내거나 프리셋 토큰 전체 전송을 선택합니다.
- 각 토큰 전송 결과는 히스토리에 남고, 상태바에 성공/실패 요약이 표시됩니다.
입력 필드의 값을 여러 개 저장해 두고 빠르게 바꿔 쓸 수 있습니다.
- 라벨 오른쪽 ⚙ 을 눌러 해당 필드 목록을 엽니다.
- 값을 추가·수정하고, 항목 옆 x 로 삭제합니다 (삭제 전 확인).
- 변경 내용은 자동 저장됩니다.
- 입력칸 오른쪽 ▼ 에서 항목을 고르면 필드에 바로 채워집니다.
인증서도 동일합니다. Import로 가져오거나 설정에서 파일을 추가하면 목록에 남고, ▼로 다시 선택할 수 있습니다.
파일보내기와 별개로, 현재 입력값을 앱 안에 저장해 둡니다.
- 오른쪽 위 + 를 눌러 이름을 지정하고 저장합니다.
- 목록에서 항목을 선택한 뒤 적용으로 폼에 반영합니다.
- 편집에서는 저장 시 넣은 이름과 설정값을 수정할 수 있습니다 (
저장목록 편집). - 삭제는 확인 후 진행됩니다.
- 툴바 오른쪽 저장목록 버튼으로 패널을 접거나 펼칠 수 있습니다.
- iOS / Android 탭에 따라 목록이 분리됩니다.
- 푸시를 보내면 왼쪽 목록에 기록됩니다 (HTTP 실패 응답도 포함).
- 항목을 선택한 뒤 적용으로 폼에 반영합니다.
- 항목을 우클릭한 뒤 응답 상세로 APNs/FCM 응답 헤더·바디를 확인하고 복사할 수 있습니다.
- 편집 / 삭제(단일) / 헤더 휴지통(현재 플랫폼 전체 삭제)을 사용할 수 있습니다.
- 툴바 왼쪽 버튼으로 패널을 접거나 펼칠 수 있습니다.
- iOS / Android 탭에 따라 히스토리가 분리됩니다.
- 히스토리 전체 삭제는 저장목록·프리셋 등 다른 데이터에는 영향을 주지 않습니다.
- 타이틀바 가운데 PushTester 옆 ⚙ 을 누릅니다.
- 앱 정보에서 버전·GitHub 저장소 링크를 확인할 수 있습니다.
- 전체 데이터 초기화는 확인 후 앱 내부 저장 데이터와 입력 폼을 모두 비웁니다.
이후 설정 항목을 추가할 때는 AppSettingsCatalog에 정의를 넣고, ContentView의 설정 액션 처리에 동작을 연결하면 됩니다.
앱 데이터는 모두 로컬에만 저장됩니다.
~/Library/Application Support/PushTester/
push-history.json # 전송 히스토리
saved-configs.json # 앱 내 저장목록
field-presets.json # 필드 프리셋
certificate-presets.json # 인증서 프리셋
payload-templates.json # 커스텀 Payload 템플릿
last-session.json # iOS 마지막 세션
android-last-session.json # Android 마지막 세션
창 크기·위치, 마지막 iOS/Android 탭 선택은 UserDefaults에 저장됩니다.
- Payload 편집기는 스마트 따옴표를 끄며, 세션 복원·Push 전송 시에도 ASCII 따옴표로 교정합니다.
- APNs JWT는 짧게 캐시해
TooManyProviderTokenUpdates(HTTP 429)를 줄입니다. - 키·토큰·서비스 계정·프리셋은 로컬에만 저장되며, 외부로 전송되지 않습니다(푸시 API 호출 제외).
- 앱을 삭제하면 Application Support 데이터도 함께 정리될 수 있습니다.
