안드로이드에서는 당연하게 릴리즈(배포)버전을 등록할 때 프로가드 규칙을 적용한다.

 

프로가드(proguard)란?

난독화를 시켜주는 것이다.

앱이 배포되고 나서 중요한 정보가 오가는 앱 내부 정보가 유출되면 안되기 때문이다.

 

 

유지보수중인 앱에서 계속해서 ClientError가 발생하였었다.

에러메시지에는 토큰을 찾을 수 없다 하였지만, 디버그 모드에서 확인시 토큰을 정상적으로 잘전달되었다

.

 

도대체 무엇이 문제인가 계속해서 보던 와중,

디버그 모드에서는 정상적으로, 릴리즈 모드에서는 안되는 것을 확인하였다.

처음엔 TargetSDK가 33, 34일 때의 문제인 줄 알았으나, 아니였다.

 

다시 한 번 카카오 문서를 들여다 보았고, 프로가드 규칙 예외처리가 있었다...

링크 : https://developers.kakao.com/docs/latest/ko/android/getting-started#project-pro-guard

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

 

# kakao
-keep class com.kakao.sdk.**.model.* { <fields>; }
-keep class * extends com.google.gson.TypeAdapter

# https://github.com/square/okhttp/pull/6792
-dontwarn org.bouncycastle.jsse.**
-dontwarn org.conscrypt.*
-dontwarn org.openjsse.**

 

 

앱이 오래되었고, 난독화가 안되어 있길래, 난독화를 적용해서 에러로그만 보이도록 예외처리 하였으나,

카카오 로그인이 암호화에 영향이 있는지는 이번 기회에 알게 되었다.

 

내가 적용하여 발생한 버그이지만..

개인적으로 억울하면서도 여러가지 감정이 느껴진다*: .。. o(≧▽≦)o .。.:*

 

 

추가로 네이버는 개발자센터에서 제공하는 것이 아닌 네이버 깃에 공유되어 있다.

링크 : https://github.com/naver/naveridlogin-sdk-android/issues/34

# naver login SDK 5.1.1
-keep public class com.nhn.android.naverlogin.** {
public protected *;
}
-keep public class com.navercorp.nid.** {
public *;
}

 

 

 

감사합니다🍺

앱을 만들게되면 '이미지'를 다루는 일은 기본입니다.

플러터에서는 제가 알기로 Image, ImageProvider 이렇게 두 가지 방식으로 이미지를 표현할 수 있는데요.

 

'Image'위젯을 사용해서 표현하는 방법을 설명하고자 합니다.

네 가지 방식을 제공합니다.

- Image.network : 인터넷을 통하여 이미지 로드

- Image.file : 파일을 통하여 이미지 로드

- Image.memory : bytes값을 통해 이미지 로드

- Image.asset : 로컬 Asset폴더를 통해 이미지 로드

 

 

화질이 높은 이미지일 수록 그 이미지를 표현하기 위해서 컴퓨터는 계산을 하게 됩니다.

계산하는 동안 화면에 아무런 표시도 되어있지 않아도 상관은 없지만,

사용자의 입장에서 고려해보면 무언가 이미지가 나올것인가? 라는 기대감과

기다릴 수 있게하는 인내심을 주지 않을까요?

 

그래서 저는 이미지가 로드되는 동안 LoadingProgressbar를 표현하려고 합니다.

 

FutureBuilder를 통해서 받은 이미지 데이터를 'Image.memory'함수에 추가하였습니다.

그리고 frameBuildererrorBuilder를 설정해주었습니다.

 

 

이미지가 로드되는 동안 프로그레스바 표시하기

위의 언급되었던 frameBuilder를 통해서 표현할 수 있습니다.

child이미지 위젯을 뜻 합니다.

 

wasSynchronouslyLoaded는 동기화가 되었는지 확인해주는 파라메터입니다.

동기화가 되었다면 바로 child(이미지 위젯)을 보여주어도 되겠지만,

이미지를 로드한다는 것은 비동기 작업이기 때문에 아마 true일 일은 많이 없을겁니다.

frame은 현재 이미지가 로드가 완료되어 객체가 되었는지를 알려주는 것 입니다.

framenull이 아니라는건 이미지가 정상적으로 로드된 것을 뜻하기 때문에 child를 return해줍니다.

 

그 이외의 상황이라면 LoadingProgressbar를 보여주면 되겠습니다.

frame == null
frame != null

 

그러면 위와 같이 frame이 null이 아닌 동안 else하위의 LoadingProgressbar가 표현되게 됩니다.

 

+ 추가로 errorBuilder는 이미지가 정상적으로 로드되지 못한 경우 실행됩니다.

그러므로 이미지가 로드되지 못한 경우 보여줄 이미지 위젯을 선언해주면 되겠습니다.

 

 

감사합니다🍊

플러터를 배우게되면 StatelessWidget, StatefulWidget 이 두 형태로 위젯을 만드는 것을 이해하게 됩니다.

저도 물론 마찬가지로 이 두 가지를 다음과 같은 상황에 따라 사용하게 됩니다.

 

StatelessWidget : 내부 로직에서 상태변화가 일어나지 않는 경우 사용

StatefulWidget : 내부 로직에서 상태변화가 일어나는 경우 사용

 

상태변화가 일어난다는 것은 'int count'라는 프로퍼티가 있고,

Text위젯을 사용해서 현재 'count'가 가지고 있는 값을 표출할 때,

'count'값이 늘어나거나 감소하는 경우 상태변화가 일어난다고 합니다.

 

이렇게 변화된 값을 표출하기 위해서는 StatefulWidget에서 제공하는 

setState 함수를 사용하여 위젯을 재빌드하고 변경된 값을 보여주게 됩니다.

 

StatelessWidget에서는 애초에 값 변화가 없는 경우 선택을 하지만,

때로는 그렇지 않은 경우도 있습니다.

 

- 앱을 보수하거나 기능을 추가가 필요한 경우

- 부모 클래스가 StatelessWidget으로 선언된 경우

- 다이얼로그에서 사용이 필요한 경우

등.. 값을 갱신해주는 것이 필요할 때가 있습니다.

 

 

좀 더 플러터에 대해서 다양한 기능을 사용해보았다면,

HeritedWidget, Selector, Consumer위젯 등을 사용해서 표현할 수 있지만,

더욱 간단한 방법을 플러터 팀에서 제공해주고 있습니다.

 

그 위젯의 이름은 바로 'StatefulBuilder' 위젯입니다.

저같은 경우 다이얼로그에서 필요하여 사용하였었습니다.

 

코드를 살펴보면 StatefulBuilder위젯의 하위에 값의 변화가 필요한 위젯을 선언해줍니다.

그리고 setState함수를 커스텀 위젯으로 전달하여 사용합니다.

 

위의 코드에서는 EditingTextController에서 이벤트가 발생할 때마다 UI가 재빌드되도록 해주었네요.

StatelessWidget에서 곧 바로 StatefulWidget으로 바꾸어도 좋지만,

더 큰 보수가 들어가거나 어쩔 수 없는 경우 StatefulBuilder를 사용하여 UI를 재빌드해주도록 합니다 !

 

감사합니다🥦

 

 

링크 : https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html

+ Recent posts