Programming 99

[iOS] ipa와 번들에 대하여

앱사이즈에 대하여앱사이즈에 대해 말하기에 앞서, 각 용어에 대해 먼저 정의하겠습니다. 앱스토어 등록을 위한 파일 포맷 App bundle : 앱 바이너리, 리소스 파일 등 일체를 포함한 bundle 파일입니다. 지원하는 모든 디바이스에 대한 데이터를 포함하고 있습니다..dysm : iTunes Connect와 기타 크래시 리포트 라이브러리에서 사용하는 Dynamic Symbol입니다. 이 파일을 통하여 각 메모리 주소에 코드 매핑이 가능합니다.앱스토어 등록용 .ipa : 스토어 등록을 위한 압축 파일입니다. 위에서 말씀드린 app bundle과 .dysm, On-Demmand Resource용 assets 패키지를 모두 포함하는 .ipa 파일입니다. - App Thinning (iOS9 이상 지원) : ..

[iOS] Library & Framework in iOS

코드의 재사용성을 높이는 방법 중에 하나가 활용도가 높은 코드를 Library와 Framework로 구현하여 사용성을 제고하는 것이다. iOS 플랫폼에서도 Library와 Framework를 제공한다. 하지만 기존 우리가 알던 Library와 Framework의 의미와 조금 다르다. Library는 실행가능한 정적인 코드의 집합을 뜻하고 Framework는 동적인 App 번들을 뜻한다. 그럼 Library와 Framework의 특징에 대해 명확하게 알아보자. Library (Static Library) Library(.a) 는 앱에 링크된 Object file(.o) 들의 모임이다. iOS8에서 Framework가 나오기 전까지 유일하게 사용되던 옵션이었다. 프로그램과 링크되어 있다. 즉, 빌드 과정에서..

[iOS] WKWebView (instead of UIWebView)

기존 UIWebView는 무겁고 복잡하고 메모리 누수가 있다. 심지어 니트로 자바스크립트 엔진을 장착한 모바일 사파리에 비해 느리다. WWDC 2014에서 새로 소개된 WKWebView는 AppKit의 WebView와 UIKit의 UIWebView를 대체하고, 양 플랫폼의 동일한 API를 제공하는 새로운 Webview이다. 60fps 스크롤링, 빌트인-제스처, App-WebPage 간 커뮤니케이션을 제공한다. UIWebView와 WKWebView의 큰 차이점은 2가지가 있다. 먼저 UIWebView는 UIKit에 구현되어 있어, 따로 import가 필요하지 않다. 그래서 Interface builder에서 사용할 수 있다. 그 다음, WKWebView는 javascript 최적화를 위해 별도의 프로세스를..

[Design] 아이폰 해상도에 대한 고찰 (레티나, pt, px 등)

이번엔 아이폰 해상도에 대한 얘기를 해보려고 한다. 먼저, Point에 관한 것이다. Point는 좌표계에 대한 추상적 단위이다. 이는 아이폰의 다양한 모델 해상도를 모두 지원하기 위해 사용하는 좌표계이다. Point 좌표계는 각 디스플레이의 스크린이 가지는 Scale factor (화면 배수) 에 따라 Rendered pixel로 옮겨진다. 각 Scale factor는 non-retina (e.g. 아이폰 3Gs 이전 모델) 의 경우에 1x이며, 일반적인 레티나 디스플레이 (e.g. 아이폰 4~7 모델)는 2x의 Scale factor를 가지고 대화면 기기 (e.g. 아이폰 6/7 플러스 모델)들은 3x의 Scale factor를 가진다. 각 Point 값에 Scale factor를 곱하면 Render..

Programming/Design 2017.01.11

[iOS] APNS JWT (JSON Web Token)

Apple이 JWT (JSON Web Token)을 활용하여 인증서 만료없이 사용할 수 있는 방법을 공개했다. WWDC 2016 session 724를 통해 언급 했었다. JWT는 JSON Web Token으로 기존의 XML 기반의 signature를 JSON으로 교체하여 페이로드/파싱를 경량화하고 기존 JSON의 범용성을 갖춘 새로운 방식의 토큰이다. Apple은 APNS를 사용하는 데 있어 이 방식을 추가로 제공하게 됬다. 기존 APNS는 App ID와 APNS 인증서를 연동하여 서버에서 인증서를 사용하려 APNS 서버로 푸시를 전송하는 방식이었다. 그래서 인증서의 만료 기간에 따라 서버의 APNS 인증서를 교체 해줘야하는 번거로움이 있었다. 이를 해결하기 위한 방안이 여러개 나왔고, Fast lan..

[iOS] What's new in iOS 10

SiriKit 앱 내부에서 득정 도메인에 대한 서비스를 제공할 수 있다. Intent와 Intent UI 를 활용하여 서비스를 제공가능하다. 제공 가능한 도메인은 아래와 같다. - 오디오/비디오 콜- 메시지- 결제 관련- 사진 검색- 예약 관리- 운동 일정 관리 관련 키워드 : SiriKit, Intents framework, Intents UI framework Proactive Suggestions iOS9에서 Spotlight와 Safri search results를 통해 앱의 동작이나 Depp link등을 제공할 수 있었다. iOS10에서는 사용자가 앱에서 어떤 동작들을 사용할 수 있는지 정보 제공이 가능하다. 키보드의 Quick type이나 맵, app switcher, Siri interact..

[iOS] Alcatraz : Xcode 패키지 매니저

Xcode에는 여러가지 플러그인들이 존재한다. 플러그인은 Xcode에 부가적인 기능을 제공함으로써 사용자에게 편의를 제공한다. 이번엔 앞서 말한 플러그인들을 쉽게 찾아서 쓸 수 있도록 해주는 Packgage Manager에 관한 포스팅이다. 이름은 Alcatraz!! Alcatraz.io : http://alcatraz.ioAlcatraz in Github : https://github.com/alcatraz/Alcatraz Command for installing the Alcatrazcurl -fsSL https://raw.github.com/supermarin/Alcatraz/master/Scripts/install.sh | sh 위의 URL로 Alcatraz의 기능을 파악하고, 명령어를 사용하여 ..

[iOS] '=='과 'isEqual:'의 차이

포스팅을 시작하기에 앞서 'equlity'와 'identity'의 파이를 아는 것이 중요하다. 'equality'는 값의 동일함을 의미하고, 'identity'는 메모리의 주소가 일치함을 의미한다. 'isEqual:' 메소드는 Equlity와 연관이 있다. NSObject에서의 'isEqual:' 기본 구현은 메모리 주소 비교에 기반한다. 이외에 NSObject를 상속 받은 클래스들은 'isEqual:'을 구현할 때 아래의 사항을 따른다. - 'isEqualTo___CLASSNAME___'이라는 이름의 메소드를 통해 값을 비교하도록 구현한다.. (Equality)- 'isEqual:'를 오버라이딩하여 클래스와 객체의 비교한다. (Identity)- 'hash'를 오버라이딩한다. hash는 해시 테이블 구..

[iOS] CoreData: Concurrency & Performance

Concurrency 이번엔 개발자들에게 엄청난 이점을 가져다 줌과 동시에 엄청난 짐을 안겨주는 멀티 쓰레딩에 관한 얘기다. CoreData는 Cocoa 플랫폼에서 제공하여 코드의 양을 줄이고, 사용하기 편한 데이터베이스이다. CoreData를 Concurrency하게 사용하면서 성능을 향상시키는 방법에 대해 알아 보겠다. 일단 CoreData에서는 2가지 타입의 Concurrency 옵션을 제공한다. NSMainQueueConcurrencyType와 NSPrivateQueueConcurrencyType이다. NSMainQueueConcurrencyType는 앱의 main therad에 의해서 사용되어진다. NSPrivateQueueConcurrencyType는 NSManagedObjectContext ..

[iOS] Initialization과 Literal

오늘은 초기화 메소드에 대한 포스팅이다. Objective-C로 개발을 하다보면 가장 많이 구현하는 부분이 초기화 메소드일 것이다. 일반적으로 아래와 같이 초기화 메소드를 사용하게 된다. -(instancetype)init{ self = [super init]; if (self) { //impelment here } return self;} 이중에서 우리가 얘기할 부분은 위에 하이라이팅된 부분이다. 굳이 메모리에 할당되어 있는 self 객체를 슈퍼클래스에서 초기화한 객체로 다시 assign하는 것일까? 주변 다른 개발자 분으로부터 그 해답을 얻었다. 우선 해답은 super class의 초기화 과정을 거치면서 할당된 메모리의 주소가 변경될 수 있기 때문이다. 메모리 주소가 초기화 과정에서 변경되는 이유는 ..