특정 번호의 문자가 앱에서 수신되지 않는 이유와 확인 방법
문자 수신 앱을 개발하다 보면 테스트 문자나 일반 문자는 정상적으로 들어오는데, 특정 번호에서 온 문자는 앱에서 수신되지 않는 경우가 있습니다.
예를 들어 “문자왔어요”처럼 새로 수신되는 SMS를 확인해서 조건에 따라 이메일로 전달하는 앱을 만들 때, 모든 문자가 항상 동일한 방식으로 앱에 전달되는 것은 아닙니다.
이번 글에서는 특정 번호의 문자가 앱에서 수신되지 않을 수 있는 이유와 개발 시 확인해야 할 내용을 정리해 보겠습니다.
1. 일반 SMS가 아닐 수 있음
가장 먼저 확인해야 할 것은 해당 문자가 실제로 일반 SMS인지입니다.
요즘 스마트폰에서는 문자처럼 보이지만 실제로는 다음과 같은 방식으로 들어오는 경우가 있습니다.
- 일반 SMS
- MMS
- RCS 메시지
- 채팅 메시지
- 통신사 서비스 메시지
- WAP Push
- 재난문자 또는 특수 알림
앱에서 RECEIVE_SMS 권한과 SMS_RECEIVED BroadcastReceiver를 사용한다면 일반 SMS는 받을 수 있지만, RCS나 일부 특수 메시지는 일반 SMS 수신 이벤트로 들어오지 않을 수 있습니다.
즉 문자 앱에서는 보이지만, 내가 만든 앱의 SMS 수신 처리에서는 감지되지 않을 수 있습니다.
2. 스팸 또는 차단 처리된 경우
특정 번호가 스팸으로 분류되면 앱에서 수신 처리를 못 할 수 있습니다.
대표적인 경우는 다음과 같습니다.
- 통신사 스팸 차단
- 삼성 메시지 스팸 차단
- Google Messages 스팸 보호
- 차단 번호 등록
- 스팸함으로 자동 이동
이 경우 사용자는 나중에 문자 앱의 스팸함에서 문자를 확인할 수 있지만, 앱의 SMS 수신 이벤트에는 정상적으로 전달되지 않을 수 있습니다.
따라서 특정 번호가 안 들어온다면 먼저 스마트폰 문자 앱에서 해당 번호가 차단 또는 스팸 처리되어 있는지 확인해야 합니다.
3. 기본 SMS 앱 여부에 따른 차이
Android에서는 SMS 관련 처리가 기본 문자앱과 일반 앱에서 다르게 동작할 수 있습니다.
기본 SMS 앱은 문자 수신, 문자 발송, 문자 저장 등 더 많은 권한과 역할을 가질 수 있습니다. 반면 일반 앱은 새로 수신되는 SMS 이벤트 일부만 받을 수 있습니다.
따라서 특정 메시지가 기본 SMS 앱 전용 흐름으로 처리되거나, 통신사/문자앱에서 별도 처리되는 경우에는 일반 앱에서 받지 못할 수 있습니다.
문자 전달 앱을 안정적으로 만들려면 기본 SMS 앱으로 확장하는 방법도 있지만, 이 경우 구현 범위가 크게 늘어납니다.
기본 SMS 앱으로 만들려면 다음 기능까지 고려해야 합니다.
- 문자 목록 표시
- 문자 대화방 관리
- 문자 발송
- MMS 처리
- 기본 문자앱 설정 요청
- 기존 문자앱을 대체할 수 있는 사용자 화면
단순히 새 문자를 이메일로 전달하는 앱이라면 기본 SMS 앱까지 만드는 것은 부담이 클 수 있습니다.
4. 앱 권한 문제
문자 수신 처리를 위해서는 최소한 다음 권한이 필요합니다.
<uses-permission android:name="android.permission.RECEIVE_SMS" />
이 권한이 없거나 사용자가 허용하지 않으면 앱은 문자를 수신할 수 없습니다.
기존 문자함 전체를 읽으려면 READ_SMS가 필요하지만, Google 정책상 매우 민감한 권한입니다. 따라서 새로 수신되는 문자만 처리하는 앱이라면 READ_SMS는 사용하지 않는 것이 좋습니다.
권장 구조는 다음과 같습니다.
RECEIVE_SMS 사용
READ_SMS 미사용
새로 수신되는 문자만 처리
사용자 동의 후 자동 전달
이렇게 하면 개인정보 침해 가능성을 줄이고, Google Play 정책 대응에도 더 유리합니다.
5. 앱이 강제 중지된 경우
앱이 정상 설치되어 있어도 사용자가 설정 화면에서 강제 중지를 누르면 문자 수신 처리가 동작하지 않을 수 있습니다.
일반적으로 앱을 한 번 실행하고 권한을 허용한 뒤 백그라운드에 두거나 최근 앱 목록에서 닫는 정도는 문제가 되지 않습니다.
하지만 다음 상황에서는 수신 처리가 안 될 수 있습니다.
- 앱 강제 중지
- SMS 권한 해제
- 배터리 최적화로 백그라운드 제한
- 절전 모드
- 제조사 자체 백그라운드 차단
- 네트워크 미연결
- 서버 API 오류
특히 문자 수신 후 이메일로 전달하는 앱은 문자 수신뿐 아니라 인터넷 연결도 필요합니다.
따라서 앱 설정 화면에 다음 기능을 넣는 것이 좋습니다.
- SMS 권한 확인
- 위치 권한 확인
- 알림 권한 확인
- 배터리 최적화 제외 안내
- 미전송 문자 재전송 기능
6. Receiver에서 너무 오래 처리하는 경우
문자를 받으면 Android의 BroadcastReceiver가 실행됩니다.
하지만 BroadcastReceiver 안에서 너무 오래 걸리는 작업을 바로 처리하면 문제가 생길 수 있습니다.
예를 들어 다음 작업을 Receiver 안에서 한 번에 처리하면 불안정할 수 있습니다.
문자 수신
→ 위치 조회
→ 서버 API 호출
→ 이메일 전송 요청
→ 결과 저장
→ 화면 갱신
안정적인 구조는 다음과 같습니다.
문자 수신
→ 즉시 로컬 저장
→ 조건 분석
→ 전송 큐 등록
→ 백그라운드에서 서버 전송
→ 실패 시 미전송 상태 저장
→ 앱 실행 시 재전송
즉, 문자 수신 시에는 먼저 안전하게 저장하고, 이메일 전달은 별도 작업으로 처리하는 것이 좋습니다.
7. 수신 자체와 전송 실패를 구분해야 함
특정 번호의 문자가 처리되지 않는다고 할 때, 실제 원인은 여러 가지일 수 있습니다.
먼저 아래 세 가지를 구분해야 합니다.
1. 받은 문자 목록에도 없음
→ SMS 수신 이벤트 자체가 안 들어온 것
2. 받은 문자 목록에는 있음
→ 조건 불일치 또는 전송 제외 처리
3. 받은 문자 목록에도 있고 메일도 왔지만 실패로 표시
→ 상태 표시 로직 문제
이 구분이 중요합니다.
무조건 “문자를 못 받았다”고 판단하면 원인을 찾기 어렵습니다.
8. 조건 필터 때문에 제외될 수 있음
문자 전달 앱에서는 보통 모든 문자를 보내지 않고 조건을 설정합니다.
예를 들어 다음 조건을 둘 수 있습니다.
- 전체 문자
- 금융
- 택배/배송
- 인증/보안
- 긴급/위치
- 사용자 키워드
이 경우 특정 번호의 문자가 들어와도 내용에 조건 키워드가 없으면 이메일로 전달되지 않을 수 있습니다.
예를 들어 금융 조건에서 다음 키워드를 기준으로 분류한다고 가정해 보겠습니다.
카드, 승인, 결제, 입금, 출금, 이체, 은행
그런데 실제 문자가 다음과 같이 오면 금융 문자로 분류되지 않을 수 있습니다.
이용내역 안내
고객님의 요청이 처리되었습니다
알림이 도착했습니다
따라서 조건 필터를 사용할 때는 “왜 제외되었는지”를 로그에 남기는 것이 좋습니다.
9. 특정 번호 항상 전달 기능이 필요함
특정 번호의 문자는 키워드와 관계없이 항상 전달하고 싶을 수 있습니다.
예를 들어 다음 번호들입니다.
- 은행 대표번호
- 카드사 대표번호
- 택배사 번호
- 가족 번호
- 회사 시스템 알림 번호
- 보안 인증 번호
이 경우 설정에 다음 기능을 넣으면 좋습니다.
항상 전달할 번호
전달 제외할 번호
번호 일부 포함 조건
예를 들면 다음과 같이 설정할 수 있습니다.
항상 전달 번호:
1588, 1599, 1600, 01012345678
전달 제외 번호:
광고, 스팸, 특정 번호
이렇게 하면 문자의 내용에 키워드가 없어도 특정 번호에서 온 문자는 무조건 전달할 수 있습니다.
10. 개발 시 추천 로그 구조
문자 수신 앱은 로그가 중요합니다.
최소한 아래 정보는 저장하는 것이 좋습니다.
수신 시각
발신 번호
문자 내용
분류 결과
전달 조건
전달 여부
제외 사유
메일 전송 결과
서버 응답 메시지
위치 포함 여부
예를 들어 다음과 같이 표시할 수 있습니다.
수신됨
분류: 금융
조건: 금융 선택됨
전달: 성공
또는:
수신됨
분류: 일반
조건: 금융만 선택됨
전달: 제외
사유: 선택 조건과 일치하지 않음
이렇게 해야 사용자가 “왜 메일이 안 왔는지” 쉽게 이해할 수 있습니다.
11. 문자 전달 앱의 안정적인 처리 흐름
최종적으로 안정적인 구조는 아래와 같습니다.
1. SMS 수신
2. 로컬 저장
3. 발신번호 확인
4. 항상 전달 번호 확인
5. 제외 번호 확인
6. 문자 내용 키워드 분석
7. 전달 조건과 비교
8. 위치 키워드 포함 여부 확인
9. 필요 시 위치 URL 생성
10. 서버 API로 이메일 전달 요청
11. 성공/실패 상태 저장
12. 실패 시 재전송 대기
이 구조를 사용하면 특정 번호나 특정 조건에서 문제가 생겨도 원인을 찾기 쉽습니다.
12. 결론
특정 번호의 문자가 앱에서 수신되지 않거나 이메일로 전달되지 않는 경우는 충분히 발생할 수 있습니다.
대표 원인은 다음과 같습니다.
일반 SMS가 아닌 RCS/특수 메시지
스팸 또는 차단 처리
기본 SMS 앱 전용 처리
SMS 권한 문제
앱 강제 중지
배터리 최적화 제한
Receiver 처리 시간 문제
조건 필터 불일치
서버 전송 실패
상태 표시 오류
따라서 문자 전달 앱을 개발할 때는 단순히 문자를 받아서 바로 보내는 구조보다, 다음 기능을 함께 넣는 것이 좋습니다.
수신 로그 상세 저장
조건별 분류 결과 표시
전달 제외 사유 표시
항상 전달 번호 설정
전달 제외 번호 설정
미전송 재전송 기능
권한 상태 확인
배터리 최적화 제외 안내
문자 수신 앱은 권한과 정책이 민감한 영역입니다.
특히 Google Play 등록을 고려한다면 READ_SMS는 사용하지 않고, RECEIVE_SMS만으로 새로 수신되는 문자만 처리하는 구조가 더 안전합니다.
결국 안정적인 문자 전달 앱의 핵심은 다음입니다.
새 문자만 처리
사용자 동의 후 동작
조건에 맞는 문자만 전달
전달 결과를 명확히 표시
실패 시 재전송 가능
이 구조로 개발하면 사용자 입장에서도 안심하고 사용할 수 있고, 개발자 입장에서도 문제 발생 시 원인을 훨씬 쉽게 파악할 수 있습니다.
'조그만 기술로 세상을 이롭게 > 문자왔어요' 카테고리의 다른 글
| 문자왔어요 앱 개발 방법 및 사용 기술 상세 정리 (0) | 2026.06.18 |
|---|---|
| 문자왔어요 앱 개선 안내 – 메일/톡 전달 기능과 안정성 보완 (1) | 2026.06.14 |
| 문자왔어요 앱, 왜 만들었고 왜 조심스럽게 테스트하고 있을까? (0) | 2026.06.14 |
| PC에서 USB 디버깅으로 폰에 APK를 직접 설치하는 방식은? (0) | 2026.06.12 |