Xcode DeviceSupport Xcode를 사용하다보면 새로운 iOS 버전이 출시될 때마다 Xcode를 다운로드 업데이트해야 새로운 iOS 버전을 빌드 할 수가 있습니다. 하지만 지원 버전이 낮은 서비스를 위해서는 Xcode를 매번 업데이트 할 수 없습니다. 다른 IDE와 다르게 매우 불편할 수 있는데 이를 해결하기 위해서는 해당 단말기의 DeviceSupport DiskImage를 다운로드해서 기존 Xcode 라이브러리 폴더에 추가해서 동작시킬 수 있습니다. Xcode 빌드시 다음 문구를 보셨다면 Xcode를 지원하지않는 장치를 사용했기 때문인데 베타 버전이거나 최신 Xcode에서도 지원하지 않는 버전이 아니라면 해당 절차를 통해서 실행 시킬 수 있습니다. Could not locate devic..
LaunchOptions 디버깅 아이폰은 안드로이드와 달리 Xcode에서 디버깅을 할 때 일반적으로 앱이 종료된 상태에서 디버깅을 할 수가 없습니다. 즉 최초 실행 시 앱이 빌드된 상태에서 Console 로그도 볼 수 없으니 푸시 노티피케이션 같은 서비스를 최초 실행 할 때 테스트가 힘들 수 있습니다. 그래서 Xcode에서 간단한 스키마 설정으로 디버깅 타임을 미룰 수 있고 푸시나 기타 LaunchOptions 값을 제어해할 경우에 쉽게 디버깅을 할 수 있습니다. ▼ 우선 프로젝트에서 Edit Scheme... 메뉴를 선택합니다. ▼ 다음으로 Run 스키마에 Launch 옵션을 Wait for the executable to be lauched 옵션으로 변경합니다. 이 옵션을 사용하게 되면 앱을 실행하는..
Xcode 개발자 모드 아이폰 개발을 위해서 새로운 아이폰을 맥에 연결하고 Xcode에서 디바이스를 설정하면 사용할 수 없는 단말로 설정이 됩니다. 때문에 아이폰 개발을 위해서는 단말을 개발자 모드로 변경해야 합니다. ▼ 아이폰 설정앱으로 들어가서 개인정보 보호 및 보안 매뉴로 진입합니다. 그리고 맨 아래로 스크롤 하면 개발자 모드라는 메뉴를 볼 수 있는데 개발자 모드로 들어가서 모드의 스위치를 활성화 해주면 핸드폰이 개발자 모드로 변하게 됩니다. ▼ 만약 개발자 모드로 변했다면 아이폰 설정앱 중간 쯤에 개발자 라는 메뉴가 생긴 것을 볼 수 있습니다. ▼ 개발자 설정 메뉴에서 다양한 개발자 설정을 할 수 있습니다. 이제 개발자 모드로 핸드폰을 설정했다면 Xcode에서 빌드를 해서 앱을 설치할 수 있게 됩..
깃 기본 에디터 변경 ▼ 리눅스에서 git을 사용할 때 머지 하는 상황이나 git 에서 텍스트 수정이 있을 때 기본 에디터가 vim가 아닌 nano로 설정되어 있습니다. 하지만 vi 에디터를 주로 사용하기 때문에 다음 명령어를 통해서 git 의 에디터를 vim 으로 수정할 수 있습니다. ▼ 홈 폴더에 있는 .gitconfig 파일을 열어보면 다음과 같이 editor 가 vim으로 설정된 것을 확인할 수 있습니다. 위의 명령을 실행하지 않고 직접 .gitconfig 파일을 수정해도 될 것 같습니다.
▼ 다음은 간단한 브랜치 생성입니다. 처음 앱을 생성하면 main 브랜치 밖에 없는데 새로운 개발 브랜치를 만들려면 다음과 같이 명령어를 입력합니다. ▼ 만약 새로 만든 브랜치로 체크아웃하려면 다음과 같이 명령어를 입력합니다. ▼ 또한 브랜치의 리스트를 보려면 다음과 같이 입력합니다. 원격에 있는 브랜치 리스트들을 보려면 -r 옵션을 추가해줍니다. ▼ 마찬가지로 원격 브랜치를 체크아웃 하려면 checkout 명령어를 사용해서 원격 브랜치 명을 입력하면 됩니다.
테스트 플라이트 (TestFlight) 수출 규정 관리 문서 앱을 개발하다 테스트 플라이트에 앱을 배포할 일이 많이 있습니다. 사실 앱스토어에 앱을 업데이트 하기 전에 한번은 거처야 하는 과정입니다. 그런데 앱을 배포할 때마다 "수출 규정 관리 문서 누락"이란 메시지를 만나게 됩니다. 물론 관리에서 설정을 해주면 제출 준비 완료 상태로 변하면서 앱을 테스트 할 수 있는 상태가 됩니다. ▼ 다음과 같은 화면이 나오면 관리 버튼을 눌러서 암호화 되지 않음으로 선택해야 제출준비상태가 되고 그제서야 테스터들이 테스트 할 수 있습니다. ▼ 이제 프로젝트로 가서 info.plist 파일을 찾아 다음과 같이 App Uses Non-Exempt Excription 을 No(false) 값으로 변경해줍니다. ▼ 만약 코..
AudioSession AudioSession은 싱글톤으로 구현되어 있으며 앱 오디오 세션과 앱의 인터페이스를 정의할 수 있습니다. setActive 함수는 앱이 오디오를 사용하겠다고 통보하는 기능을 하고 반대로 setDeactive는 앱이 오디오를 사용하지 않겠다고 통보합니다. 오디오 세션을 설정할때는 3가지 옵션이 있는데 각각 다음과 같습니다. 예를 들어 카플레이를 사용할 때는 모드를. voicePrompt를 사용합니다. Category (playback, playAndRecord) Mode (default) Option (mixWIthOthers, duckOthers) 위의 코드의 핵심은 mixWithOthers 옵션을 사용해 다른 앱과 오디오가 겹칠 때 동시에 재생한다는 것과 defaultToSp..
스위프트 UI URLSession 통신 보통 앱을 만들때 API 통신을 하려면 Alamofire를 많이 사용합니다. 오늘은 SwiftUI에서 Alamofire가 아닌 URLSession 객체를 통해 통신을 하고 값을 표출하는 테스트를 해보겠습니다. 우선 사용될 URL은 다음과 같습니다. 브라우저에 입력해보면 JSON 형태의 데이터로 된 것을 확인 할 수 있습니다. JSON 데이터 URL와 데이터 Struct 정의 https://itunes.apple.com/search?term=taylor+swift&entity=song ▼ 우선 JSON 형태에 맞게 Codable를 상속 받은 데이터 Struct를 만들어줍니다. Response는 응답 받는 데이터 형태이며 Result 타입의 데이터를 배열형태로 가지게 ..
idleTimerDisabled 아이폰 프로젝트를 진행하면서 증권 앱이나 게임 화면의 경우 idleTimerDisabled 옵션을 true로 변환해서 화면이 계속 켜져 있도록 할 수 있습니다. 하지만 저전력 모드나 절전 모드를 활용하는 사용자에게 해당 옵션을 줄 경우 앱이 계속 켜져 있기 때문에 대기 모드나 화면 절전모드로 넘어가지 않습니다. ▼ 다음은 아이폰의 디스플레이 및 밝기 설정의 자동 잠금 옵션입니다. 만약 idleTimerDisabled를 true로 한다면 자동잠금을 안 함으로 한 것과 동일한 효과를 줄 수 있습니다. ▼ 다음과 같이 idleTimerDisabled 옵션을 단순히 true 로 하고 AppDelegate에서 실행하면 해당 앱은 홈 버튼을 눌러서 종료하지 않는 이상 꺼지지 않습니다..
▼ 우선 HapticsManager 라는 클래스를 만들어주고 static let을 선언해서 싱글톤 객체로 만들어줍니다. 이는 햅틱 이벤트를 여러번 사용해도 동일한 객체를 재사용하는 효과를 가져옵니다. ▼ 다음으로 노티피케이션에 대한 함수를 만들어줍니다. ▼ 마지막으로 햅틱 이벤트를 전달하기 위한 함수를 하나 정의합니다. ▼ 이제 햅틱 이벤트를 발생시켜보겠습니다. 햅틱 style의 종류는 다음과 같습니다. light medium heavy soft (iOS 13) rigid (iOS 13) ▼ 다음은 전체 코드입니다.
라이브러리 axios 설치 ▼ 통신을 위해 다음 명령어로 vue 프로젝트에 axios를 설치합니다. 테스트 API ▼ 테스트를 위해서 서버를 직접 만들기보다는 reqres.in 이라는 사이트에서 테스트 API를 이용해 JSON 데이터를 가져와보도록 하겠습니다. https://reqres.in/ Reqres - A hosted REST-API ready to respond to your AJAX requests Native JavaScript If you've already got your own application entities, ie. "products", you can send them in the endpoint URL, like so: var xhr = new XMLHttpRequest(); ..
아이폰 앱 스키마 이동 아이폰으로 앱 개발을 하다 보면 다른 앱을 열어야 하는 때가 있습니다. 다른 앱을 여는 방법은 유니버셜 링크나 파이어베이스 다이나믹 링크등 여러 가지가 있지만 그중에서도 오늘은 가징 기초적인 스키마로 앱을 여는 방법에 대해서 알아보겠습니다. 또한 사용자 편의를 위해서 앱 스키마로 앱을 열어서 앱이 없으면 해당 앱을 다운로드할 수 있는 앱스토어로 이동하는 코드도 포함합니다. ▼ 우선 앱스토어로 이동하는 코드입니다. 단순히 itms-apps:// 스키마를 통해 앱스토어를 열어주고 id 값을 인자로 받아서 처리합니다. 이 밖에 리뷰페이지로도 이동할 수 있고 여러 이동 경로가 있습니다. ▼ 다음은 앱이 설치되어 있는지 확인하고 설치된 앱이 없으면 위에서 정의한 moveAppStore를 호..
안드로이드 단축키 안드로이드 스튜디오를 사용하면서 자주 사용하게 되는 유용한 단축키를 정리합니다. 인텔리제이에서도 동일하게 사용가능합니다. 윈도우와 리눅스에서는 맥과 단축키가 다릅니다. 모두 저장 동기화 모든 항목 검색 찾기 다음 항목 찾기 이전 항목 찾기 바꾸기 작업 찾기 기호 이름으로 검색 클래스 찾기 자동 정렬 유용한 단축키 구분 설명 윈도우/리눅스 맥 일반 모두 저장 Control + S Command + S 동기화 Control + Alt + Y Command + Option + Y 검색 모든 항목 검색 (코드와 메뉴 포함) Shift (키를 두 번 누름) Shift (키를 두 번 누름) 찾기 Control + F Command + F 다음 항목 찾기 F3 Command + G 이전 항목 찾기 ..
iOS WKWebView Done 버튼 얼마전에 개발을 하면서 아이폰 웹뷰에 Done 닫기 버튼이 기본적으로 활성화 된다는 사실을 알았습니다. 웹뷰의 보조적인 기능을 하는 버튼인데 사실상 뷰 영역을 더 작게 보이게 하며 특히 아이폰 미니의 경우 화면이 더 작아지더군요. 그래서 처음에는 웹에서 처리하는 건 줄 알았는데 iOS 네이티브에서 WebView를 상속받아서 처리해줘야 했습니다. 생각보다 간단하게 작업할 수 있습니다. ▼ 우선 웹킷의 WebView를 상속 받은 클래스를 하나 만들어줍니다. 저는 RichEditorWebView 라는 이름으로 만들었으나 다른 이름으로 만들어줘도 무방합니다. ▼ 이제 상속 받아서 쓰면 됩니다. WebView를 확장한 RichEditorWebView를 상속 받아서 사용하면 ..
아이폰 롱터치 방지 아이폰 개발을 하다보면 웹뷰를 사용할 때가 많습니다. 하이브리드 앱을 개발하다보면 WebKit의 특성을 발견하게 됩니다. 네이티브 앱으로 개발할 때는 텍스트를 길게 누르거나 선택을 할 수 없지만 보통 하이브리드 앱으로 개발된 iOS 웹 앱을 보면 텍스트가 보통 선택되기 마련입니다. ▼ 텍스트 선택 방지 코드로 웹뷰가 로드 된 뒤에 didFinish 이벤트에서 설정해주면 됩니다. Web CSS 공식 문서를 보면 iOS Safari 디스플레이의 callout 기능이 포함 되어 있는 것을 확인 할 수 있습니다. https://developer.mozilla.org/en-US/docs/Web/CSS/-webkit-touch-callout -webkit-touch-callout - CSS: C..
iOS 저전력 모드 iPhone 사용자가 저전력 모드(low-power mode)를 사용하게 되면 iOS 개발을 할 때 몇 가지 제약이 생깁니다. 특히나 절전모드 사용시 동영상 비디오 자동재생을 지원하지 않습니다 때문에 개발을 할 때 저전력인지 확인해야 하는 때가 있는데요. 오늘은 저전력 모드에서 Swift 코드로 저전력 모드를 판단하는 코드와 방법을 알아보겠습니다. 저전력 모드의 경우 iOS 9 부터 지원하고 있고 다음과 같은 제약이 있습니다. CPU 쓰롯틀링 (60% 성능제한) 백그라운드 앱 갱신 제한 웹뷰 비디오 자동 재생 제한 자동 다운로드 기능 제한 GPU 퍼포먼스 저하 화면 밝기 저하 우선 아이폰에서 저전력 절전 모드를 확인하기 위해서는 두 가지 방법이 있습니다. 첫 번째로 직접 속성에 값을 ..
책, 사업의 철학 마이클 거버 저자(글) 이제용 번역 라이팅하우스 2015년 09월 01일 목차 우리는 필요이상으로 많은 일을 하고 있다. 그보다 엉뚱한 일을 하는데 문제가 있다. 이 책에 담긴 네 가지 중요한 관점 사업은 거창하지 않다, 기업가 신화를 정화기 이해하고 적용하라 턴키 혁명 기법 사업개발 프로세스 턴키 + 사업개발 프로세스 = 예측가능한 방식 성장하려면 끊임없이 변화해야만 한다. 헤라클레스 같은 기업가는 실제 없다 어느 날 기업가 열병에 걸린다 치명적 실수! 기술적 직무는 그 기술적 직무를 수행한 사업과는 완전 별개다. 창업을 하는 기술자들은 이런 사실을 알지 못한다. 그저 일하러 가는 장소일 뿐이다. 즉 도급업자가 된다. 프로그래머는 소프트웨어 사업에 진출한다. 연주자는 악기점을 연다. ..
Swift Date 객체 변환하기 Swift에서 날짜 객체를 수정하거나 바꾸기 위해서는 보통 Calendar 클래스를 사용합니다. 날짜를 다루는 일이 생각보다 복잡하고 어려울 때가 있는데 오늘은 단순히 날짜에 값을 더해서 반환하는 방법을 알아보겠습니다. 앱 개발을 하면서 갑자기 1일을 더해서 Date 객체를 사용해야 하면서 기억하기 쉽게 블로그에 글을 남깁니다. 우선 1일을 추가해서 데이트 객체를 만들려면 우선 기준이 되는 Date 객체를 하나 만들어 줍니다. ▼ 다음과 같이 today 변수에 오늘 날짜를 가리키는 새로운 Date 객체를 생성합니다. ▼ 이제 Calendar 클래스를 이용해 값을 추가해 줍니다. date 함수의 파라미터는 각각 다음의 파라미터를 인자로 받습니다. 저는 day로 설정해서 하..
CocodPods Podfile.lock CocoaPods 를 사용하면 Podfile.lock이라는 파일을 확인할 수 있습니다. 이는 일반적으로 .gitignore에 포함되지 않습니다. 그 이유는 여러 사용자(개발자)가 동일한 소스 서드파티 라이브러리를 공유하고 사용하기 위해서 입니다. repo를 업데이트 하거나 deintegrate 명령을 통해 파일을 변경할 수 있지만 해당 lock 파일이 고정 됨으로써 모두 동일한 소스를 사용한다고 보장할 수 있습니다. Package.resolved 이와 비슷하게 Xcode의 Swift Package Manager(이하 SPM)를 사용하면 다음과 같이 git에 commit 할 때 포함 여부를 묻습니다. 대체적으로 userdata 같은 경우는 Xcode에 포함하지 않는..
▼ Vue에 리스트를 그려주기 위해서 데이터를 정의합니다. 배열 형태의 animals라는 데이터를 정의하고 3개의 데이터를 추가해 줍니다. 각 데이터에는 food라는 값이 있습니다. 이 값 역시 배열로 이중 리스트를 그리기 위해서 필요합니다. 나머지 값의 출력은 생략하고 Vue에서 이중 for 문 형태의 값을 출력해 보겠습니다. ▼ 이번에는 데이터가 잘 나오는지 확인하기 위해 div 태그에 animals 값을 그대로 출력해 보겠습니다. 머스타치 문법으로 animals를 표시합니다. 뷰의 Mustache 문법은 {{ }} 안에 데이터를 출력하는 방법으로 실제 데이터가 그대로 렌더링 되는 것을 볼 수 있습니다. 값을 확인하기 위해서 출력해보겠습니다. ▼ 이번에는 div 태그에 v-for 예약어를 통해서 an..
* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.