목록분류 전체보기 (199)
일모도원(日暮途遠) 개발자
챗GPT API를 쓰는 앱을 개발중에 릴리즈모드에서만 죽는 현상이 발견되었다. 에러로그가 이렇게 알아보기 힘들게 나온다. 다행히 ".NoSuchFieldException: system"라는 문구로 어디가 문제인지는 파악이 된다. E/AndroidRuntime: FATAL EXCEPTION: main Process: com.dalnimsoft.araconv, PID: 17238 java.lang.AssertionError: java.lang.NoSuchFieldException: system at f.h.g.r.k.n$j0.(:792) at f.h.g.r.k.n$w.a(:818) at f.h.g.d.k(:458) at f.h.g.r.k.i.b(:117) at f.h.g.r.k.i.e(:166) at f.h..
아래처럼 채팅창을 구현하고 있다. 원하는것은 상대방 채팅일때 약간 왼쪽으로 쏠린듯한 느낌을 주게, 시작마진은 8, 끝마진은 30으로 줬다. 근데 문제는 글자가 길어지면 아래처럼 뷰의 넓이 전체를 다 사용해버린다. 상대편의 말 풍선은 시작마진은 8dp, 끝마진을 30dp로 줬지만, 끝 마진이 먹지 않는다. android:layout_marginStart="8dp" android:layout_marginEnd="30dp" 해결하는 방법은 상대편의 말 풍선은 끝마진을 주지 말고, 대신 세로 가이드 라인을 만들어서 가이드라인에 30dp를 준다. 텍스트뷰에 있는 "android:layout_marginEnd="30dp"" 는 불필요하니 삭제하고 끝 위치 제약조건을 가이드로 준다. app:layout_constra..
OpenSubtitles.com에서 자막을 받아오는 소스를 만들고 있다. 자막을 받아왔는데, "1"이란 숫자만 보인다. 짐작에 자막이 srt포맷이라 맨처음 ID를 보여주는거 같다. 구글링 해보니 GsonConverterFactory를 쓰지 말고 ScalarsConverterFactory를 사용하라고 한다. A converter for strings and both primitives and their boxed types to text/plain bodies. 문자열이나 기본형을 텍스트형태 그대로 보여준다. interface OpenSubtitleDownloadService { @GET Call downloadFile(@Url String url); } public class OpenSubtitleApi..
UI화면을 동적으로 만드는건 여전히 어렵다. OpenSubtitle에 로그인하는 뷰를 만들고 있는데, 계정이 없으면 계정을 만들라고 안내하는 라벨을 맨위에 두었다. 문제는 이 라벨이 영어, 한국어에 따라서 줄수가 바뀌는데, 로그인 뷰의 전체 크기는 고정되어 있어서 보기에 안좋다. XIB에서의 화면이다. 영문 아래위로 공간이 좀 남는게 보인다. 기기에서 본 화면이다. 라벨의 아래위로 공백이 좀 보인다. 내가한 수정 방법은 아래와 같다. 라벨을 선택후 Add New Constraints를 선택후 높이(Height)를 선택한후 "Add 1 Constraint"를 누른다. "Show the Size Inspector"로 가서 추가한 높이의 Edit를 누른다. 20보다 크거나 같다라고 Constraint를 줬다...
앱의 타겟버전을 30에서 33으로 올리고 구글플레이어에 앱을 제출하니 아래와 같은 에러가 나온다. Your app targets Android 13 (API 33) or above. You must declare the use of advertising ID in Play Console. 구글플레이 콘솔의 앱 콘텐츠를 보면 광고ID에 에러표시가 있다. 광고ID의 시작을 누르면 아래처럼 물어본다. 애드몹 광고가 앱에 있어서 아래처럼 했다. manifest에 아래를 추가하고 build gradle에서 버전을 올린후 앱을 다시 제출하자.
다크모드는 보통 "라이트", "다크", "시스템" 3가지 메뉴를 가진다. "시스템"은 iOS의 설정에서 세팅한 다크모드값을 따른다. 앱 전체에 다크/라이트 모드를 적용하기 위해서는 앱을 열때 AppStorage에 저장된 다크/라이트모드 값을 가져와서 @main에 있는 ContentView의 .preferredColorScheme에 해당되는 ColorScheme를 넣어주면 된다. @main struct AraKoicaApp: App { //UserDefaults대신 AppStorage를 이용하여 다크/라이트모드 저장 @AppStorage("AppDarkMode") var appDarkMode: Int = UserDefaults.standard.integer(forKey: AppStorageKeys.AppD..
print()는 콘솔에 내용을 표시하고자 할때 사용한다. (릴리즈모드에서도 사용하면 속도저하가 있으므로 디버그일때만 쓰자) debugPrint()는 print()와 비슷하게 보이는데 이름을 보면 뭔가 debug할때 쓸거 같다. 실제로 보면 debugPrint는 그냥 쌍따옴표만 더 붙어있는거 같다. 이정도면 굳이 debugPrint를 쓸필요가 없어보인다. print("print") //print debugPrint("debugPrint") //"debugPrint" 하지만 API를 호출해서 결과물을 볼때는 확연하게 다르다. 아래 코드가 실행되어 response를 보고자 할때 확실히 debugPrint가 많은 정보를 보여준다. AF.request(url, method: .post, parameters: tr..
아래와 같은 경고가 보인다. 'windows' was deprecated in iOS 15.0: Use UIWindowScene.windows on a relevant window scene instead 원인은 이 코드이다. return UIApplication.shared.windows.first?.windowScene?.interfaceOrientation.isLandscape ?? false 가로 모드인지 확인하는 코드를 아래처럼 가지고 있는데 이제 경고가 난다. extension UIApplication { static var isLandscape: Bool { if AppConts.IS_MACOS { return true } else { if #available(iOS 13.0, *) { re..