곰돌푸우❤️

목차

    구글 플레이에서 별도 승인되지 않은 앱은 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