Programming/Mac & iOS 50

[iOS] App Extension : Today view (Widget)

iOS8에서 새롭게 제공하는 기능 중에 하나이다. 기존 안드로이드에서 이미 제공한 기능이다. iOS8에서 새롭게 추가되면서 더욱 편리한 기능을 제공할 것으로 생각된다. 현재(2014.09.18) iOS8이 정식 릴리즈된 시점에서 필자가 사용하는 앱 중에 에버노트와 드롭박스는 발 빠르게 이 기능을 대처하고 있다. 이제 iOS8 위젯 기능을 사용하기 위한 과정을 알아보자. 먼저, 나의 앱 프로젝트에 App Extension(이하 'AE')을 추가한다. AE는 호스트 앱이 구현하고 호스트 앱에 AE를 추가 구현하는 형태로 개발한다. AE는 다른 앱들에서 사용할 수 있다. 호스트 앱에는 AE에서 사용하는 설정이나 정보를 처리하는 기능들을 얻도록 한다. 현재 Xcode 6에서는 아래와 같이 iOS에서 사용 가능한..

[Swift] 알면 좋은 Array에서 제공하는 함수 (map, filter, reduce)

Mapmap은 각 element를 순회하면서 element를 수정할 때 사용하기 좋은 함수이다. 예를 들어 우리는 각 String에 "box"라는 String을 덧붙이기 위하여 for-in을 떠올리기 쉽다. ex) for string in strArray {string += "box"} 대신에 map 함수를 사용하면 한줄로 간단하게 작성할 수 있다. ex)var resultArray = strArray.map({$0+"box"}) 참고로 map의 param 함수 타입은 '(T) -> U'이다. map 함수는 Array의 각 element를 순회하면서 개발자가 정의한 동작을 수행하게 된다. Filterfilter는 말 그대로 특정 조건을 통과한 element들을 모아서 Array로 반환하는 함수 이다. f..

[iOS] iOS에서 Cloud 활용 (Cloud Kit 요약 정리)

Cloud Kit CKContainer : 앱의 public/private 컨텐츠를 캡슐화한 객체이다.CKDataBase : 앱 컨테이너에 담긴 public/private 데이터들에게 접근하기 위한 통로이다.CKRecord : record의 컨텐츠를 관리하기 위한 인터페이스 Record는 key-value pair로 key는 레코드에서 field 값에 해당한다. 각 field의 값은 string, number, date뿐만 아니라 파일, 데이터 블록 그리고 다른 Record와 관계를 맺기 위해 다른 Record의 reference도 넣을 수 있다. CloudKit은 container들을 이용하여 데이터를 구성한다. 각 container별로 entitlement가 필요하고 런타임에서 CKContainer ..

[Swift] Swift Study 3주차 요약 (ARC, Extension, Generics, Operators ... etc)

Deinitializer리소스를 가지고 작업을 하다가 이를 정리하기 위한 작업을 정의 하려면 Deinitialization을 이용한다. 'deinit'은 객체가 deallocation이 되기 전에 호출하기 때문에 객체의 모든 property에 접근이 가능하다. ex)deinit { // perform the deinitialization} Automatic Reference Counting (memory management)Automatic Reference Counting(이하 'ARC')는 각 객체를 가리키는 refenece의 개수를 세는 것을 의미한다. 해당 객체를 가리키는 refenece의 개수가 '0'이 되면 객체를 해제한다. ARC는 이와 같은 방식으로 Mac/iOS 내에서의 memory 관리..

[Swift] Swift Study 2주차 요약 (Closure, Collection, Property, Initialization, Observer ... etc)

Function parameters함수의 param들은 기본적으로 다 상수다. 그러므로 수정이 불가능하다. 함수 내에서 param을 수정하기 위해선 inout param으로 선언하면 되는데, 함수 선언부에서 param앞에 '&'를 표시해주면 된다. Function typefunction type을 다른 function의 param의 타입으로 사용할 수 있다. 함수의 타입이 들어가는 부분에 '(Int, Int) -> Int'와 같이 일반 함수 선언 부에서 함수명의 뒷부분을 적어주면 된다. function type을 사용해서 함수를 param으로 사용할 수 있다. ex)func addTwoInts(a: Int, b: Int) -> Int { return a + b} func printMathResult(ma..

[Swift] Swift Study 1주차 요약 (Alias, Tuple, Optional, Range operator ... etc)

Swift에 입문하기에 앞서 Swift의 전반적인 syntax에 먼저 익숙해지자. /*************************************************************************/ Type alias기존의 타입들을 대체하는 키워드를 정의할 수 있다. 팀내에서 정의된 타입을 사용할 때는 편리할 수 있으나 무분별한 type alias의 사용은 code의 readability를 저해할 것 같다. ex)typealias AudioSample = UInt16 var maxAmplitudeFound = AudioSample.min// maxAmplitudeFound is now 0’ Tuple다수의 value들을 하나의 compound value로 사용할 수 있도록 해준다. e..

[iOS] 멀티코어 개발자를 위한 애플의 선물 GCD – Grand Central Dispatch

CPU 벤더들의 클럭 경쟁에서 멀티코어 형태의 경쟁으로 패러다임이 바뀐 지금. 서버 뿐 아니라 PC 그리고 모바일 단말에 사용되는 OS는 프로그래머들에게 멀티 코어 프로세싱을 지원해 줘야하는 숙명을 가지게 되는데.. 이에 애플은 스노우 레오파드를 발표할 때 두가지 큰 기술을 개발자들에게 선물했다.하나는 GCD (Grand Central Dispatch), 나머지 하나는 OpenCL 이다. GCD는 쉽게 말해 멀티코어 프로세서를 위한 Thread 프로그래밍을 OS에서 자동 관리 / 분배 해 주는 Mac OS에 내재된 C Library이다. 이말은 즉 프로그래머에게 자신이 만든 Thread를 어떻게 멀티코어 프로세서에 분산 시킬 것인가에 대한 고민을 없애 주었다는 말이다. 이 이야기는 나중에 보다 심도 있게..

[Objective C] Notification 사용하기

객체지향 프로그래밍에서 객체간 메시지를 주고 받는 상황을 비일비재하게 발생하게 됩니다. 객체간의 연관 관계가 존재한다면 단지 객체의 메소드를 호출하는 것만으로 메시지를 전달이 가능합니다. 하지만 객체간 연관 관계가 존재하지 않는다면 메시지를 존재하기 복잡해집니다. 이를 해결하기위해 제공하는 방법 중에 한 가지를 소개하겠습니다. 바로 Notification입니다. 메시지를 송신할 객체는 NSNotificationCenter를 통하여 Notification을 송신하기 위한 객체를 받습니다. NSNotificationCenter의 [postNotificationName: object: userInfo:]를 통하여 Notification을 보내면 됩니다. 그러면 메시지를 수신할 객체는 어떻게 수신해야할까요? 수..

[Objective C] iOS에서 진동 구현

iOS에서의 진동 구현은 안드로이드에 비해 간단하다. 반면 iOS 정책상으로 진동의 패턴과 길이는 조절할 수 없다. 조절한다고 해도 Reject의 대상이 되기 때문에 앱 스토어에 올릴 수 없다. 참고 바란다. 먼저 진동을 구현하기 위해서는 AudioToolbox Framework를 import 해줘야 한다. 위의 그림처럼 프레임워크를 추가한 다음에 다음의 코드를 헤더파일에 추가한다. #import 위와 같이 하면 import과정이 다 끝난다. 이제 진동을 사용하는 부분에 밑의 코드 한 줄만 추가하면 된다. 진동 구현이 안드로이드에 비해 상당히 간편하다 AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

[Objective C] Thread 사용하기

안드로이드와 iOS의 스레드 사용법은 완전히 다르다. NSThread *t1 = [[NSThread alloc] initWithTarget:self selector:@selector(threadFunc:) object:nil];[t1 start]; 위와 같이 스레드를 생성해서 이용하면 된다. threadFunc로 스레드의 역할을 정의해주면 된다. 자바의 Thread의 run()이라고 생각하면 이해가 쉽다. 스레드를 종료시킬 때는 스레드를 강재로 죽이는 것보다는 스레드의 실행단위가 완료될 수 있도록 간접적으로 죽이는 방법이 전반적으로 선호된다. 특히 iOS는 시스템의 안전성을 위해서 간접적으로 죽이는 방법만 허용한다. [t1 cancel]; cancel을 사용하여 내부의 flag 값을 바꾸어 종료 시키는 ..