문제

Flutter run --release 나 Xcode 에서 릴리즈 모드로 실행시에도 정상 실행이 되는데 배포만 하면 스플래시 화면에서 하얀색(white, blank) 화면이 나오며 정상 작동이 안되는 경우.

 

해결 방법

나에게 적용된 해결 방법

: 파이어베이스를 사용 안하더라도 만약 애드몹을 사용하고 있다면 파이어베이스 해당 프로젝트 추가 후 설정하고난 후 flutter build ios --release 후 다시 xcode 에 들어가서 Archive 파일을 만든 후 배포

- 그냥 xcode 에 바로 들어가서 Archive 파일을 만들고 배포하는게 아닌 그 전에 flutter build ios --release 후에 하는게 중요하다.

- 애드몹과 파이어베이스의 의존성이 chatgpt나 stackoverflow에서 없다고 하는데 프로젝트가 파이어베이스에 등록되고 프로젝트에 설정을 하지 않으면 안되네요 ㅋㅋ

 

다른 해결 방법.

1. Signing & Capabilities 확인.

2. 실제 기기의 testflight 업데이트 하기.

3. testflight 에서 테스트할 앱을 삭제 후 가장 최신 버전 다운로드 하기.

4. flutter upgrade 후에 다시 배포 하기.

5. pod update 하기.

6. cocoapod 최신 버전으로 업데이트

네이버 로그인 기능을 추가하고 있는데 

프로젝트 이름/ios/Pods/naveridlogin-sdk-ios/NaverThirdPartyLogin.framework/NaverThirdPartyLogin' for architecture arm64

라는 에러가 나오면 실행 취소되었다. 여러가지 방법을 시도한 후 해결한 방법을 적어보려고 한다.

 

  1. 현재 개발하고 있는 flutter 프로젝트의 ios 폴더로 이동.
  2. Runner.xcworkspace를 Xcode로 실행.
  3. Runner, Pods 중 Pods 클릭.
  4. Build Settings -> All 클릭.
  5. Architectures의 Excluded Architecturese에 arm64를 추가하여 다시 실행해 본다.
AndroidManifest.xml

안드로이드 시스템이 앱의 코드를 실행하기 전에 확보해야하는 앱에 대한 필수 정보를 시스템에 제공하는 목록(빌드 툴, OS, 구글 플레이에 제공)

 

AndroidManifest.xml안의 내용

?xml version="1.0" encoding="utf-8"? : 이 문장은 이 파일이 XML 문서임을 선언하여 version과 인코딩 방식을 알려준다.

package='com.example'project_name' : 이 정보로 앱을 식별한다.

android:icon = '@mipmap/ic_launcher' : 전체 애플리케이션의 아이콘 및 애플리케이션의 각 구성요소의 기본 아이콘

android:lable '@string/app_name' : 전체 애플리케이션을 나타내는 즉, 사용자가 읽을 수 있는 기본 라벨

activity : 앱에 액티비티 컴포넌트를 등록하기 위한 태그.

intent-filter : 다른 앱에서 본인앱으로 접근하거나, 본인 앱에서 다른 앱으로 접근하기 위한 필터.

action : 인텐트 필터에 작업을 추가하는 태그. 인텐트 필터에 action 태그가 없으면 필터가 intent 객체를 허용하지 않는다.

category : 인텐트 필터에 카테코리 이름을 추가한다.

data : 데이터 사양을 인텐트 필터에 추가한다.

'개념' 카테고리의 다른 글

RESTFUL(restful)(RESTful) API가 무엇일까?  (0) 2022.06.17
Oracle(오라클)과 MySQL 문법 비교  (0) 2022.06.17
Proguard(프로가드)란?  (0) 2022.06.17
Gradle(그래들)이란 무엇일까?  (0) 2022.06.17
CDN이란?  (0) 2022.06.17

Flutter

플러터(Flutter)란 무엇인가?

단일 코드베이스로 모바일(Android, IOS) 개발, 웹 개발, 데스크탑 개발, 임베디드 개발등이 가능한 크로스 플랫폼이다.

Google에서 개발하고 있는 장차 Fuchsia OS 위에서 UI / UX를 담당하게 될  오픈소스 프레임워크이다.

구글에 맞춘 Meterial 디자인과 애플에 맞춘 Cupertino 디자인도 가능하다.

 

왜 크로스 플랫폼을 선택해야하는가?

사용하기에 앞서 각 플랫폼별 native 언어가 있는데 불구하고 크로스 플랫폼을 선택을 왜 하는지에 의문이 있을 것이다.

 

ex) 현재 native 개발자인데 크로스 플랫폼을 사용해도 생산성 차이가 없을 것 같다 등

답 : NAVER 지식IN 개발 후기를 보면 알 수 있듯이 기존 native 개발과 크로스 플랫폼으로 따로 같은 개발을 해봤을 시 생산성이 3~5배로 차이가 날 정도로 좋다. 물론 개인마다 차이가 있겠지만 최소 1.5배 ~ 2배 차이가 나면서 멀티 플랫폼 개발을 한번에 하는게 압도적인 생산성 차이가 난다고 생각한다.

 

ex) 크로스 플랫폼으로 개발을 해도 결국 native로 변경해야하는 것 아닌가? 등

답 : Computing이나 민감한 디바이스의 특정 기능을 요구하는 것이 아니므로 반드시 native가 필수일 필요는 없다. 즉, 처음 모바일 설계를 할 시 구분을 하고 넘어가야한다 대부분의 모바일 앱은 Computing이나 민감한 디바이스의 특정 기능을 요구하지 않으며 사용한다고 하면 크로스 플랫폼을 선택하지 않는게 맞기 때문이다.

 

ex) native에서 되는게 크로스 플랫폼에서 개발 안되는 것 아닌가? 등

답 : 현재 대부분의 기능을 플러그인을 통해 구현이 되어있으며 점차 더 개발될 것이기 때문에 걱정할 필요는 없다고 생각한다.

 

플러터(Fluter) vs 리액티브 네이티브(Reactive Native) 비교

플러터(Flutter)

장점

- 리액티브 네이티브(Reactive Native)처럼 Bridge를 거치지 않고 각 플랫폼에 맞는 native 언어로 컴파일된 후바로 Skia엔진을 통해  canvas에 렌더링하기 때문에 각 플랫폼의 native 언어와 비슷한 수준의 성능을 보여준다.

- 리액티브 네이티브(Reactive Native)의 인기를 쉽게 따라잡았으며 인기의 추세가 더 크다.

 

단점

- 리액티브 네이티브(Reactive Native)보다 구직하기 어렵다. (채용사이트 구인 게시글 수를 비교하였을 때)

 

리액티브 네이티브(Reactive Native)

장점

- 기존 React 개발자이면 빠르게 학습하여 모바일 개발이 가능하다.

- 플러터(Flutter)보다 구직하기가 더 쉽다. (채용사이트 구인 게시글 수를 비교하였을 때)

 

단점

- Bridge를 사용하여 플러터(Flutter)보다 렌더링 성능이 떨어진다.

 

개발 특징

1. Hot Reload(핫 리로드) : 모바일 앱이 실행되고 있는 상태에서, 앱의 상태를 유지한 채로 변경사항을 적용시켜 주어 빠른 개발을 할 수 있다.

 

2. Hot Restrat(핫 리스타트) : 모바일 앱이 실행되고 있는 상태에서, 변경사항을 적용시켜준다. 단, 앱의 상태는 초기화 된다. Hot Reload(핫 리로드)보다는 시간이 조금 더 걸리지만, 앱을 재실행하는 것보다는 훨씬 빠르게 변경사항을 확인할 수 있다.

 

기존 Native의 명령형 스타일 -> 선언형 스타일로 하게 되어 개발하기 더 쉽다.

// 명령형 스타일
b.setColor(red)
b.clearChildren()
ViewC c3 = new ViewC(...)
b.add(c3)
// 선언형 스타일
return ViewB(
  color: red,
  child: ViewC(...),
)

 

플러터(Flutter)로 만들어진 기업 어플리케이션
  • 네이버 지식IN
  • GS SHOP
  • Google AdSense, Google Assistant, Google Pay
  • BMW
  • Toyota
  • Alibaba
  • Tencent

ios simulator를 이용하여 애플 관련 개발을 진행할 경우 위의 제목과 같이 로그인을 진행 했음에도 불구하고 경고창이 나오면서

 

더 이상 진행이 되지 않는 경우가 있다 이럴 경우 icloud.com에 들어가 개발을 진행할 계정으로 로그인 후 사용자 약관 동의 후 

 

ios simulator에서 setting으로 들어가 로그인 후 다시 개발하고자 하는 어플에 들어가 진행하면 된다.

Proguard

소스 코드 난독화 및 앱의 용량을 줄여주는(필요하지 않는 멀티덱스를 제거) 프로그램이다. 소스 코드가 노출되면 안 되는 앱이나, 용량이 큰 앱에 적용하는데에 사용한다. GPL 라이센스를 갖고 있으며 어떠한 제약 조건 없이 사용할 수 있는게 특징이다.

 

멀티덱스

안드로이드 앱을 구성하는 코드는 컴파일 되어 덱스(dex) 파일로 만들어지는데 하나의 덱스(dex) 파일에는 최대 65536개의 메소드만 참조 가능하다. 만약 프로젝트의 코드가 65536개의 메소드를 초과하게 되면 덱스(dex) 파일이 여러개가 생성된다.

 그러면 멀티 덱스를 사용하여 컴파일 가능하지만, 빌드 과정에서 앱 내의 파일을 여러개의 덱스(dex)파일로 나누어야 하므로 빌드 속도가 느려지고 APK 파일의 용량이 커지게 되므로 프로가드를 통해 최적화 시켜주는게 좋다.

Gradle이란?

Gradle은 그루비(Groovy)를 기반으로 한 빌드 도구이다. Ant와 Maven과 같은 이전 세대 빌드 도구들의 단점을 보완하고 장점을 취합하여 만든 오픈소스 빌드 도구이다.

 

Ant
  • XML 기반으로 빌드 스크립트를 작성한다.
  • 간단하고 사용하기 쉽다.
  • 유연하지만 프로젝트가 커지는 경우 스크립트 관리나 빌드 과정이 복잡해진다.
  • 생명주기를 갖지 않아 각각의 결과물에 대한 의존관계 등을 정의해야 한다.
Maven
  • XML 기반으로 작성한다.
  • 생명주기와 프로젝트 객체 모델이란 개념을 사용한다.
  • pom.xml에 필요한 라이브러리를 작성하면 자동으로 해당 프로젝트로 불러와 편리하다.
  • 학습 장벽이 높다.
  • 라이브러리가 서로 의존하는 경우 복잡해진다.
Gradle
  • 의존성 관리를 위한 다양한 방법을 제공한다.
  • 빌드 스크립트를 XML 언어가 아닌 JVM에 동작하는 스크립트 언어 '그루비(Groovy) 기반의 DSL(Domain Specific Language)를  사용한다.
  • 그루비(Groovy)는 자바 문법과 유사하여 쉽게 배울 수 있으며 Gradle Wrapper를 이용하면 Gradle이 설치되지 않은 시스템에서도 프로젝트를 빌드할 수 있다.
  • Maven의 pom.xml을 Gradle 용으로 변환 가능하며 Maven의 중앙 저장소도 지원하기 때문에 라이브러리를 모두 그대로 가져다 사용 가능하다.
Gradle 기본 구조
디렉토리 / 파일 설명
/.gradle
/gradle
gradle 버전별 엔진 및 설정 파일
/.idea 에디터 관련 파일들
/gradlew Unix용 실행 스크립트
/gradlew.bat Windows용 실행 스크립트
/settings.gradle 빌드할 프로젝트 정보 설정
wrapper/gradle-wrapper.jar Wrapper파일
wrapper/gradle-wrapper.properties Gradle Wrapper 설정 파일
/build.gradle 프로젝트 빌드에 대한 모든 기능 정의

 

Gradle Build Lifecycle
  1. 초기화 (Initialization) : 빌드 대상 프로젝트를 결정하고 각각에 대한 프로젝트 객체를 생성. settings.gradle 파일에서 프로젝트를 구성한다. (멀티프로젝트, 싱글프로젝트 구분)
  2. 구성 (Configuration) : 빌드 대상이 되는 모든 프로젝트의 빌드 스크립트를 실행한다. (프로젝트 객체 구성)
  3. 실행 (Execution) : 구성 단계에서 생성하고 설정된 프로젝트의 태스크 중에 실행 대상 결정. gradle 명령행에서 지정한 태스크 이름 인자와 현재 디렉토리를 기반으로 태스크를 결정하여 선택된 태스크들을 실행.
Build 설정파일
  • build.gradle : 빌드에 대한 모든 기능을 정의
  • settings.gradle : 프로젝트 구성을 설정 (싱글프로젝트의 경우 생략이 가능하다)(Gradle은 멀티프로젝트를 구성하여 프로젝트간의 의존성 및 서브프로젝트를 구성할 수 있다)

'개념' 카테고리의 다른 글

RESTFUL(restful)(RESTful) API가 무엇일까?  (0) 2022.06.17
Oracle(오라클)과 MySQL 문법 비교  (0) 2022.06.17
AndroidManifest.xml(안드로이드매니페스트)이란?  (0) 2022.06.17
Proguard(프로가드)란?  (0) 2022.06.17
CDN이란?  (0) 2022.06.17

+ Recent posts