
앱스토어에서 실적이 저조한 앱을 아예 내리려는데, '현재 앱을 삭제할 수 없습니다.'라고 떴다. 삭제가 불가능한 경우는 아래와 같다.연관된 인앱 구매 항목이 존재판매중인 앱아래 상태의 앱Ready for Review (심사 준비됨)In Review (심사 중)Rejected (거절됨)Metadata Rejected (메타데이터 거절됨)Waiting for Review (심사 대기 중)다른 계정으로 이관 중인 앱앱 번들에 포함된 앱 나의 경우, 무료앱에 이미 배포가 완료된 상태였고, 다른 계정으로 이관이 진행중이라거나 앱 번들에 포함되지 않은 앱이었다. 그런데 앱을 삭제할 수 없었던 이유는 무료앱이더라도 가격은 0원으로 설정되었기 때문이다. 위와 같이 [가격 및 사용 가능 여부]로 이동해서 화면 제일 하단..
리액트 훅(Hook)함수형 컴포넌트에서 상태 관리나 라이프사이클 기능 등을 사용할 수 있게 해주는 React의 기능함수형 컴포넌트: 그냥 JavaScript 함수. props를 받아서 JSX을 리턴.자주 쓰는 기본 훅useState: 상태 관리 할 수 있게 해줌useEffect: 컴포넌트가 렌더링될 때, 혹은 특정 값이 변경될 때 실행되는 코드 작성useRef: DOM을 직접 참조하거나, 렌더링과 상관없는 값을 저장할 때 사용useMemo, useCallback: 컴포넌트가 불필요하게 다시 계산되거나 함수를 새로 생성하지 않게 최적화할 때 사용useReducer를 사용해서 로직을 컴포넌트로부터 분리하는 건 요즘 많이 쓰는 패턴 중 하나리액트 훅은 이름 앞에 항상 use를 붙임StateuseState로 S..

이번에 준비중인 서비스에서는 서비스 이용 보상으로 스탬프를 준다. 그런데, 그 스탬프 획득 조건이 여러 가지이다. 연속 학습을 했을 때 주는 스탬프도 있고, 특정 날짜에 들어왔을 때 주는 스탬프도 있고. 스탬프 기능을 구현하면서 이걸 JPA로 구현할 때 어떻게 하면 좀 더 객체지향적으로 할 수 있을지 고민했다. 이런식으로 서비스 이용 보상이 주어지는 경우는 많으니까 다른 분들은 어떻게 하실지 모르겠지만, 나는 아래와 같이 했다. 우선 스탬프 획득 조건이 크게 세 종류라고 생각하고 진행했다.CountCondition: 어떤 행동을 일정 횟수하면 주어지는 조건TimeRangeCondition: 어떤 기간동안 어떤 행동을 하면 주어지는 조건DateRange: 어떤 날짜에 어떤 행동을 하면 주어지는 조건 획득 ..

개발을 하다보면 매번 아무 것도 없는 상태에서 시작하는 게 버거운 순간이 온다. 그럴 때 필요한 건 바로 템플릿! 나도 몇 개 앱을 개발해보니 생각보다 따로 설정하기 귀찮은 부분이 있어 미리 설정을 다 해놓은 템플릿만 있으면 비즈니스 로직만 갈아끼우면 되니 편하겠다는 생각이 들었고, 그래서 오늘은 iCloud 동기화 기능이 담긴 Template Repository를 만들었다. 우선 XCode에서 사용할 수 있는 Project template 형태로 생성할까 했는데, 생성은 했는데 프로젝트를 생성할 때 팀 정보 입력하는 화면에서 안 넘어가는 이슈가 있었다. 그래서 아예 프로젝트덩어리째 템플릿화하는 방법을 생각했다. 깃허브에서 Template Repository 만들기 평소와 똑같이 깃허브에서 Reposit..

방금 있었던 일이다. 내가 초창기부터 런칭, 그리고 꽤 최근까지도 담당한 우리 회사의 서비스 상용 서버가 내려갔다. 그리고 약 15분만에 서버를 복구했다.(중간에 다른 문제로 시간이 좀 걸렸는데 그 문제만 아니었으면 더 빠르게 복구했을 것이라고 생각한다.) 사실 이렇게 서버 다운에 대응이 가능했던 이유가 있는데, 내가 서버 인프라 환경을 구축할 때 Prometheus + Grafana로 모니터링 시스템을 구축하며 서버가 다운될 경우를 대비해 메일이 전송되도록 해놨기 때문이다.(물론 서버 재시작 스크립트도 준비해놨다.) 사실 우리 회사는 자체 서비스가 처음이고, 작은 회사이니 해당 서비스 인프라 구축을 전적으로 내가 알아서 했는데, 모니터링 시스템을 구축해야겠다고 생각했었던 건 내가 다른 프로젝트들을 하며..

CloudKit으로 iCloud 동기화를 구현하다가 시뮬레이터에서는 잘 되는데 실기기에서는 안되는 문제에 부딪혔다! 그래서 이 문제를 해결하는 방법을 정리해둔다.CloudKit 콘솔은 이렇게CloudKit 콘솔에 들어가는 방법은 크게 두 가지이다. 아래 링크를 클릭하거나, xcode에서 Signing & Capabilities에서 iCloud 영역의 [CloudKit Console] 버튼을 누르면 된다.https://icloud.developer.apple.com/ 로그인 - Apple idmsa.apple.com 시뮬레이터는 Development, TestFlight는 Production 우선 CloudKit에서 보면 Development와 Production이 있다. 시뮬레이터는 Development..

이번에는 구독해야 사용할 수 있는 앱을 개발하려고 샌드박스 계정을 생성했는데 이게 꽤나 복잡해서 정리해본다.샌드박스 계정으로 사용할 이메일 생성 샌드박스 계정은 테스트 목적이므로 제한적으로 사용되지만 어쨌든 실제 이메일은 로그인 인증 등의 이유로 필요하다.(같은 이유로 로그인할 때 인증 문자를 받을 핸드폰 번호도 필요하다.) 그래서 이메일을 먼저 생성한다. 이렇게 되면 샌드박스 계정을 삭제/추가할 때마다 새로 이메일을 만들어야 하는 번거로움이 생길 수 있는데, 이때 Gmail의 플러스 주소 기능을 사용하면 된다. 기본 이메일이 example@gmail.com이라고 하면 아이디 뒤에 +원하는문자를 추가하여(예를 들자면, example+tester@gmail.com) 각각 다른 이메일처럼 보이지만, 모든 메..

원래 재미삼아 iOS앱을 만들고 있었는데, 이제 본격적으로 유료앱을 출시해보고자 준비해왔습니다. 아래에 자세하게 그 과정을 적어놨으니 참고해 주세요.사업자등록 신청 (소요기간 2일) 우선 유료앱 개발을 하기 위해서는 사업자등록을 신청해야 합니다. 저의 경우, 개인사업자로 신청했고 신청할 때 아래 링크를 참고했습니다.https://gran007.tistory.com/entry/%EC%9C%A0%EB%A3%8C-%EC%95%B1-%EA%B0%9C%EB%B0%9C%EC%9D%84-%EC%9C%84%ED%95%9C-%EA%B0%9C%EC%9D%B8%EC%82%AC%EC%97%85%EC%9E%90-%EB%93%B1%EB%A1%9D 유료 앱 개발을 위한 개인사업자 등록한국은 앱스토어 플레이스토어에 유료앱 등록을 위..