곰돌푸우❤️

반응형

구글 플레이에서 별도 승인되지 않은 앱은 SMS권한을 제거하도록 변경됐습니다. SMS권한을 이용하여 메시지를 읽는 앱의 경우에는 빠르게 조치를 취해야 했습니다. 이에 따라 구글은 앱에서 SMS권한 요구없이 SMS내용을 읽을 수 있도록 하는 API를 공개했습니다. 이번 포스팅에서는 SMS Retriever API의 사용법을 알아보겠습니다.

 

SmsRetriever 적용 (Android)

class MainActivity : AppCompatActivity() {

    private lateinit var client: SmsRetrieverClient

    private var smsRetrieverReceiver: BroadcastReceiver? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

    registerSmsRetrieverReceiver()
        client = SmsRetriever.getClient(this).also {
            it.startSmsRetriever() // 준비가 되면 SMS Retriever를 시작시켜준다.
                                   // 인증코드 재전송시에 재호출해주어야 한다.
        }
    }

    override fun onDestroy() {
        unregisterSmsRetrieverReceiver()
        super.onDestroy()
    }

    private fun registerSmsRetrieverReceiver() {
        smsRetrieverReceiver = object : BroadcastReceiver() {
            override fun onReceive(context: Context, intent: Intent) {
                if (SmsRetriever.SMS_RETRIEVED_ACTION != intent.action) {
                    return
                }
                val extras = intent.extras ?: return
                val status = extras.get(SmsRetriever.EXTRA_STATUS) as? Status ?: return
                if (status.statusCode != CommonStatusCodes.SUCCESS) {
                    return
                }
                val message = extras.get(SmsRetriever.EXTRA_SMS_MESSAGE)
            }
        }
        registerReceiver(smsRetrieverReceiver, IntentFilter(SmsRetriever.SMS_RETRIEVED_ACTION))
    }

    private fun unregisterSmsRetrieverReceiver() {
        if (smsRetrieverReceiver != null) {
            unregisterReceiver(smsRetrieverReceiver)
            smsRetrieverReceiver = null
        }
    }
}

Android 클라이언트에서는 위의 코드로 준비가 끝납니다. 이제 특정 형식을 지킨 메시지가 앱에 수신되면 코드에서 message를 읽어올 수 있습니다.

 

수신 메시지 형식 (서버)

SMS Retriever API를 이용하여 메시지를 읽기 위해서 메시지 구성형식을 제한했습니다.

  1. <#> 로 시작해야 한다.

  2. 메시지 내용은 140바이트 이하여야 한다.

  3. 앱을 식별하는 11자리 해시 문자열로 끝나야 한다.
    ex)

    <#>
    인증번호는 [1234] 입니다.
    Kr12Qo0VGAq

    참고로 `[Web발신] <#>`으로 시작되는 문자는 허용되나 `[국제발신] <#>`으로 시작되는 문자는 SMS Retriever API가 동작하지 않습니다.

 

11자리 Hash 문자열 구하기

  1. 아래의 명령어로 구하여 복사해서 사용하세요. Keyalias, Keystore경로, Package명은 알맞게 수정하여 사용하세요

    > keytool -exportcert -alias AndroidDebugKey -keystore '/Users/jerome/.android/debug.keystore' | xxd -p | tr -d "[:space:]" | echo -n com.jerome.android.smsretrieverexample \`cat\` | sha256sum | tr -d "[:space:]-" | xxd -r -p | base64 | cut -c1-11
  2. 만약 bash: sha256sum: command not found 가 나타난다면 아래의 명령어로 프로그램을 설치 후 명령을 재실행해주세요.

    > brew install coreutils

 

Keystore 정보 읽어오기

Gradle -> [ProjectName] -> app -> Tasks -> android -> signingReport
위 경로의 Task를 실행하면 Variant별로 Keystore정보가 출력됩니다.

반응형

이 글을 공유합시다

facebook twitter googleplus kakaostory naver

본문과 관련 있는 내용으로 댓글을 남겨주시면 감사하겠습니다.