5월, 2024의 게시물 표시

Android 루팅(Rooting) 여부 체크

RootBeer의 간단한 버전으로 루팅여부를 체크해보자. class RootChecker(private val context: Context) { private val rootFiles = arrayOf( "/system/app/Superuser.apk", "/sbin/su", "/system/bin/su", "/system/xbin/su", "/system/usr/we-need-root/", "/data/local/xbin/su", "/data/local/bin/su", "/system/sd/xbin/su", "/system/bin/failsafe/su", "/data/local/su", "/su/bin/su", "/su/bin", "/system/xbin/daemonsu" ) private val rootPackages = arrayOf( "com.devadvance.rootcloak", "com.devadvance.rootcloakplus", "com.koushikdutta.superuser", "com.thirdparty.superuser", "eu.chainfire.supersu", "de.robv.android.xposed.installer", "com.saurik.substrate",

Android Webview ERR_CACHE_MISS 오류

Android 웹뷰(WebView)를 사용할때 net::ERR_CACHE_MISS 가 나타나는 경우가 있다. 해당 에러는 캐시를 정상적으로 사용할 수 없는 경우에 나타나는 에러이다. 보통은 다음과 같은 코드 추가로 해결이 가능하다. menifest.xml 에 네트워크 접속권한 추가 <!-- 네트워크 접속 권한 --> <uses-permission android:name="android.permission.INTERNET"/> 위와 같은 방법으로도 해결이 안되는 경우들도 있는 것 같아 다음의 내용을 기술해 본다. HTML, 웹서버에서 캐쉬 관련 부분으로 해결이 가능하기도 하다. 1. HTML 인 경우 <META http-equiv=”Expires” content=”-1″> <META http-equiv=”Pragma” content=”no-cache”> <META http-equiv=”Cache-Control” content=”No-Cache”> 2. ASP인 경우 <%      Response.Expires = 0      Response.AddHeader “Pragma”,”no-cache”      Response.AddHeader “Cache-Control”,”no-cache,must-revalidate” %> 3. JSP인 경우 <%      response.setHeader(“Cache-Control”,”no-store”);      response.setHeader(“Pragma”,”no-cache”);      response.setDateHeader(“Expires”,0);      if (request.getProtocol().equals(“HTTP/1.1”))           response.setHeader(“Cache-Control”, “no-cache”); %> 3. PHP인 경우 <?      head

Jetpack Compose WebView 사용 이슈정리

Android webview 를 구현함에 있어서 기존 방식( as-is)과 compose 에서 webview 사용방식(to-be)의 차이점 위주로 내용을 정리해봤습니다. (2024–01–12) Accompanist Webview 같은 경우 Deprecated 되었습니다. Deprecated 된 이유는  별도의 커스텀이 필요하지 않다면, Accompanist Webview를 그대로 사용해도 좋지만, 그게 아니라면 fork하거나 생성해서 사용해야합니다. https://medium.com/androiddevelopers/an-update-on-jetpack-compose-accompanist-libraries-august-2023-ac4cbbf059f1 의존성 추가 Compose 용 WebView를 구현하기 위해선 아래 라이브러리 추가가 필요합니다. (app/build.gradle) 작성 당시 0.24.13-rc가 최신이었으나 계속 업데이트 되고 있기 때문에 최신버전을 권장드립니다. dependencies {      implementation "com.google.accompanist:accompanist-webview:0.24.13-rc"  } WebView 비교해보기 - 기존 loadUrl 대체 //as-is binding.webview.loadUrl("www.naver.com") //to-be val webViewState = rememberWebViewState ( url = "www.naver.com", additionalHttpHeaders = emptyMap () ) WebView(state = webViewState) webViewState 안에서 url과 additionalHttpHeaders를 추가해 줄 수 있는데, 로드하고자 하는 Url과 HttpHeaders(AccessToken 등) 또한 설정할 수 있습니다. - 기존 WebClient, Chro

Android 13 Notification Permission 알림권한허용

Android 12 까지는 앱에서 별도의 권한을 받지 않고 Notification 을 띄울 수 있었다. (활성화 상태가 디폴트값) 앱 설정에서 Notification 알림 활성을 통해 Notification 권한을 조정할수 있었다. 하지만, Android 13 부터는 Notificatioin 권한이 기본적으로 비활성 상태이며 유저가 권한을 허용해주어야만 활성화 상태가 된다. AndroidManifest 에서 Notificatioin 권한을 요청할 수 있다.  Target SDK API 33 이상에서만 권한 수가가 가능하며, 그 이후는 기존 안드로이드 권한 요청과 동일하다. <manifest ...> <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/> <application ...> ... </application> </manifest> Target SDK 33인 앱이 Android 12 이하의 디바이스에 설치된다면? 기존 안드로이드 OS에서는 따로 알림 관련된 권한 요청이 없었다. POST_NOTIFICATIONS 해당 권한 요청을 아무리 보내도 권한 알림 팝업은 노출되지 않는다. 알림 권한은 기존과 동일하게 설정에 들어가서 활성화/비활성화를 진행하며 기본 앱 진입 시 무조건 활성화 상태로 진입되게 된다. Target SDK 32인 앱이 Android 13 이상의 디바이스에 설치된다면? Android 13 부터는 Notification 권한이 존재한다. 그러나 Target SDK 33 이상부터 알림 관련 퍼미션을 정의할 수 있다. (android.permission.POST_NOTIFICATIONS) notificationChannel을 등록할 때 자동으로 알림 권한 팝업이 노출된다 POST_NOTIFICATIONS (Notification Permission) 은 Target

Android WebView WebViewClient (웹뷰에서 일어나는 요청, 상태, 에러 등 다양한 상황) 재정의 사용

 WebViewClient를 통해 웹뷰에서 일어나는 요청, 상태, 에러 등 다양한 상황에서의 콜백을 조작할 수 있습니다.  다양한 메소드를 제공하고 있습니다만 대표적으로 사용되는 몇 가지 메소드만 살펴보도록 하겠습니다.  전체 메소드에 대해서는 developer 사이트 에서 확인하실 수 있습니다. 1. shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?) - 현재 웹뷰에 로드될 URL에 대한 컨트롤을 할 수 있는 메소드 2. onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) - page loading을 시작했을 때 호출되는 콜백 메소드 3. onPageFinished(view: WebView?, url: String?) - page loading을 끝냈을 때 호출되는 콜백 메소드 4. onReceivedError(view: WebView?, request: WebResourceRequest?, error: WebResourceError?) - request 에 대해 에러가 발생했을 때 호출되는 콜백 메소드. error 변수에 에러에 대한 정보가 담겨져있음 5. onReceivedHttpError(view: WebView?, request: WebResourceRequest?, errorResponse: WebResourceResponse?) - 웹서버의 http 에러 발생시 호출되는 콜백 메서드 6. onReceivedSslError(view: WebView?, handler: SslErrorHandler?, error: SslError?) - 웹뷰 SSL 오류관련 핸들러 콜백 메소드 override fun onReceivedError(view: WebView, request: WebResourceRequest, error: WebResourceError) { super.onReceivedError(view, req

Android WebView 타임아웃(TimeOut) 기능

Android WebView는 페이지 관련해서 타이아웃 설정이 없다 상황에 따라 bad network 상황시 WebViewClient에 타이아웃 관련 기능을 통해 사용자에게 네트워크 장애표시를 해야할 필요가 있었다. 다음의 동작으로 간략한 webview에 타임아웃 기능을 구현해 보았다. mWebView.setWebViewClient(new WebViewClient() { private val loadingTimeOut = 1000 * 10 private var timeout = false //페이지 타임아웃 타이머 private val pageTimeoutTimer: CountDownTimer = object : CountDownTimer(loadingTimeOut.toLong(), 1000) { override fun onTick(millisUntilFinished: Long) { } override fun onFinish() { Log.d("pageTimeoutTimer onFinish") if (timeout) { //네트워크 장애관련 페이지 노출 Log.d("onPageStarted networkFailActivityForError") } pageFinishDone() } } //페이지 완료 처리 private fun pageFinishDone() { pageTimeoutTimer.cancel() timeout = false dismissLoading() } override fun onPageStarted(view: WebView?, url: String?, favicon: Bi