개발할 때 제 폰에선 되는데 왜 유저폰에선 안되는 것이죠?
라는 질문을 초보들이 맨날 합니다.
대부분 발행하기 전에 null check를 안해서 그렇습니다.
일단 변수에 타입지정을 잘해야
Dart 언어는 타입을 엄격하게 지키는걸 좋아하는 언어입니다.
타입이 이상하면 에러가 자주 발생하기 때문에 미리 타입을 엄격하게 잡아주는 것입니다.
var total = 3;
var person = 'john';
var name = ['김영숙', '피자집'];
var like = [0, 0, 0];
여태까지 변수만들 때 이렇게 만들었는데
변수만들 때 타입을 한번 달아보십시오. 타입은 자료의 종류를 뜻합니다.
실은 함수도 return 하는 자료의 타입을 미리 지정 가능합니다. 함수 이름 왼쪽에 쓰면 됩니다.
int total = 3;
String person = 'john';
List<String> name = ['김영숙', '피자집'];
List<int> like = [0, 0, 0];
int는 정수타입을 의미하고
String은 문자
List<String>은 리스트인데 안에 문자가 가득 담긴 리스트
List<int>는 리스트인데 안에 정수가 가득 담긴 리스트
List<dynamic>은 리스트인데 안에 아무거나 담긴 리스트
를 뜻합니다.
이러면 나중에 이상한 자료가 변수에 들어올 때 에러로 잡아주니 편리하고
null check가 쉬워져서 하는 것임
null check 해야합니다
유저의 폰은 더럽습니다.
연락처를 꺼냈다고 해도 연락처에 이름이 아무것도 안들어있을 수 있습니다.
Text(name[i].displayName)
그래서 이렇게 대충 쓰면 나중에 망한다는 소리입니다.
연락처에서 displayName을 꺼내는 코드인데 이름이 없으면요?
null 이런게 남습니다.
null은 텅 비었다는걸 표현하는 자료형입니다.
변수만들고 아무것도 안집어넣거나 그래도 null이 남습니다.
▲ 실제 앱들에도 null이 심심치않게 보입니다.
그래서 null check가 뭐냐면 null이 될 수 있는 부분을 미리미리 체크하라는 것인데
예를 들어 위의 코드를
"만약에 name[i].displayName 이 문자면 그거 쓰고 null이면 "이름없는사람" 문자를 남겨라~"
이렇게 바꾸면 안전하겠죠?
if문 혹은 삼항연산자 쓰면 되는데 더 간단한 문법도 있습니다.
Text(name[i].displayName ?? "이름없는사람")
물음표 두개 사용하면
"왼쪽이 null 이면 오른쪽걸 남겨주세요~" 라는 뜻입니다.
매우 간단하게 null check 해주는 문법이군요 자주 씁시다.
그래서 null일 수 있는 부분 색출해서 조치해주면
일단 앱 발행준비가 완료된 것입니다.
구글 플레이스토어에 등록하려면 .aab 또는 .apk 파일이 필요합니다.
그걸 만들기 위해선 사전작업이 좀 필요합니다.
0. 일단 앱의 유니크한 Bundle ID 라는게 필요합니다.
구글 플레이스토어에서 님의 앱이 가질 유니크한 아이디를 하나 작명해주면 됩니다.
실은 프로젝트 만들 때 자동생성이 되는데 거기에 회사명, 앱이름을 적으면 자동생성됩니다.
android/app/build.gradle 파일에 있는 applicationId "com.example.contact_app" 항목이 님의 Bundle ID입니다.
com.회사명.앱이름 이렇게 지어주는데 맘에안들면 바꾸면 됩니다.
바꾸려면 안드로이드 스튜디오 상단 View - Tool Windows - Terminal 누르고
dart pub global activate rename 입력하고
dart pub global run rename --bundleId com.회사명작명.앱이름작명
입력하면 됩니다. 회사명 없으면 맘대로 가상의 회사 만드셈
(주의) 앱이름, 회사이름에 _ 언더바 넣는건 나중에 ios 앱발행시 문제생길 수 있음
1. Android Studio 우측상단 Project Structure 버튼을 눌러서
Project SDK 버전이 NO SDK로 되어있으면 현재 사용하는 안드로이드 SDK 버전으로 바꿔줍니다. (저는 31)
이제 상단에서 Build -> Flutter -> Build APK 누르면 .apk 파일로 발행 끝입니다.
.apk 파일은 여러분 폰으로 옮겨서 바로 설치가 가능한데
구글 플레이스토어에 올리고 싶다면 키로 서명을 해서 .aab 파일로 발행해야합니다.
그러고 싶으면 2번부터 따라하면 됩니다.
2. keytool 도구를 이용해서 키를 하나 생성해줍니다.
21년 8월 이후 출시하는 앱들은 전부 키 파일이 있어야한다고 하는군요.
에디터 상단에서 터미널을 오픈합니다. (alt + f12)
그리고 flutter doctor -v를 입력하면
▲ Java binary 라는 프로그램이 어딨는지 알려줍니다.
이 주소 그대로 가져와서 터미널에 이렇게 입력합니다.
윈도우는
저기뜨는bin까지경로\keytool -genkey -v -keystore c:\키파일저장할폴더경로\upload-keystore.jks -storetype JKS -keyalg RSA -keysize 2048 -validity 10000 -alias upload
이거 터미널에 입력하면 됩니다.
근데 경로입력할 때 중간에 공백이 있으면 단어를 "" 따옴표 안에 담으면 됩니다.
G:\"android studio"\jre\bin\keytool -genkey -v -keystore c:\flutter_key\upload-keystore.jks -storetype JKS -keyalg RSA -keysize 2048 -validity 10000 -alias upload
그니까 전 예시로 이런 식으로 했습니다.
(키파일 저장하는 폴더안의 내용물이 전부 삭제되니 반드시 새로운 폴더 만들어서 거기 저장하십시오)
맥은
거기뜨는경로\keytool -genkey -v -keystore ~/upload-keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias upload
비슷합니다. 근데 맥은 경로 중간에 공백이 있으면 공백 왼쪽에 \ 기호를 넣어줘야 문제가 없습니다.
입력하면 이름짓고 비번 2개 지으라는데 맘대로 입력하시고
마지막에 다 맞냐고 물어보면 y 입력하면 key 파일이 생성됩니다.
key 파일경로와 비번 2개 잘 보관하시길 바랍니다.
3. 님들 프로젝트에 android 폴더 있잖습니까
거기안에 key.properties 라는 파일을 하나 만들어줍니다.
그리고 내용은 이걸 복붙합니다.
storePassword=아까입력한비번1
keyPassword=아까입력한비번2
keyAlias=upload
storeFile=키파일경로/upload-keystore.jks
키파일 경로는 아까 정했던 그 경로 그대로 입력하고 저장합니다.
저는 경로가 이거겠군요 c:/flutter_key/upload-keystore.jks (여기서 경로는 \ 이게 아니라 / 이걸로 써주면 됩니다)
경로 모르겠으면 파일 찾아서 우클릭해보면 됩니다.
4. 님들 프로젝트에 android/app/build.gradle 파일이 있잖습니까
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}
android { 어쩌구~~~
(1) 위의 4줄의 코드를 android { 여기 바로 전에 복붙해줍니다.
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
storePassword keystoreProperties['storePassword']
}
}
(2) 위의 8줄의 코드를 android { 중괄호 안에 복붙해줍니다.
buildTypes { 이거 바로 전이 어떨까요
buildTypes {
release {
signingConfig signingConfigs.release
}
}
(3) buildTypes { 안의 코드를 이렇게 변경해줍니다.
debug라고 되어있는 부분을 release로 바꾸면 끝입니다.
5. 그 다음에 Android Studio 상단 메뉴에서
Build - Flutter - Build App Bundle 누르면 됩니다.
build\app\outputs\bundle\release\app-release.aab 이런 경로에 나왔다고 알려주는데
이제 그거 구글 플레이스토어에 등록하면 끝임
6. 하지만 구글플레이스토어에 올리려면
개발자 계정이 필요한데 계정만들 때 25달러 내야합니다.
우선 비공개로 올려서 앱을 테스트할 수도 있습니다.
추가 자료
https://junesker.tistory.com/32
https://www.youtube.com/watch?v=Z2lRecZfgoc
'APP > Flutter' 카테고리의 다른 글
플러터 프로젝트 시작시 해야할 기본 셋팅, ThemeData() 에서 스타일 관리하기 (0) | 2022.08.08 |
---|---|
플러터 사용자입력 글자입력란 TextField에 스타일주는 법 (0) | 2022.08.08 |
플러터 유저에게 앱 권한 요청하기 (0) | 2022.08.07 |
플러터 사용자의 input을 받는 법 (0) | 2022.08.07 |
플러터 자식 위젯이 부모 위젯의 state를 변경하고 싶으면 4-step (0) | 2022.08.07 |