2월, 2023의 게시물 표시

모바일 앱 개발 언어 선정할때 검토사항

모바일 앱을 개발할 때 언어를 선택해야 하는 경우가 많습니다. 일단 저는 아이폰 개발을 시작으로 안드로이드로 확장된 경험을 가지고 있습니다. 아이폰은 Objective-C 부터 Swift 그리고 SwiftUI 까지 개발한 경험을 가지고 있습니다. 안드로이드는 Java 부터 Kotlin 그리고 Jetpack Compose 까지 개발한 경험을 가지고 있습니다. 아이폰으로 먼저 화면과 기능을 구현한 다음 안드로이드를 구현하는 방식으로 개발했습니다. 왜냐하면 아이폰이 저에게는 더 익숙한 환경이었거든요. 아무래도 조건이 더 까다로워서 이것부터 맞춘 다음 안드로이드 하면 더 쉬운 느낌이었으니까요. 이런 작업을 하다 보면 같은 작업을 반복한다는 생각이 많이 듭니다. 개발 도중 현타도 많이 옵니다. 이게 뭐하는 건지....., 그래서 시도한 방법은 KMM(Kotlin Multiplatform Mobile) 적용이었습니다. 이것도 굉장한 물건입니다. 공통 모듈로 뺄 수 있는 부분이 내부 데이터베이스와 API 호출 하는 모듈을 작성하였습니다. 이것만 되어도 굉장한 코딩 중복이 사라집니다. 큰 앱은 이방법을 사용하시면 됩니다. 각 디바이스 마다 적용해야 할 제약이 크다면 이정도만 해도 굉장한 중복제거 효과를 볼 수 있습니다. 만약 좀 더 나아가서 기획 쪽까지 틀 수 있는 정도면 Flutter 를 추천합니다. 저도 사실 예전에 Flutter 시도를 했었다 실패한 경험이 있습니다. 아직도 camera 부분이나 machine learning 부분 등이 버전이 1.0대가 아니어서 많이 느리지만 그래도 구현은 됩니다. Flutter 로 개발하면서 느낀 점은 아이폰과 안드로이드 설정은 똑같이 해야 한다는 점입니다. 그래들과 info.plist 등 설정이 필요합니다.

가비아 DNS 서비스 장애

이미지
  가비아 DNS 사용하고 있는데요. 서버 기록을 보니 저는 09:20이 마지막 접속 기록이네요. 다행이 복구는 되었습니다. 너무 오래 중단 되었는데 모바일 앱의 서비스를 여기에 연결 시켰는데... 다른 곳으로 이관을 검토해야 하나...,

Flutter 에서 카메라로 찍은 이미지 사진첩에 저장하고 가져오는 방법

이미지
Flutter 에서 카메라로 사진을 찍고 저장해서 가져올때 getApplicationDocumentDirectory 의 위치가 실행때마다 달라진다. 내가 찾은 방법은 이렇다. 사진을 Photo Library 에 저장하고 가져와서 사용하면 된다. 일단 저장하는 방법은 이렇다. 이제 가져올때 이런 방법으로 가져온다. 앨범을 가져오고 앨범의 이미지들을 리스트에 넣고 거기서 ID 값을 비교하면 된다. 이미지 표출은 이런 방식으로 한다. 테스트 해보니 잘된다.

Flutter 로 iOS 에 저장된 getApplicationDocumentDirectory 위치가 달라짐

Flutter 에서 iOS 기기의 앱 도큐먼트에 사진을 저장하고 있다. 이 사진 파일의 패스와 이름을 내부 데이터베이스에 저장하여  필요할 때마다 불러와서 사용하고 있다. 갱신이 필요하여 소스를 수정 하였는데 이전에 저장한 이미지가 전부 오류났다. 확인해보니 패스가 달라진 것이다. 이전에 저장한 패스는  /var/mobile/Containers/Data/Application/89AB9292-2F1F-4B9C-8EC7-2A45E08DBC2D/Documents 소스 수정 후 불러온 패스는 /var/mobile/Containers/Data/Application/76D29B57-B94C-4281-B948-677590233200/Documents 찾아보니 Bundle ID 같으면 패스가 같다고 하는데 다르게 나온다. 아무래도 다른 방법을 찾아야 할 거 같다.

chatGPT 를 활용하여 Flutter 에서 Animated Button 작성하는 방법

이미지
chatGPT 에서 아래와 같이 질문을 해보았다. 예제 코드가 위와 같이 나오면서 한글로 설명도 나옵니다. 코드의 품질도 우수합니다. class AnimatedButton extends StatefulWidget {   final String buttonText;   AnimatedButton({this.buttonText});   @override   _AnimatedButtonState createState() => _AnimatedButtonState(); } class _AnimatedButtonState extends State<AnimatedButton> {   double _buttonSize = 150.0;   @override   Widget build(BuildContext context) {     return GestureDetector(       onTap: () {         setState(() {           _buttonSize = 200.0;         });       },       child: AnimatedContainer(         duration: Duration(milliseconds: 300),         width: _buttonSize,         height: _buttonSize,         decoration: BoxDecoration(           color: Colors.blue,           borderRadius: BorderRadius.circular(20.0),         ),         child: Center(           child: Text(             widget.buttonText,             style: TextStyle(color: Colors.white),           ),         ),       ),     );   } } 구글 검색에서 찾은 코드와 비교해도 손색이 없을 정도