단순히 데이터를 읽어오는 앱이 아니라면 앱배포에 필수적인 작업이 바로 디버그용/배포용 분리이다. (왠만하면 이 작업은 프로젝트 초반에 셋팅을 해주는 것이 정신건강에 이롭다). 과정을 3줄 요약하자면 iOS 에서는 Scheme에 접근해서 나누어 줄 수 있고, AOS는 Gradle 파일을 수정해서 분리해줄 수 있다. 마지막으로 플러터 프로젝트안에서 디버그용/배포용 파일을 따로 만들어 시작점을 분리시킨다. 구체적인 진행방법은 아래와 같다. 1. iOS 디버그용/배포용 분리 1-1. ios 폴더를 눌러 XCode를 열어준다. 1-2. 상단에 플러터 아이콘을 선택하고 Edit Sceme을 누르면 위와 같은 창이 뜨는 데 엔터를 누르고 Runner를 prod(배포용)으로, 하단에 "+" 를 눌러 dev(디버깅용)..
전체보기
fatal error: module 'cloud firestore' not found 플러터 프로젝트의 배포/디버그 버전 분리를 한 뒤에 Xcode를 실행시키니 module 'cloud firestore' not found 가 나오며 런타임 에러가 발생했다. pod 인식에 무언가 문제가 생긴 것 처럼 보였다. 해결했던 방법은 아래와 같다. 먼저 플러터 프로젝트 안 iOS 폴더 터미널을 열어준다. pod cache clean --allpod deintegratesudo gem install cocoapods-deintegrate cocoapods-cleansudo arch -x86_64 gem install ffiarch -x86_64 pod repo updatearch -x86_64 pod insta..
답변 요약위젯들의 제약(Constraints)은 부모 위젯의 영향을 받아 유연하게 조정됩니다. 하지만 앱바는 기본 사이즈인 높이 56.0을 가지고 있습니다. 이러한 높이를 바꾸어줄 때 PreferredSize를 채택합니다. 앱바 뿐만 아니라 부모 위젯에 영향을 받더라도 높이나 너비 제약을 고정시키고 싶은 위젯에 PreferredSize를 사용할 수 있습니다.부가 설명Preffered Widget 이 없을 경우 앱바 기본 높이 56 고정import 'package:flutter/material.dart';void main() { runApp(MyApp());}class MyApp extends StatelessWidget { @override Widget build(BuildContext contex..
유선 이더넷 네트워크와 다르게 무선 네트워크는 치명적인 단점이 존재한다. 바로 유선과 다르게 collision detection이 안된다는 것이다. 그 이유에는 아래와 같이 3가지가 있다.Fading and Signal Strength Variations무선시그널은 거리에 매우 취약하다. 장애물이나 환경적 요인에 의해 신호 강도가 계속해서 변하기 때문이다. 따라서 거리가 멀리 떨어져있을 경우 collision을 탐지하지 못할 수 있다.Hidden Node ProblemA, B, C 3가지 디바이스가 있다고 할 때 A,B,C는 서로의 통신이 안되는 상태이다. 이때 A와 B가 동시에 C에게 데이터를 전송하면 C에서 collision이 발생하지만 a,b는 collision 이 발생했는지 알 길이 없다. 이때 ..
느낌이 안좋다. 분명히 플레이버튼에 작고귀여운 벌레가 있어야하는데 녀석이 보이지 않는다. 무엇인가 잘못되었다. Error: Dart library 'dart/ui' is not available on this platform. 슬픈 예감은 틀리지 않는다. dart extension 자체를 인식하지 못한다. 미봉책으로 터미널에 flutter run 명령어를 입력하면 실행은 되나 언제까지 이렇게 살 순 없다. 문제는 이녀석 때문이었다. 코틀린을 VSCode로 돌리기위해 Code Runner Extension을 깔았었는데 이후부터 dart extension 이 자동으로 인식이 안되고 있었다. 바로 uninstall 해주자 Code Runner를 uninstall 하면 귀여운 무당벌레가 다시 복귀한 것을 확..
Failed to build iOS appCould not build the precompiled application for the device. Error (Xcode): Target debug_unpack_ios failed: Exception: Failed to codesign /Users/i/Documents/flutter_memo/build/ios/Debug-iphoneos/Flutter.framework/Flutter with identity 0F5970B1325A2857E42BF850B01687CC2E5108A4. Error launching application on Jonghyuck’s iPhone. VSCode 에서 아이폰 실기기를 연결해서 코드를 돌려봤는데 위와 같은 에러문구와 함께..
네트워크 요청이 실패했을 때 바로 사용자에게 실패문구를 띄우는 것보다 2번더 요청해보고 사용자에게 실패문구를 띄우게 할 수 있다. 바로 retry() 연산자를 통해서이다. retry(2) 를 통해 첫번째 시도 + 2번 더요청 했음에도 실패한다면 catch() 연산자를 통해 실패 이벤트를 잡아낸다. enum SampleError: Error { case somethingWentWrong}func fetchData() -> AnyPublisher { let shouldFail = Bool.random() if shouldFail { print("Fetching data failed, will retry...") return Fail(error: SampleEr..
지난 강의까지 네트워크 레이어를 다루었다. 이번시간부터는 링크레이어를 다룬다. 여러 클라이언트가 게이트웨이 라우터에 함께 진입한다. 이때 네트워크 계층에서 패킷을 보내면 도식화된 그래프처럼 한 줄로 쭉 연결되서 가는 것이 아닌 여러 컴퓨터들이 네트워 계층에 물려 진행된다. 이때 서로 다른 클라끼리 collision이 발생하여 신호가 섞일 수 있다. Link 레이어는 클라끼리 충돌발생을 막는 역할을한다 혹은 충돌이 발생했을 때 문제를 해결한다. 이러한 일이 링크레이가 맡는 가장 주요한 일이다. 트랜스포트레이어와 네트워크레이어는 OS내부에 코드로 구현되어 있다. 링크레이어부터는 하드웨어 단으로 가는데 바로 Network Interface Card(NIC) 에 위치하고 있다. 링크레이어는 프레임을 내려보낸..
이전까지 컴바인 프레임워크를 이용하면서 해왔던 에러처리들은 모두 업스트림에서 에러를 던져주면 다운스트임에서 .sink 를 통해 받기만 하는 수동적인 방법이였다. 하지만 만약 에러를 throw하는 메서드를 sink받기전에 쓰고 sink에서 catch하고 싶다면? 혹은 OOP개념과 함께 컴바인을 쓰면서 인터페이스로부터 나온 Stream을 받을 때 보통 추상화된 에러를 받기 때문에 sink로 받기전에 구체 에러타입으로 바꿔야한다면? .tryMap 연산자를 통해 에러처리를 할 수 있다. enum APIError: Error { case networkError case dataCorrupted case invalidFormat}struct User { let id: Int let na..
백프레셔 관리는 주로 백엔드에서 하지만 Combine 프레임워크를 활용해서 iOS 단에서도 관리를 해줄 수 있다. 여기서 백프레셔란 서버로부터 날라오는 데이터 속도를, 컴바인으로 한정지으면 업스트림에서 날라오는 데이터 속도를 다운스트림의 처리속도가 따라가지 못해 발생하는 문제로 예시 상황으로는 아래와 같다.비동기 데이터 로딩iOS 앱에서 외부 API나 데이터베이스로부터 비동기적으로 대량의 데이터를 로드할 때, 네트워크 상태나 데이터베이스의 응답 속도에 따라 데이터가 너무 빨리 도착하면, 앱의 메인 스레드가 블록되거나 UI가 느려질 수 있다. 이벤트 스트리밍실시간으로 많은 양의 이벤트를 처리해야 하는 앱(예: 금융 앱에서의 주식 가격 업데이트, 스포츠 앱에서의 실시간 점수 업데이트)에서 데이터 스트림의 백..