앱 심사가 거절당했어요 (리젝 사유 TOP 5와 대처법)
1. "심사 중(In Review)"의 공포
앱 개발의 끝판왕은 코딩이 아니라 배포(심사 통과)입니다. 밤새워 개발해서 제출했는데, 다음 날 아침 메일함에 "App Submission Feedback"이라는 제목의 메일이 와 있습니다. "Guideline 2.1 - Performance: App Completeness" 심장이 덜컥 내려앉습니다.
리젝(Rejection)은 누구나 겪는 통과의례입니다. 하지만 자주 걸리는 패턴을 알면 한 번에 통과할 확률을 높일 수 있습니다.
2. 사유 1 - 테스트 계정 로그인 실패 (가장 흔함)
심사관들은 여러분의 앱을 수동으로 테스트합니다. 로그인 기능이 있다면, 반드시 작동하는 테스트 계정을 제공해야 합니다.
흔한 실수
- 2단계 인증(2FA)이 걸린 계정을 줌. (심사관은 OTP를 못 받습니다!)
- 소셜 로그인(카카오/구글)만 있는데, 심사관이 한국 유심이 없어서 인증을 못 함.
- 서버 IP 차단: 심사관은 캘리포니아(미국)에서 접속합니다. 한국 IP만 허용해놨다면 접속 불가로 리젝당합니다.
해결책
- 아이디:
tester@demo.com/ 비번:Demo1234!처럼 심플한 계정을 만드세요. - 이 계정은 모든 인증 로직(OTP 등)을 우회하도록 백엔드에서 예외 처리하세요.
- "Review Notes" 란에 "이 계정으로 로그인하세요"라고 명시하세요.
3. 사유 2 - 개인정보처리방침 (Privacy Policy)
앱 내에 회원가입이 있다면, 반드시 개인정보처리방침 링크가 있어야 합니다. 그리고 앱 스토어 Connect에도 URL을 넣어야 합니다.
흔한 실수
- 링크가 깨져 있음 (404 Not Found).
- 노션(Notion) 링크를 넣었는데 권한이 없어서 접근 불가.
- 앱 내에서 "설정 > 개인정보처리방침" 메뉴를 찾을 수 없음.
해결책
- 웹사이트에 정식 페이지를 만드세요 (
myapp.com/privacy). - 회원가입 화면에 "동의합니다" 체크박스와 함께 링크를 넣으세요.
4. 사유 3 - IPv6 네트워크 지원 (Apple 한정)
애플은 IPv6-only 네트워크 환경에서 심사를 진행합니다.
여러분의 백엔드 서버가 IPv4 주소(예: 123.45.67.89)만 하드코딩되어 있다면, 심사관 아이폰에서는 접속이 안 됩니다.
해결책
- API 주소에 IP 대신 도메인 이름(
api.myapp.com)을 쓰세요. - AWS 로드밸런서(ALB)나 CloudFront는 기본적으로 IPv6를 지원하므로 이를 통하면 안전합니다.
http대신 반드시https를 쓰세요. (ATS 정책 위반 방지)
5. 사유 4 - 사용자 생성 콘텐츠 (UGC) 정책 위반
여러분의 앱이 커뮤니티, 댓글, 채팅 기능을 포함한다면 UGC(User Generated Content) 정책을 따라야 합니다. 사용자가 올린 글에 욕설이나 음란물이 있을 수 있기 때문입니다.
필수 구현 기능 3가지 (없으면 100% 리젝)
- 차단(Block): 꼴보기 싫은 사용자를 차단하는 기능.
- 신고(Report): 부적절한 게시글/댓글을 신고하는 기능.
- 관리자 삭제(Moderation): 신고된 글을 관리자가 24시간 이내에 삭제할 수 있는 시스템. (또는 AI 필터링)
이 기능을 UI에 잘 보이게 넣어두세요. 숨겨두면 심사관이 못 찾아서 리젝합니다.
6. 사유 5 - 메타데이터, 스크린샷 불일치
앱 설명에는 "AI가 3초 만에 그림을 그려줍니다"라고 썼는데, 실제 기능은 준비 중이라서 "Coming Soon"이라고 띄웠다? 리젝입니다. "앱 설명에 적힌 기능이 실제로 작동하지 않음" 사유입니다.
해결책
- 구현 안 된 기능은 설명에서 빼세요.
- 스크린샷은 실제 앱 화면을 찍으세요. (아이폰 X 이후 모델의 노치 디자인 필수)
- 권한 요청(카메라, 위치) 시 뜨는 시스템 팝업 설명 문구(Usage Description)를 구체적으로 적으세요.
- 나쁜 예: "카메라 권한이 필요합니다."
- 좋은 예: "프로필 사진을 촬영하기 위해 카메라 권한이 필요합니다."
7. 암호화 수출 규정 (Crypto Export Compliance) 제대로 이해하기
앱에서 https를 쓴다면 암호화 기술을 사용하는 것입니다.
미국 수출 관리 규정(EAR)에 따라 이를 신고해야 합니다.
해결책
App Store Connect나 Google Play Console에서 "앱이 암호화를 사용합니까?" 질문에 "네"라고 답하세요.
보통의 https 통신은 "면제 대상(Exempt)"입니다.
"표준 암호화 알고리즘만 사용합니다"를 선택하면 별도 서류 없이 통과됩니다.
이걸 "아니요"라고 했다가 나중에 걸리면 계정이 정지될 수도 있습니다.
8. 구글 플레이 스토어의 함정 (비공개 테스트 20명)
2023년 11월부터 구글은 개인 개발자 계정에 대해 "20명 이상의 테스터가 14일 이상 비공개 테스트(Closed Testing)를 진행해야만 프로덕션 배포 가능"이라는 초강수를 두었습니다. 이걸 모르고 개발했다가 출시를 못 하는 분들이 정말 많습니다.
대처법
- 지인 동원: 친구, 가족, 동료 도합 20명의 Gmail 주소를 수집해야 합니다.
- 구글 그룹스 활용: 테스터 관리를 위해 구글 그룹스를 만들어 초대하면 편합니다.
- Opt-in 필수: 테스터들이 초대 메일을 받고 "테스트 참여하기" 버튼을 직접 눌러야 카운트됩니다.
- 14일 버티기: 매일 20명일 필요는 없지만, 14일 동안 테스트 트랙이 활성화되어 있어야 합니다.
이건 피해갈 수 없는 요건이므로, 개발 시작 단계부터 테스터를 모으는 게 좋습니다.
9. 요약
- 테스트 계정: OTP 없는 프리패스 계정을 제공하라.
- 개인정보: 링크가 열리는지 확인하라.
- 네트워크: 도메인 주소를 쓰고 IPv6를 지원하라.
- UGC: 신고/차단 기능을 꼭 넣어라.
- 설명문구: 권한 요청 멘트와 스크린샷을 정직하게 채워라.
리젝은 "거절"이 아니라 "품질 보증(QA)" 과정이라고 생각하세요. 애플과 구글이 내 앱의 버그를 대신 찾아준 겁니다. 고치고 다시 제출하면 됩니다.
App Store Rejection: The Survivor's Guide (Top 5 Reasons)
1. The Dreaded "In Review" Status
The hardest part of app development isn't coding—it's Passing the Review. You submit your build at 3 AM. The next morning, you get an email: "App Submission Feedback". Guideline 2.1 - Performance: App Completeness Your heart sinks.
Rejection is a rite of passage. But knowing the common pitfalls can boost your "One-Shot Pass" rate.
2. Reason 1: Login Failure (Most Common)
Reviewers manually test your app. If you have a login screen, you MUST provide a working test account.
Common Mistakes
- 2FA/OTP Enabled: The reviewer is in California. They can't receive your SMS OTP.
- Geoblocking: You blocked US IP addresses. Reviewers can't connect.
- Social Login Only: Reviewers might not have a KakaoTalk or Naver account.
Solution
- Create a "Demo User":
tester@demo.com/Demo1234!. - Whitelist this account on your backend to bypass 2FA.
- Write clearly in the "Review Notes": "Please use this account to log in."
3. Reason 2: Privacy Policy URL
If you collect ANY user data (even just email), a Privacy Policy is mandatory.
Common Mistakes
- Broken Link: URL returns 404 or 500 error.
- Notion Link: Requires login to view (Private Page). Change it to "Public".
- Hidden Menu: The link must be accessible inside the app (e.g., Settings > Privacy).
4. Reason 3: IPv6 Network Support (Apple Specific)
Apple conducts reviews on an IPv6-only network.
If your backend uses hardcoded IPv4 addresses (e.g., 123.45.67.89), the connection will fail on the reviewer's device.
Solution
- Always use a Domain Name (
api.myapp.com) instead of raw IP. - AWS ALB and CloudFront support IPv6 translation by default.
- Prefer
httpsoverhttpto satisfy App Transport Security (ATS).
5. Reason 4: User Generated Content (UGC) Policy
If your app has Chat, Comments, or Community features, you fall under UGC Guidelines. You must protect users from abusive content.
Required Features (Missing = Automatic Rejection)
- Block User: Ability to hide content from specific users.
- Report Content: A button to flag inappropriate posts.
- Moderation: A system for admins to review and remove reported content within 24 hours.
Make the "Report" button visible. Don't hide it too deep.
6. Reason 5: Metadata Mismatch
Your description says "AI generates art in 3 seconds," but the feature crashes or says "Coming Soon." Rejected. "App features mentioned in description must be available."
Solution
- Remove description of unfinished features.
- Screenshots must reflect the actual app. (Use modern device frames).
- Permission Usage Descriptions: Be specific in
Info.plist.- Bad: "Need camera."
- Good: "App needs camera access to take your profile picture."
7. Deep Dive: Export Compliance (Crypto)
Does your app use https? Then you are using Encryption.
US Export Administration Regulations (EAR) require you to declare this.
Solution
In App Store Connect, when asked "Does your app use encryption?", answer YES. Then, typically select "Exempt" (standard encryption like HTTPS). If you answer "No" and get caught, your developer account could be suspended. It's a legal compliance issue.
8. Google Play Store Trap (20 Testers Rule)
Since late 2023, Google requires new personal developer accounts to run a Closed Test with at least 20 testers for 14 continuous days before applying for Production access. This is a massive hurdle for solo developers.
Survival Strategy
- Recruit Early: Gather 20 Gmail addresses from friends, family, or online communities (Reddit r/AndroidDev).
- Google Groups: Create a group to manage testers easily.
- Opt-in is Mandatory: Testers must click the "Join Test" link. Just adding their email isn't enough.
- Wait 14 Days: There is no shortcut. Plan your launch date accordingly.
FAQ
Q: Can I pay someone to test? A: Yes, there are services, but be careful of low-quality testers. Google detects fake activity.
Q: Does Apple have this? A: No, Apple only requires TestFlight review if you invite external testers, but no minimum count/duration for Production submission.
Deep Dive Glossary
1. Provisioning Profile
A crucial file for iOS development that links your App ID, Development/Distribution Certificates, and allowed devices. Without a valid provisioning profile, your app cannot be installed on a device or submitted to the App Store.
2. Entitlements
Key-value pairs that grant specific capabilities or security permissions to your iOS app. Examples include Push Notifications, iCloud access, Apple Pay, and Sign In with Apple. These must match the capabilities enabled in the provisioning profile.
3. IDFA vs IDFV
- IDFA (Identifier for Advertisers): A persistent ID used for tracking users across apps for advertising. Requires explicit user permission via App Tracking Transparency (ATT) framework.
- IDFV (Identifier for Vendor): A code assigned to all apps from the same developer on a device. It persists across app reinstalls if at least one app from the vendor remains.
4. Bitcode
An intermediate representation of a compiled program. Uploading Bitcode allowed Apple to re-optimize binaries for new device architectures without resubmission. However, starting with Xcode 14, Bitcode is deprecated and no longer required for App Store submission.
5. Symbolication
The process of resolving memory addresses in a crash report into human-readable function names and line numbers. This requires the dSYM (Debug Symbol) file generated during the build process. Always upload dSYMs to Firebase/Sentry.
6. App Thinning
A set of technologies (Slicing, Bitcode, On-Demand Resources) that ensures the user downloads only the code and resources needed for their specific device, minimizing the download size.