반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리


반응형
Posted on . Written by


지난 몇달간 저희들은 자잘한 여러 이슈들과 소위 보이지 않는 특정 문제들을 해결하는데 Corona daily builds 에 적용하는데 포커스를 뒀었습니다. 그것들은 짧은 시간안에 해결할만해 보이지 않는 그런 이슈들이었습니다. 동시에 이 플랫폼을 제대로 유지하기 위해서는 필수적으로 해결해야 할 이슈들이었죠.

그런 보이지 않는 이슈들 중에는 안드로이드 퍼미션 특히 default 퍼미션들과 관련 된 것들이 있었습니다. 이전에 저희들은 몇가지 퍼미션들을 디폴트 퍼미션으로 사용했었습니다.


  • INTERNET
  • READ_PHONE_STATE
  • ACCESS_NETWORK_STATE


한편으로는 그 앱에 필요하지 않은 퍼미션을 적용하게 될 수도 있었고 많은 앱 스토어에서 그런 경우 페널티를 매기기도 했었습니다.


이 문제를 해결하기 위해 이 디폴트들을 없애버리고 싶었습니다. 사실 더 정확하게 얘기하자면은 잠시동안 없애 버리고 싶었죠. 그런데 이 문제를 좀 더 깊게 들여다 보니 이 작업을 제대로 못하면 큰 문제가 발생할 수도 있겠더라구요.



우선 저희들이 이 문제를 잘 해결했다는 것을 알려드리며 이 기능은 daily build 1030 서부터 포함 됐다는 것을 참고하시기 바랍니다.
이제 디폴트 퍼미션들은 없습니다.


이제 naive (나이브) 하게 코딩하시면 됩니다. 즉 필요한 퍼미션만 추가하시면 됩니다. 그런데 여기에는 심각한 단점이 있습니다. 예를 들어 여러분 앱이 wep API call 을 사용하는데 INTERNET 퍼미션이 세팅되지 않았다면 crash 가 일어날 겁니다. 그리고 여러분은 그 원인을 찾기가 쉽지 않을 겁니다.



이런 문제를 코로나 식으로 해결하도록 했습니다. 해결할 수 있는 방법을 API 를 통해 제공합니다. 퍼미션이 바뀔 떄 어떤 API 가 영향을 받는지 보실 수 있습니다.

여러분이 API 를 사용하는데 퍼미션을 세팅하는 걸 깜빡하셨다면 OS 가 앱을 kill 하기 전에 코로나에서 그 exception 을 가로 채게 됩니다. 그리고 alert 창을 띄우죠. 아래 그림처럼요.




이 alert 창에서는 어떤 퍼미션이 missing 됐는지 알려드립니다. 이렇게 하면 이 에러의 원인이 무엇인지 여러분에게 정확하게 알려드릴 수 있겠죠? 그러면 에러를 디버깅하고 fix 하는데 훨씬 더 쉬운 환경이 될 겁니다.


일단 그 전에 처음 퍼미션을 줄 때 신경을 쓰셔야겠죠. build.settings 에 퍼미션을 세팅할 때 이 앱에서 필요한 모든 퍼미션을 잘 세팅해 주셔야 합니다. 만약 여러분이 어떤 3rd party services 를 사용한다면 암시적으로 퍼미션을 시용하는 경우도 있을 겁니다. 그런 경우 build.settings 에 모두 세팅해 주셔야 합니다.


예를 들어 web API call 을 사용하신다면 INTERNET 퍼미션을 아래와 같이 세팅하실 수 있습니다.


settings =
{
    android =
    {
        usesPermissions =
        {
            "android.permission.INTERNET",
        },
    },
}

모든 샘플 코드에 있는 build.settings 파일들을 이에 맞게 모두 업데이트 했습니다. 그리고 daily build API documentation도 업데이트 했구요.
아래 나오는 events, libraries, library functions, and object methods 들이 이 영향을 받습니다.


  • heading events
  • location events
  • ads library
  • analytics library
  • display.capture()
  • display.captureBounds()
  • display.captureScreen()
  • facebook library
  • gameNetwork library
  • media.newRecording()
  • media.playVideo()
  • media.save()
  • media.show()
  • native.newMapView()
  • native.newWebView()
  • native.showWebPopup()
  • network.download()
  • network.request()
  • socket library
  • store.init()
  • system.getInfo()
  • system.scheduleNotification()
  • system.vibrate()
  • mapView:getUserLocation()
  • mapView.isLocationVisible()
  • recording:startRecording()
  • webView:request()


반응형