TelephonyManager 이용하여 현재 접속중인 국가 확인하기

지프치프·2023년 12월 27일
0

Android

목록 보기
82/89

개요

회사에서 서비스하는 앱 중 에서 중국에서 앱이 간헐적으로 크래쉬 되는 현상이 있었다.
원인은 서버로부터 FCM 토큰을 발급받지 못하여 Exception을 뱉어낸 것이다.

중국은 인터넷 검열을 위해 국가적 차원에서 만리방화벽(GFW)이란 방화벽을 운영하는데 구글 서비스가 이 방화벽의 차단 대상이며 파이어베이스 또한 구글의 서비스 중 하나이기 때문에 차단되고 있었으며 서비스 중인 앱에는 푸시 서비스를 위해 FCM을 사용하고 있었다.

근데 국가적인 차원에서 서비스를 차단해버리니 다른 방법이 없었고 결국 중국에서만 FCM 토큰 요청 로직을 스킵하도록 수정하여 배포했다.

여기서 현재 사용자가 위치한 나라가 어디인지를 체크해야하는데 이는 매우 간단하게 체크할 수 있다.

어떻게 처리할 것인가

여러 방법이 있으며 아래와 같다.

  • 단말기 Locale 설정을 가져와서 예외처리
  • 현재 접속중인 네트워크의 국가코드를 가져와서 예외처리

첫번째 방법은 Locale 설정만 가지고 예외처리를 하기 때문에 매우 간단하게 처리가 가능하겠지만 만약 Locale이 중국으로 설정되었고 현재 사용중인 국가가 FCM 서비스가 정상적으로 사용 가능한 국가라면 FCM 서비스를 사용할 수 없게 되어비리기 때문에 심각한 사이드 이펙트가 발생할 수 있다.

두번째 방법은 현재 접속중인 네트워크의 ISO 코드를 가져오는 것인데 만약 오프라인일 경우 현재 사용중인 국가를 판단하기가 힘들다.

하지만 서비스 중인 앱은 사용하려면 로그인이 필수고 컨텐츠들을 서버로부터 가져와야하기 때문에 네트워크 연결이 필수인 만큼 두번째 방법으로 예외처리 하는 것이 가장 적절하다고 판단되어 두번째 방법으로 에외처리하여 배포하였다.

TelephonyManager로부터 iso 코드 가져오기

우선 샘플 코드는 아래와 같다.

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

        val tManager = getSystemService(TELEPHONY_SERVICE) as TelephonyManager
        tManager.networkCountryIso.also {
            Log.e(this.javaClass.simpleName, "countryCode >> $it")
            Toast.makeText(this@MainActivity, "CountryCode >> $it", Toast.LENGTH_SHORT).show()
        }
	}
]

TelephonyManagernetworkCountryIso 를 통해
접속중인 네트워크의 국가 iso코드를 가져올 수 있다.
각 국가별 iso코드는 여기에서 확인해 볼 수 있다.


앱을 실행하면 토스트 메세지로 현재 접속중인 국가의 iso 코드를 확인해볼 수 있다.

profile
지프처럼 거침없는 개발을 하고싶은 개발자

0개의 댓글