hive로 어떻게든 해보려다가 조건을 붙여서 하는게 영 너무 힘들어서 결국 sqlite로 넘어가려고 flutter용 sqlite인 sqflite를 설치해서 사용하려고 하던중 

안드로이드는 잘 돌아가나 ios에서 제목과같은 오류가 나면서 안된다.

In Podfile:
        sqflite (from `.symlinks/plugins/sqflite/darwin`)

    Specs satisfying the `sqflite (from `.symlinks/plugins/sqflite/darwin`)` dependency were found, but they required a higher minimum deployment target.

평소처럼 구글님의 은혜를 받아 우선 번역기를 돌려보면 

`sqflite(`.symlinks/plugins/sqflite/darwin`에서)` 종속성을 충족하는 사양이 발견되었지만 더 높은 최소 배포 대상이 필요했습니다.

라고하니 단순히 최소 배포값이 더 높은건가 싶어 sqflite 페이지를 살펴봐도 최소 버전에대한 안내가없다.

결국 그냥 평소에 많이 잡는 12로 하자싶어 12로 변경하고 pods폴더 날리고 podfile.lock파일도 날리고 거기에 굳이 필요하나 싶지만 flutter clean도 요청해주고 다시 설치하니 돌아간다.

 

참고로 cocoapod이 설치되는 지원 버전은 podfile에 정의되어있다.

버전별로 다를수있으나 내가 쓰는 flutter에서의 자동으로 만들어진 Podfile에서는

# Uncomment this line to define a global platform for your project
# platform :ios, '11.0'

이렇게 시작한다.

이 문서의 두번째 주석을 풀어주고 값을 12로 변경해줬다.

# Uncomment this line to define a global platform for your project
platform :ios, '12.0'

 

내가 상속을 배웠던 언어는 get과 set을 분리해서 정의하는게 없었던 언어라 ( 내가 배우지 않은것일수도 있다 ) set만 오버라이드 할 경우 super를 호출되도 잘되는가에 대한 테스트가 필요했다.

테스트용이라 짧디 짧은 코드지만 그냥 날려버리기 뭔가 아깝다 생각이 들어 글을 남기기로 결정.

class A {
  A() {
    print('A가 생성이 시작되는 시점 - aValue: ${aValue}');
  }
  String aValue = 'default value';
}

class B extends A {
  B() {
    print('B가 생성이 시작되는 시점 - aValue: ${aValue}');
    super.aValue = 'initValue';
  }

  @override
  set aValue(String value) {
    print('set:$value B에서의 오버라이드한 함수가 불려졌다.');
    super.aValue = value;
  }
}

void main() {
  final b = B(); // 출력:A가 생성이 시작되는 시점 - aValue: default value,  B가 생성이 시작되는 시점 - aValue: default value
  print('시점 0 ~ b의 값 : ${b.aValue}'); // 출력: 시점 0 ~ b의 값 : initValue

  b.aValue = 'main - value'; // 출력: set:main - value B에서의 오버라이드한 함수가 불려졌다.

  print('시점 1 ~ b의 값 : ${b.aValue}'); // 출력: 시점 1 ~ b의 값 : main - value
}

set에서만 override를 해서 aValue를 설정할때 따로 print가 되도록 설정이 잘됐다.

super 지정이 잘 동작 한다.

뭐라 쓸 내용이 없네

플러터앱 외주 작업중 국가 코드로 이름을 가져와야되는 귀찮은 상황이 생겨서 위키에서 긁은걸 gpt로 넘겨서 작성해봄.

맵쪽은 나중에 다른 언어에서도 사용할수있을듯하다.

chat gpt가 신생언어에서 이상한 소리를 많이 하는데 이런 텍스트 포맷 변경은 참 잘한다.

class CountryISOAlpha2 {
  String? getCode(String name) {
    for (var key in _countrys.keys) {
      if (_countrys[key] == name) {
        return key;
      }
    }

    return null;
  }

  String? getName(String code) {
    return _countrys[code];
  }

  final Map<String, String> _countrys = {
    'AD': '안도라',
    'AE': '아랍에미리트',
    'AF': '아프가니스탄',
    'AG': '앤티가 바부다',
    'AI': '앵귈라',
    'AL': '알바니아',
    'AM': '아르메니아',
    'AO': '앙골라',
    'AQ': '남극',
    'AR': '아르헨티나',
    'AS': '아메리칸사모아',
    'AT': '오스트리아',
    'AU': '오스트레일리아',
    'AW': '아루바',
    'AX': '올란드 제도',
    'AZ': '아제르바이잔',
    'BA': '보스니아 헤르체고비나',
    'BB': '바베이도스',
    'BD': '방글라데시',
    'BE': '벨기에',
    'BF': '부르키나파소',
    'BG': '불가리아',
    'BH': '바레인',
    'BI': '부룬디',
    'BJ': '베냉',
    'BL': '생바르텔레미',
    'BM': '버뮤다',
    'BN': '브루나이',
    'BO': '볼리비아',
    'BQ': '보네르섬',
    'BR': '브라질',
    'BS': '바하마',
    'BT': '부탄',
    'BV': '부베섬',
    'BW': '보츠와나',
    'BY': '벨라루스',
    'BZ': '벨리즈',
    'CA': '캐나다',
    'CC': '코코스 제도',
    'CD': '콩고 민주 공화국',
    'CF': '중앙아프리카 공화국',
    'CG': '콩고 공화국',
    'CH': '스위스',
    'CI': '코트디부아르',
    'CK': '쿡 제도',
    'CL': '칠레',
    'CM': '카메룬',
    'CN': '중국',
    'CO': '콜롬비아',
    'CR': '코스타리카',
    'CU': '쿠바',
    'CV': '카보베르데',
    'CW': '퀴라소',
    'CX': '크리스마스섬',
    'CY': '키프로스',
    'CZ': '체코',
    'DE': '독일',
    'DJ': '지부티',
    'DK': '덴마크',
    'DM': '도미니카 연방',
    'DO': '도미니카 공화국',
    'DZ': '알제리',
    'EC': '에콰도르',
    'EE': '에스토니아',
    'EG': '이집트',
    'EH': '서사하라',
    'ER': '에리트레아',
    'ES': '스페인',
    'ET': '에티오피아',
    'FI': '핀란드',
    'FJ': '피지',
    'FK': '포클랜드 제도',
    'FM': '미크로네시아 연방',
    'FO': '페로 제도',
    'FR': '프랑스',
    'GA': '가봉',
    'GB': '영국',
    'GD': '그레나다',
    'GE': '조지아',
    'GF': '프랑스령 기아나',
    'GG': '건지섬',
    'GH': '가나',
    'GI': '지브롤터',
    'GL': '그린란드',
    'GM': '감비아',
    'GN': '기니',
    'GP': '과들루프',
    'GQ': '적도 기니',
    'GR': '그리스',
    'GS': '사우스조지아 사우스샌드위치 제도',
    'GT': '과테말라',
    'GU': '괌',
    'GW': '기니비사우',
    'GY': '가이아나',
    'HK': '홍콩',
    'HM': '허드 맥도널드 제도',
    'HN': '온두라스',
    'HR': '크로아티아',
    'HT': '아이티',
    'HU': '헝가리',
    'ID': '인도네시아',
    'IE': '아일랜드',
    'IL': '이스라엘',
    'IM': '맨섬',
    'IN': '인도',
    'IO': '영국령 인도양 지역',
    'IQ': '이라크',
    'IR': '이란',
    'IS': '아이슬란드',
    'IT': '이탈리아',
    'JE': '저지섬',
    'JM': '자메이카',
    'JO': '요르단',
    'JP': '일본',
    'KE': '케냐',
    'KG': '키르기스스탄',
    'KH': '캄보디아',
    'KI': '키리바시',
    'KM': '코모로',
    'KN': '세인트키츠 네비스',
    'KP': '조선민주주의인민공화국',
    'KR': '대한민국',
    'KW': '쿠웨이트',
    'KY': '케이맨 제도',
    'KZ': '카자흐스탄',
    'LA': '라오스',
    'LB': '레바논',
    'LC': '세인트루시아',
    'LI': '리히텐슈타인',
    'LK': '스리랑카',
    'LR': '라이베리아',
    'LS': '레소토',
    'LT': '리투아니아',
    'LU': '룩셈부르크',
    'LV': '라트비아',
    'LY': '리비아',
    'MA': '모로코',
    'MC': '모나코',
    'MD': '몰도바',
    'ME': '몬테네그로',
    'MF': '생마르탱',
    'MG': '마다가스카르',
    'MH': '마셜 제도',
    'MK': '북마케도니아',
    'ML': '말리',
    'MM': '미얀마',
    'MN': '몽골',
    'MO': '마카오',
    'MP': '북마리아나 제도',
    'MQ': '마르티니크',
    'MR': '모리타니',
    'MS': '몬트세랫',
    'MT': '몰타',
    'MU': '모리셔스',
    'MV': '몰디브',
    'MW': '말라위',
    'MX': '멕시코',
    'MY': '말레이시아',
    'MZ': '모잠비크',
    'NA': '나미비아',
    'NC': '누벨칼레도니',
    'NE': '니제르',
    'NF': '노퍽섬',
    'NG': '나이지리아',
    'NI': '니카라과',
    'NL': '네덜란드',
    'NO': '노르웨이',
    'NP': '네팔',
    'NR': '나우루',
    'NU': '니우에',
    'NZ': '뉴질랜드',
    'OM': '오만',
    'PA': '파나마',
    'PE': '페루',
    'PF': '프랑스령 폴리네시아',
    'PG': '파푸아뉴기니',
    'PH': '필리핀',
    'PK': '파키스탄',
    'PL': '폴란드',
    'PM': '생피에르 미클롱',
    'PN': '핏케언 제도',
    'PR': '푸에르토리코',
    'PS': '팔레스타인',
    'PT': '포르투갈',
    'PW': '팔라우',
    'PY': '파라과이',
    'QA': '카타르',
    'RE': '레위니옹',
    'RO': '루마니아',
    'RS': '세르비아',
    'RU': '러시아',
    'RW': '르완다',
    'SA': '사우디아라비아',
    'SB': '솔로몬 제도',
    'SC': '세이셸',
    'SD': '수단',
    'SE': '스웨덴',
    'SG': '싱가포르',
    'SH': '세인트헬레나',
    'SI': '슬로베니아',
    'SJ': '스발바르 얀마옌 제도',
    'SK': '슬로바키아',
    'SL': '시에라리온',
    'SM': '산마리노',
    'SN': '세네갈',
    'SO': '소말리아',
    'SR': '수리남',
    'SS': '남수단',
    'ST': '상투메 프린시페',
    'SV': '엘살바도르',
    'SX': '신트마르턴',
    'SY': '시리아',
    'SZ': '에스와티니',
    'TC': '터크스 케이커스 제도',
    'TD': '차드',
    'TF': '프랑스령 남방 및 남극 지역',
    'TG': '토고',
    'TH': '태국',
    'TJ': '타지키스탄',
    'TK': '토켈라우',
    'TL': '동티모르',
    'TM': '투르크메니스탄',
    'TN': '튀니지',
    'TO': '통가',
    'TR': '튀르키예',
    'TT': '트리니다드 토바고',
    'TV': '투발루',
    'TW': '중화민국',
    'TZ': '탄자니아',
    'UA': '우크라이나',
    'UG': '우간다',
    'UM': '미국령 군소 제도',
    'US': '미국',
    'UY': '우루과이',
    'UZ': '우즈베키스탄',
    'VA': '바티칸 시국',
    'VC': '세인트빈센트 그레나딘',
    'VE': '베네수엘라',
    'VG': '영국령 버진아일랜드',
    'VI': '미국령 버진아일랜드',
    'VN': '베트남',
    'VU': '바누아투',
    'WF': '왈리스 푸투나',
    'WS': '사모아',
    'YE': '예멘',
    'YT': '마요트',
    'ZA': '남아프리카 공화국',
    'ZM': '잠비아',
    'ZW': '짐바브웨',
  };
}

api 관련 테스트중 options라는 메소드로 서버에 요청하는 경우를 발견했다.

해당 내용은 같이 보내는 값은 없고 서버 응답또한 204로 받는 값은 해더값뿐이였다.

 

받아온 응답의 해더값을 잘 살펴보면 

Access-Control-Allow-Methods 라는 값이 있는데 

이값에서 받고있는 Method 값을 반환해준다.

Postman에서 요청후 받은 응답의 해더

 

자세한 내용은 아래 문서 참조.

Access-Control-Allow-Methods - HTTP | MDN (mozilla.org)

 

Access-Control-Allow-Methods - HTTP | MDN

The Access-Control-Allow-Methods response header specifies one or more methods allowed when accessing a resource in response to a preflight request.

developer.mozilla.org

스위프트3을 접하고 몇 년이 지나고 ... 정들었던 UIkit의 자리를 swiftUI가 점점 뺏고 있는와중

나도 swiftUI를 공부해야겠다 싶어 시작한다.

uikit의 내용을 swiftUI와 대조하며 파악해보려한다.

이글은 내 개인의 학습하면서 쓰는 글이라 틀린 정보가 있을 수 있다.

UIWindow -> windowGroup

WindowGroup {
    ContentView()
}


UILabel ->

Text("hello world")


UIButton ->

init(action: @escaping () - Void, @ViewBuilder label: () -> Label)

var body: some View {
    Button {
        print("Tap")
    } label: {
       Text("Tap me!")
    }
}


UITextField ->

init(LocalizedStringKey, text: Binding<String>)

@State private var textValue: String = ""

var body: some View {
    TextField("PlaceHolder...", text: $textValue)
}


UIImageView ->

init(_ name: String, bundle: Bundle? = nil)

var body: some View {
    Image(systemName: "star") // systemImage
}


UITableView ->

init(@ViewBuilder content: () -> Content)

var body: some View {
    List {
        ForEach(0 ..< 10, id: \.self) { i in
            Text("item \(i)")
        }
    }
}


UICollectionView ->

ScrollView + 
init(columns: [GridItem], alignment: HorizontalAlignment = .center, spacing: CGFloat? = nil, pinnedViews: PinnedScrollableViews = .init(), @ViewBuilder content: () -> Content)

let layout: [GridItem] = [
    GridItem(.flexible(minimum: 40, maximum: 100)),
    GridItem(.flexible(minimum: 40, maximum: 100)),
]

var body: some View {
    VStack(alignment: .center) {
        ScrollView(.vertical) {
            LazyVGrid(columns: layout) {
                ForEach(0 ..< 100, id: \.self) { index in
                    Text("item \(index)")
                        .frame(height: 30)
                }
            }
        }
        .frame(maxHeight: .infinity)
        .background(.yellow)

        ScrollView(.horizontal) {
            LazyHGrid(rows: layout) {
                ForEach(0 ..< 100, id: \.self) { index in
                    Text("item \(index)")
                        .frame(height: 30)
                }
            }
        }
        .frame(maxHeight: .infinity)
    }
}


UIAlertController style.alert->

View().alert(isPresented: Binding<Bool>, content: () -> Alert) -> some View
View().alert<A>(_ titleKey: LocalizedStringKey, isPresented: Binding<Bool>, @ViewBuilder actions: () -> A) -> some View where A : View

@State private var showingAlert = false

var body: some View {
    Button(action: {
        self.showingAlert = true
    }) {
        Text("Show Alert")
    }
    .alert("title", isPresented: $showingAlert) {
        Button("OK", role: .cancel) {
            print("tap ok")
        }
        Button("NO", role: .destructive) {
            print("tap no")
        }
    }
    /*
    .alert(isPresented: $showingAlert) {
        Alert(title: Text("Title"), message: Text("This is a alert message"), dismissButton: .default(Text("Dismiss")))
    }
    */
}


UIAlertController style.actionSheet

View().actionSheet(isPresented: Binding<Bool>, content: () -> ActionSheet) -> some View

@State var showActionSheet = false
var body: some View {
    Button("sheet") {
        showActionSheet = true
    }
    .buttonStyle(.bordered)

    .actionSheet(isPresented: $showActionSheet) {
        ActionSheet(title: Text("Title"), buttons: [
            ActionSheet.Button.default(Text("text"), action: {
                print("tap text")
            }),
            .default(Text("default")),
            .cancel()
        ])
    }
}


UISwitch ->

init(isOn: Binding<Bool>, @ViewBuilder label: () -> Label)

@State private var toggleValue: Bool = false

var body: some View {
    Toggle(isOn: $toggleValue) {
        Text("토글 텍스트")
    }
}


UIPickerView + UISegmenetedControl( style segmented ) ->

init(_ titleKey: LocalizedStringKey, selection: Binding<SelectionValue>, @ViewBuilder content: () -> Content)
init(selection: Binding<SelectionValue>, label: Label, @ViewBuilder content: () -> Content)

@State var select = "Apple"

var fruits = ["Apple", "Apricot", "Banana", "Pear"]

var body: some View {
    VStack(alignment: .leading) {
        Picker("picker 타이틀", selection: $select) {
            ForEach(fruits, id: \.self) { fruit in
                Text(fruit)
            }
        }
        .pickerStyle(.inline)
        .background(.red)

        Picker(selection: $select, label: Text("Fruit")) {
            ForEach(fruits, id: \.self) {
                Text($0)
            }
        }
        .background(.green)

        NavigationView {
            Picker(selection: $select, label: Text("Fruit")) {
                ForEach(fruits, id: \.self) {
                    Text($0)
                }
            }
            .pickerStyle(.navigationLink)
            .background(Color.mint)
        }

        Picker("title", selection: $select) {
            ForEach(fruits, id: \.self) { fruit in
                Text(fruit)
            }
        }
        .pickerStyle(.segmented)
        .background(Color.orange)

    }.padding()
}


UIViewcontroller().present ->

View().sheet<Content>(isPresented: Binding<Bool>, onDismiss: (() -> Void)? = nil, @ViewBuilder content: @escaping () -> Content) -> some View where Content : View
View().fullScreenCover<Content>(isPresented: Binding<Bool>, onDismiss: (() -> Void)? = nil, @ViewBuilder content: @escaping () -> Content) -> some View where Content : View

struct ModalView: View {
    @Binding var isShow: Bool
    var body: some View {
        ZStack {
            Color.yellow.ignoresSafeArea()
            VStack {
                Button("close") {
                    isShow = false
                }
                .frame(height: 50)

                Text("hello world")
            }
            .background(.green)
        }
    }
}

struct TestPresent: View {
    @State private var fullShow = false
    @State private var modalShow = false

    var body: some View {

        VStack {
            Button("Present0") {
                self.fullShow = true
            }
            .padding()

            Button("Present1") {
                self.modalShow = true
            }
            .padding()

            .sheet(isPresented: $modalShow) {
                ModalView(isShow: $modalShow)
            } // 아직도 애네들이 어떻게 붙어서 동작하는지 이해가 안간다.
        }
        .fullScreenCover(isPresented: $fullShow) {
            ModalView(isShow: $fullShow)
        } // 도대체 넌 어떻게 붙어서 동작하는거니 안에 View 아무곳에 붙여도 동작함
    }
}

\

기존 pod을 이용한 프로젝트에서 tuist와 spm을 이용해 모듈화를 하고있다 

서비스 분리 자체를 완전히 하지는 않았지만 common과 main 두가지 정도로 분리하여 나중에 서비스를 추가할때 하나씩 늘려가는식으로 진행하고 좀 더 시간이 많이 남을때 main에서의 서비스를 분리하는식으로 진행하려고 했었다

그렇게 진행한 부분을 업데이트를 하려고 업로드를 시켜보니...

Asset validation failed

Missing App Icon. The bundle doesn’t contain an iMessage app icon. iMessage app icons must be 54x40 pixels in .png format. (ID: 3f448328-3fc2-4036-be0e-7d0eacf9ca41)

주루루룩.

Asset validation failed 가 뜨면서 올라가지 않는다.

achive까진 됐는데 업로드가 안된다.

이전까지 멀쩡히 올라가던 앱이라 이미지가 부족할리도 없다

해당 사이즈는 아이콘으로 요구하지도 않는 이미지다

왜 저런 에러가 나왔는지도 의문이다

 

tuist로 옴기면서 글은 안남겼지만 가장 많이 나는 오류에 대한 해답은 tuist 프로젝트 구성 정의에 대한 문제였다

이번에도 문제가 있겠거늘 하고 검색도 해보고 여러가지도 해봤지만 영 안나왔고 결국 찾아낸 문제는

기존 프로젝트의 Build Settings의 Asset Catalog Compiler - Options의 값이 다르게 나온다.

tuist가 생성해주는 기본값과 다른가보다

Target을 생성할때

setttings를 항목이 있는데 이를 다시 기존 프로젝트 설정과 동일하게 적어주고

( 참고로 Target -> Build Settings 에서 원하는 항목을 클릭하면 우측 메뉴에서 Declaration 라고 된 부분에서 키값이 나온다. )

tuist generaral > 이후 혹시 모르니 빌드 클린 > achive > upload

완료!

 

tuist 로 생성되는 기본값이 너무나 적다 힘들다

 

MessagingClientErrorCode.INVALID_ARGUMENT = {
    code: 'invalid-argument',
    message: '제공된 인수가 잘못되었습니다.',
};
MessagingClientErrorCode.INVALID_RECIPIENT = {
    code: 'invalid-recipient',
    message: '잘못된 메시지 수신자가 제공되었습니다.',
};
MessagingClientErrorCode.INVALID_PAYLOAD = {
    code: 'invalid-payload',
    message: '잘못된 메시지 페이로드가 제공되었습니다.',
};
MessagingClientErrorCode.INVALID_DATA_PAYLOAD_KEY = {
    code: 'invalid-data-payload-key',
    message: '데이터 메시지 페이로드가 잘못된 키를 포함하고 있습니다. 제한된 키에 대해 DataMessagePayload 유형의 참조 문서를 참조하십시오.',
};
MessagingClientErrorCode.PAYLOAD_SIZE_LIMIT_EXCEEDED = {
    code: 'payload-size-limit-exceeded',
    message: '제공된 메시지 페이로드가 FCM 크기 제한을 초과합니다. 자세한 내용은 오류 문서를 참조하십시오.',
};
MessagingClientErrorCode.INVALID_OPTIONS = {
    code: 'invalid-options',
    message: '잘못된 메시지 옵션이 제공되었습니다.',
};
MessagingClientErrorCode.INVALID_REGISTRATION_TOKEN = {
    code: 'invalid-registration-token',
    message: '잘못된 등록 토큰이 제공되었습니다. 클라이언트 앱이 FCM으로 등록할 때 수신하는 등록 토큰과 일치하는지 확인하십시오.',
};
MessagingClientErrorCode.REGISTRATION_TOKEN_NOT_REGISTERED = {
    code: 'registration-token-not-registered',
    message: '제공된 등록 토큰이 등록되지 않았습니다. 이전에 유효한 등록 토큰은 다양한 이유로 등록 취소될 수 있습니다. 자세한 내용은 오류 문서를 참조하십시오. 이 등록 토큰을 제거하고 메시지 전송을 중지하십시오.',
};
MessagingClientErrorCode.MISMATCHED_CREDENTIAL = {
    code: 'mismatched-credential',
    message: '이 SDK를 인증하는 데 사용된 자격 증명은 제공된 등록 토큰에 해당하는 기기로 메시지를 보낼 권한이 없습니다. 자격 증명과 등록 토큰이 모두 Firebase 프로젝트에 속하는지 확인하십시오.',
};
MessagingClientErrorCode.INVALID_PACKAGE_NAME = {
    code: 'invalid-package-name',
    message: '메시지가 제공된 "restrictedPackageName" 옵션과 일치하지 않는 패키지 이름을 가진 등록 토큰으로 주소지정되었습니다.',
};
MessagingClientErrorCode.DEVICE_MESSAGE_RATE_EXCEEDED = {
    code: 'device-message-rate-exceeded',
    message: '특정 기기로의 메시지 전송 비율이 너무 높습니다. 이 기기로 보내는 메시지 수를 줄이고 즉시 다시 시도하지 마십시오.',
};
MessagingClientErrorCode.TOPICS_MESSAGE_RATE_EXCEEDED = {
    code: 'topics-message-rate-exceeded',
    message: '특정 주제를 구독하는 구독자에 대한 메시지 전송 비율이 너무 높습니다. 이 주제에 대한 보내는 메시지 수를 줄이고 즉시 다시 시도하지 마십시오.',
};
MessagingClientErrorCode.MESSAGE_RATE_EXCEEDED = {
    code: 'message-rate-exceeded',
    message: '메시지 대상에 대한 전송 제한이 초과되었습니다.',
};
MessagingClientErrorCode.THIRD_PARTY_AUTH_ERROR = {
    code: 'third-party-auth-error',
    message: 'iOS 기기를 대상으로 하는 메시지가 APNs SSL 인증서가 업로드되지 않았거나 만료되어 전송되지 않았습니다. 개발 및 프로덕션 인증서의 유효성을 확인하십시오.',
};
MessagingClientErrorCode.TOO_MANY_TOPICS = {
    code: 'too-many-topics',
    message: '제공된 등록 토큰이 구독할 수 있는 최대 주제 수를 초과했습니다.',
};
MessagingClientErrorCode.AUTHENTICATION_ERROR = {
    code: 'authentication-error',
    message: 'FCM 서버에 인증하는 중에 오류가 발생했습니다. 이 SDK를 인증하는 데 사용된 자격 증명이 적절한 권한을 갖고 있는지 확인하십시오. 설정 지침은 https://firebase.google.com/docs/admin/setup을 참조하십시오.',
};
MessagingClientErrorCode.SERVER_UNAVAILABLE = {
    code: 'server-unavailable',
    message: 'FCM 서버가 요청을 처리하지 못했습니다. 자세한 내용은 오류 문서를 참조하십시오.',
};
MessagingClientErrorCode.INTERNAL_ERROR = {
    code: 'internal-error',
    message: '내부 오류가 발생했습니다. 요청을 다시 시도하십시오.',
};
MessagingClientErrorCode.UNKNOWN_ERROR = {
    code: 'unknown-error',
    message: '알 수 없는 서버 오류가 반환되었습니다.',
};
InstallationsClientErrorCode.INVALID_ARGUMENT = {
    code: 'invalid-argument',
    message: '제공된 인수가 잘못되었습니다.',
};
InstallationsClientErrorCode.INVALID_PROJECT_ID = {
    code: 'invalid-project-id',
    message: '잘못된 프로젝트 ID가 제공되었습니다.',
};
InstallationsClientErrorCode.INVALID_INSTALLATION_ID = {
    code: 'invalid-installation-id',
    message: '잘못된 설치 ID가 제공되었습니다.',
};
InstallationsClientErrorCode.API_ERROR = {
    code: 'api-error',
    message: '설치 ID API 호출이 실패했습니다.',
};

'React Native' 카테고리의 다른 글

rn 에서 android 뷰 사용하기.  (0) 2022.03.02
굳이 jsx를 사용하고싶다.  (0) 2022.01.05
UI Test를 위해 Detox를 적용해본다. -iOS  (0) 2021.12.15
npm install을 주의하라  (0) 2021.10.22
npm version downgrade  (0) 2021.07.12

인텔 맥에서는 동작을 잘하던 docker 세팅파일이 에러를 내뱉는다

m1에서는 바로 안되나보다

검색을 통하니 m1에서는

db 관련 항목에서 

platform: linux/x86_64 를 넣으라고한다.

또는 터미널에 작업시 명령어 뒤에 "--platform linux/x86_64 mysql" 를 넣으라고한다

ex) docker pull --platform linux/x86_64 mysql

 

stackoverfolow ->

Well, technically it will not solve your issue (running MySQL on ARM), but for the time being, you could add platform to your service like:

services:
  db:
    platform: linux/x86_64
    image: mysql:5.7
    ...

Alternatively, consider using MariaDB, which should work as a drop-in replacement like e.g. this:

services:
  db:
    image: mariadb:10.5.8
    ...

Both ways work for me on M1 with the Docker Preview

 

https://stackoverflow.com/questions/65456814/docker-apple-silicon-m1-preview-mysql-no-matching-manifest-for-linux-arm64-v8

+ Recent posts