- 자사 앱 플레이스토어 이동 링크를 웹뷰에서 클릭했는데 다음과 같은 화면이 나왔다.- 웹뷰가 intent:// 스킴을 이해하지 못해서 발생하는 문제다.- 안드로이드 WebView는 http://, https://는 기본 지원하지만, intent:// 같은 커스텀 스킴은 직접 처리해줘야 한다. - 웹뷰 클라이언트를 다음과 같이 수정해 주면 된다. URI_INTENT_SCHEME를 사용해서 대응해 주던지 아니면 외부로 플레이스토어를 열어주던지의 결정이 필요하다.webView.webViewClient = object : WebViewClient() { override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Bo..
- 개념적인 것들을 정리하는 것과 별개로 그날 하루 '개발자 활동'에 대해 무지성으로 기록하는 Dev Diary임1. 앱 데이터 복원 문제- 언제부턴가 앱을 재설치하는데, 사용자 prefs 데이터가 자동으로 복원됨 - 그로 인해 자동으로 로그인까지 진행해 버리는데, token 부분은 데이터가 존재하지 않아 계속 유저 인증 오류 발생android:allowBackup="true"- 안드로이드 자동 백업 옵션을 켜두면 구글 드라이브 기반으로 사용자 설정에 따라 앱 데이터를 복원하는데 이것이 영향을 주는 것으로 판단 - 그러나 우리 서비스는 따로 복원하고픈 prefs.xml 파일을 지정하고 있었다. 그런데도 발생.. - 추가로 확인해 보니 앱에서 사용 중인 어떤 라이브러리들이 백업 기능에 영향을 주고 있었고..
- 앱 링크로 인증이 완료된 후, 다시 크롬 커스텀 탭을 실행한 화면으로부터 웹 서버에서 반환한 데이터를 가져오고 싶다면 - 먼저 Manifest에서 해당 activity 태그에 아래 코드를 추가해 준다.android:launchMode="singleTop"- Activity launch mode가 기본값(standard)이거나, 이미 앱이 백그라운드에 있어서 새로운 인텐트가 기존 액티비티로 전달되기 때문에 이전 화면이 보이는 문제가 있었다. - 그리고 크롬 커스텀 탭을 열어줬던 Activity에서는 onNewIntent()로 필요한 처리를 진행한다.override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) handleRedire..
- 앱 링크는 Android에서 특정 URL을 클릭했을 때 웹 브라우저가 아니라 앱으로 바로 연결되도록 하는 기술이다. - 앱에서 Manifest에 Intent Filter 설정뿐만 아니라 웹 서버에서도 인증을 위해 앱의 패키지명과 서명을 포함한 json 파일 등록이 요구된다. - 먼저 앱에서는 아래와 같이 구성해볼 수 있다. - autoVerify=ture 속성을 Intent filter에 넣어주게 되면 생성된 App Link URL 도메인으로 이동하여 데이터 에셋 파일을 검색한다. - 카테고리 태그 및 스키마와 host, path를 지정하는 것에 주의하자. path는 포함 개념으로 pathPrefix를 사용했다. - 웹 서버에서 파..
- 코틀린에서 코루틴은 CoroutineContext라는 실행 맥락 안에서 동작한다. - Context는 여러 요소(Job, Dispatcher 등)를 포함하고 있으며, 그중에서도 Dispatcher는 코루틴이 어떤 스레드에서 실행될지를 결정하는 중요한 역할을 한다. - 먼저, 코루틴의 Dispatcher에는 다음과 같은 종류가 있다.Dispatchers.Main설명: 안드로이드 메인(UI) 스레드에서 실행.용도: UI 업데이트, Toast, View 조작, LiveData/StateFlow 수집 등.주의: 긴 연산이나 I/O를 여기서 하면 ANR 발생 가능.CoroutineScope(Dispatchers.Main).launch { textView.text = "UI 업데이트" }2️⃣ Dispatche..
- ImageView에 바로 Shadow(elevation)을 적용할 수는 없는 것으로 보이고, CardView에 ImageView를 add 해서 구현해야 했다.val cardLp = FrameLayout.LayoutParams( FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT, Gravity.CENTER).apply { val m = (8 * resources.displayMetrics.density).toInt() setMargins(m, m, m, m)}val card = CardView(this@AddOnActivity).apply { layoutParams = cardLp ..
- 사용자가 저장할 수 있는 데이터는 일정 MAX Line을 지정해두지 않는 이상 무한하게 늘어날 수밖에 없다. - 결국 어느 순간부터는 백엔드로부터 데이터를 내려받는 시간이 길어질 것이고, 타임아웃과 사용자의 불편함을 초래할 수 있다. - 캘린더나 메모 서비스를 관리하면서 항상 이런 생각을 많이 했는데, 결국 데이터 뭉치를 어떻게 분할해서 백엔드에 요청을 해야 할지에 대해 많이 고민한 것 같다. - 기본적으로는 단순하게 개수를 기준으로 나눌 수 있다. - 쿼리 스트링 구성할 때도 보통 아래와 같은 제한점이 있는데, 앱에서도 이를 고려하여 매번 100~개씩 잘라서 내려주기를 요청하는 것이다.GET: URL에 쿼리스트링으로 데이터를 담음예: https://example.com/api?ids=1,2,3,....
- WebView란? 안드로이드 앱 안에 내장된 브라우저라고 생각하면 된다. 즉, 앱 안에서 웹페이지(HTML, CSS, JavaScript)를 렌더링 하고 실행할 수 있는 View - 웹사이트를 보여줄 수도 있고, 앱 내부 기능과 연결된 하이브리드 앱 개발에도 자주 사용된다. - 안드로이드에서 애플 로그인 등. 웹뷰로 url에 접근하여 결과를 받아오는 방식이 필요할 때가 있다. - 이 글에서는 url을 웹뷰로 열고, 어떻게 그 안에서 결과 콜백을 받아오는지 확인해본다. 필자는 다이얼로그로 웹뷰를 보여주고자 한다. - 웹뷰의 데이터 전달 방식은 대략 다음과 같다. - 먼저 WebView 자체를 다이얼로그에 ContentView Set한다.) : Dialog(context) { private late..
- 서버로부터 buttonText라는 문자열을 받아 아래와 같은 안드로이드 기본 Button 컴포넌트에 입력해 주었다. - 그런데 BUTTONTEXT라고 모두 대문자 처리되어 보이고 있다. - 원인은 TextView(Button 상속) 속성 중 textAllCaps 때문이다. - 안드로이드 초창기에는 버튼의 영문을 모두 대문자로 표시하는 것이 디자인 가이드 원칙이었다고 한다. 아마 버튼에 대한 강조성 때문인 듯 - 어쨌든 textAllCaps가 항상 true로 되어있기 때문에 이 값을 false로 바꿔주면 된다.confirmBtn.isAllCaps = falseconfirmBtn.text = data.buttonText
- 먼저 MSAL에 대한 프로젝트 구성이 필요하다. 생성된 client ID, redirect_uri를 앱 개발자가 알고 있어야 한다.https://learn.microsoft.com/ko-kr/azure/active-directory-b2c/enable-authentication-android-app?tabs=kotlin Android 앱에서 인증 사용 - Azure AD B2CAzure Active Directory B2C 구성 요소를 사용하여 Android 애플리케이션에서 인증을 사용하도록 설정합니다. Azure AD B2C를 사용하여 Android 애플리케이션에서 사용자를 로그인하고 등록하는 방법을 알아봅learn.microsoft.com - 앱의 raw 폴더에 auth_config json 파일..