2018년 10월에 구글에서 공지한 '통화 기록 및 SMS 사용 권한 제한'에 따라 2019년 1월부터 '통화 기록 및 SMS 사용 권한 제한' 정책은 전화나 문자를 주 기능으로 하는 앱이 아니면 SMS 권한을 획득할 수 없다고 합니다. 이 경우 단순히 '인증번호 자동 입력' 기능 구현을 위한 앱은 SMS Retriever API 를 사용하는 방식으로 구현하여야 합니다. 참고 소개google developer 에서 소개하는 SMS Retriever API 내용을 간략하게 보자면 아래와 같이 설명하고 있습니다. SMS Retriever API 를 사용하면 사용자가 수동으로 인증 코드를 동작앱에서 자동 SMS 수신을 구현 한다면 과정은 다음과 같습니다.
복잡해 보이지만 Hint Selector 기능을 사용하지 않으면 간단하게 구현할 수 있습니다. 안드로이드에서는 Retriever API 를 실행 후 Retriever API 에서 제공하는 Action 이벤트를 필터링 하는 Receiver 를 등록합니다. 디바이스에 SMS 가 수신 될 때 우리가 등록한 Receiver 에게 Retriever API 가 SMS Message 를 알려줍니다. 우리는 전달받은 Text(SMS Message) 를 파싱하여 인증번호를 가져오면 됩니다! 간단하죠?! 의존성 추가app build.gradle 에 아래 의존성을 추가 합니다.
기능 구현먼저 적절한 플로우 시점에 Retriever API 를 starting 시켜줍니다. 저는 send 버튼을 눌렀을 때 starting 시켜주는 걸로 했습니다.
Receiver Class 를 정의하고 등록하여 줍니다.
AndroidManifest.xml 에 Receiver 를 등록하여 줍니다.
그리고 마지막으로 서버로 전송할 Hash Key를 구하여줍니다. Hash Key 를 구하는 이유는 해당 앱에 해당하는 Hash Key 를 확인하여 Retriever API 가 우리 앱 Receiver 에 이벤트를 날려주기 때문입니다. Hash Key 가 다르면 이벤트(SMS Message)를 받을 수 없습니다~!
이렇게 되면 Android Client 에서 할 작업은 끝나게 됩니다 이제 서버 쪽에서 해야 할 작업을 보겠습니다. 서버 작업은 사실 크게 할 게 없는데요 이미 SMS 를 보내는 API 가 있다면 변경이 필요한 부분은 기존의 인증번호를 보내주던 SMS 내용의 변경입니다. 단, 메시지를 Android Client가 수신하기 위해서는 몇 가지 제약조건이 있습니다. 아래 제약 조건만 지켜 SMS를 보내면 쉽게 처리할 수 있습니다.
예를 보겠습니다.
위 처럼 무조건 <#> 형식으로 시작하고 Hash Key 로 끝나는 메시지 내용이어야만 Retriever API 가 메세지를 수신할 수 있습니다. 반드시 형식을 맞춰야 합니다. 1. Android Client 에서 Receiver 를 등록하고, SMS Retriever API 를 starting 하여 줍니다. 2. 사용자의 휴대폰 번호와 함께 11자리 Hash Key 를 구하여 백엔드 쪽 문자 발송 API에 전달하여 줍니다. 3. 백엔드 API 에서는 전달 받은 Hash Key 와 함께 메시지 양식을 제약조건에 맞춰 SMS 를 발송합니다. 4. Android Client 에서는 등록한 Receiver 로 SMS Message 를 수신하게 되고 이를 파싱하여 인증번호를 가져옵니다. 이상으로 포스팅을 마치겠습니다. 감사합니다. |