오늘의 주제

Objective-C의 상수와 스위프트의 상수


안녕하세요 야곰입니다.

Objective-C를 쓰다가 스위프트로 넘어왔을 때 고민되었던 부분 중의 하나인 스위프트의 상수에 관해 이야기해 보려 합니다.


혼자 프로젝트를 진행하다 보면 상수의 필요성을 많이 느낄 수 없을지 모르지만, 누군가 협업을 하게 된다면, 혹은 미래 또는 과거의 나와 협업(?)을 하게 된다면 상수의 필요성을 많이 느끼게 됩니다. 바꾸면 안 되는 데이터를 실수로 바꿔서 난감했던 경험이 없나요? 혹시 그런 적이 있다면 상수의 필요성에 대해서는 많이 공감하실 것으로 생각됩니다.


* 오해가 생길 소지의 표현들이 있어서 처음 발행 이후 조금 수정하였습니다. 좋은 의견 주신 과니님 고맙습니다 :)


사라진 const


사실 저는 Objective-C에서 특별한 경우가 아니면 const를 많이 사용하지 않았습니다(반성).


그런데 스위프트에서는 전역이든 지역이든 데이터를 저장할 공간(변수 또는 상수)에는 var 또는 let을 사용하여 변수인지 상수인지 명확히 명시해 주어야 하므로 상수에 대한 고민을 많이 하게 되었습니다.


사실 지역상수가 필요한 경우에 const 키워드를 쓰는 귀찮음 때문에 상수를 많이 사용하지 않았는데 스위프트에서는 var 또는 let을 선택해야 하는 시간이 조금 걸렸지만, 지금은 큰 시간 들일 필요 없이 자연스럽게 상수를 많이 사용하고 있습니다. 또, 혹시라도 상수로 사용해야 하는 경우임에도 변수로 선언하고 사용한다면 Xcode에서 변수 대신 상수를 사용하는 게 어떻냐는 경고를 보여줍니다. 




[Xcode의 경고]


지역상수


지역상수를 사용하는 경우에는 사실 Objective-C와 크게 다를 바 없이 사용할 수 있습니다. 상수의 이름을 지어주는 명명법도 크게 다를 바 없습니다. 

상수로 사용할 변수 앞에 const를 붙여 쓴 것처럼 let을 사용하여 상수를 선언하여 사용하면 됩니다.



// Objective-C
const NSInteger someConstant = 100;


// Swift
let someConstant: Int = 100



전역상수


전역상수를 사용할 때 조금 더 생각해보아야 할 것들이 있습니다. 저는 처음 스위프트를 사용할 때 별생각 없이 Objective-C에서 사용하던 것과 같은 명명법으로 전역상수를 사용했습니다.


// Objective-C NSInteger const  YGSomeGlobalConstant = 100;


// Swift
let YGSomeGlobalConstant: Int = 100


그런데 Objective-C에서 'YG'와 같이 접두어(prefix)를 붙이는 것은 Objective-C에는 네임스페이스(name space)가 없기 때문인데, 스위프트에는 이 단점을 극복했다는 것에 대한 생각이 문득 스쳤습니다.


Objective-C에는 네임스페이스가 없어서 전역변수를 선언하고 사용할 때 꽤 골치가 아팠습니다. 귀찮기도 아주 귀찮았죠. 이름도 매우 길어지기만 했습니다. 열거형(enum)은 정수밖에 지원하지 않기 때문에 다른 타입의 값들은 관련된 상수끼리 묶어 쓰기도 어렵기도 했지요.


// Objective-C의 상수들... // 네임스페이스가 없기 때문에 // 연관된 상수들을 접두어를 사용하여 표현합니다 // 요일 상수들 NSString *const YGWeekMonday = @"MON"; NSString *const YGWeekTuesday = @"TUE"; NSString *const YGWeekWednesday = @"WED"; NSString *const YGWeekThursday = @"THU"; NSString *const YGWeekFriday = @"FRI"; NSString *const YGWeekSaturday = @"SAT"; NSString *const YGWeekSunday = @"SUN"; // 네트워킹 관련 상수들 NSTimeInterval const YGNetworkingTimeoutInterval = 10.0f; NSUInteger const YGNetworkingMaxRetryCount = 3; NSString *const YGNetworkingBaseURLString = @"https://abc.com";


정말 보기만 해도 정신이 없습니다. 또, 실수로 복사 붙여넣기를 하다가 중복된 값을 넣었다면 컴파일 오류가 발생하지 않기 때문에 실수를 찾아내기도 매우 어려워집니다.


스위프트에서는 이런 전역 상수들을 조금 더 멋진 방법으로 표현해 볼 수 있습니다. 타입 내부에 다른 타입을 정의하는 방법으로 네임스페이스를 사용할 수 있습니다. 더군다나 네임스페이스 덕분에 접두어는 더 이상 스위프트에서 사용하지 않습니다.


// Week라는 구조체 타입 내부에
// 여러 타입 상수를 선언
struct Week {
    static let mon: String = "MON"
    static let tue: String = "TUE"
    static let wed: String = "WED"
    static let thu: String = "THU"
    static let fri: String = "FRI"
    static let sat: String = "SAT"
    static let sun: String = "SUN"
}

// 실제 사용시 Week.mon // "MON" Week.sat // "SAT"


처음에 이렇게 선언해 보았습니다. 그런데 만약 복사 붙여넣기를 하다가 실수로 중복된 값을 넣는다면...? 가령 "SUN"을 넣어야 하는데 "SAT"를 넣어버렸다면? 이때는 중복 값이 들어있는지 확인할 수 없습니다. 물론 의도적으로 다른 이름의 상수에 같은 값을 넣을 수도 있지만 그렇지 않은 경우에는 낭패입니다.


그래서 이렇게 개선해 봅니다.


// 열거형의 연관 값(associated value)을 사용하여
// 상수처럼 사용
enum Week: String {
    case mon = "MON"
    case tue = "TUE"
    case wed = "WED"
    case thu = "THU"
    case fri = "FRI"
    case sat = "SAT"
    case sun = "SUN"
}

// 실제 사용시 Week.mon.rawValue // "MON" Week.sat.rawValue // "SAT"



이렇게 사용하면 열거형 내부의 연관 값이 중복되는 경우에 컴파일오류가 발생하게 됩니다. 그래서 미리 실수를 발견하기도 좋습니다.


또, 위의 Objective-C로 선언했던 네트워킹 관련 상수를 스위프트에서 선언한다면 이렇게 바꿔볼 수 있을 것 같습니다.


// Objective-C NSTimeInterval const YGNetworkingTimeoutInterval = 10.0f; NSUInteger const YGNetworkingMaxRetryCount = 3; NSString *const YGNetworkingBaseURLString = @"https://abc.com";
// 사용 YGNetworkingTimeoutInterval // 10.0


// Swift
struct Networking {
    static let timeoutInterval: TimeInterval = 10.0
    static let maxRetryCount: Int = 3
    static let baseURL: URL? = URL(string: "https://abc.com")
}

// 사용

Networking.timeoutInterval // 10.0


이처럼 꼭 열거형의 연관 값을 사용하지 않고 용도에 맞게 구조체의 타입 상수(static let)로 사용해도 좋습니다. 


상수뿐만 아니라 전역변수, 전역함수(메서드) 등에도 충분히 응용할 수 있습니다.


또한 구조체 내부에 다른 타입(구조체, 클래스, 열거형) 등등 몇 단계를 걸쳐 내부 타입을 정의할 수 있기 때문 연관된 값을 타입의 타입의 타입까지 여러 번에 걸쳐 정의도 가능합니다.



struct CalendarItem {
    typealias Year = Int
    typealias Day = Int
    
    enum Week: String {
        case mon = "MON", tue = "TUE" //...
    }
    
    enum Month: Int {
        case jan = 1, feb, mar //...
    }
    
    static let startYear: Int = 1970
    static let startMonth: CalendarItem.Month = .jan
    
    struct Date {
        var day: Day = 1
        var weekDay: CalendarItem.Week = .mon
        var month: CalendarItem.Month = .jan
        var year: Year = CalendarItem.startYear
    }
}

var userBirthday: CalendarItem.Date userBirthday = CalendarItem.Date.init(day: 10, weekDay: .tue, month: .mar, year: 2017)



마치며


같은 Cocoa 플랫폼 위에서 코드를 작성하는데도 불구하고 역시나 언어의 특성을 살려 새로이 구조를 설계하기는 쉽지 않습니다 하핳


무언가 두서없이 써내려간 느낌입니다만, 잘 이해가 가지 않거나 궁금한 점이 있다면 댓글 남겨주세요 :D





by yagom

facebook : http://www.facebook.com/yagomSoft

facebook group : https://www.facebook.com/groups/yagom/


p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


저작자 표시 비영리 변경 금지
신고
Posted by yagom


오늘의 Tip

1. CocoaPods이란?

2. CocoaPods 설치

3. Pod 설치

4. Pod 찾아보기


안녕하세요 야곰입니다.

오늘은 코코아팟에 대한 이야기를 해보려고 합니다.


# CocoaPods이란?


iOS 및 macOS, tvOS 등 애플 플랫폼에서 개발을 할 때, 외부 라이브러리를 관리하기 쉽도록 도와주는 의존성 관리 도구들이 있습니다. CocoaPods는 애플 플랫폼을 위한 의존성 관리도구의 일종입니다. 애플 플랫폼에서 사용할 수 있는 의존성 관리 도구의 대표적인 예로는 [CocoaPods], [Carthage], [Swift Package Manager] 등이 있습니다.


더 자세한 설명은 이미 써두신 분들이 많아 링크를 드립니다.


CocoaPods에 대해 설명하고 있는 문서 링크


# CocoaPods 설치 및 Pod 설치


가장 빠른 것은 아래 영상을 보고 따라하는거예요.






영상을 보기 싫은 분들을 위해 텍스트 설명


# CocoaPods 설치


쉽습니다. 별로 할 게 없어요. 맥을 사용하고 있다면 터미널을 열어서 명령어 한 줄만 입력하면 됩니다.

아무 반응이 없더라도 기다리세요. 설치가 되고 있습니다. 처음에 꽤 오래 걸립니다. 그러니 차분히 기다리세요.


sudo gem install cocoapods


# Pod 설치


CocoaPods를 통해 가져올 수 있는 라이브러리를 Pod이라고 할 수 있습니다. 


먼저 현재 내가 진행하고 있는 프로젝트 폴더에 Podfile 이라는 이름의 파일을 생성합니다. 이 Podfile을 통해 CocoaPods이 라이브러리 의존성을 파악하게 됩니다.


원하는 라이브러리는 cocoapods.org에서 검색해 보는 것이 가장 쉽고 빠릅니다. 검색하여 찾은 라이브러리의 pod spec을 복사하여 Podfile에 붙여넣어줍니다.


파일을 저장한 후 터미널에서 (프로젝트 경로에서)아래 명령어를 입력해줍니다.


pod install


그러면 기존 프로젝트 파일 외에 워크스페이스 파일이 별도로 생성되는데, 이제 그 워크스페이스 파일로 작업을 진행하면 됩니다.



# Pod 설치


그러면 도대체 쓸만한 Pod은 어디서 찾을까요?


일단 CocoaPods를 통해 제공되는 라이브러리는 모두 cocoapods.org에서 찾아볼 수 있는데요, 

UI를 미리 보고 싶다면 cocoacontrols.com도 추천합니다.

각종 UI/UX 라이브러리들이 모여있고, 미리보기, 라이센스 확인도 모두 가능합니다.




Download Source를 선택해 들어가면 대부분 github 페이지로 이동합니다.

github 페이지의 README 파일에 보면 대부분 cocoapods을 통해 설치할 수 있는 pod 정보도 설명이 되어있습니다.




그런데 더 놀라운 곳이 있습니다! 양이 너무 많아 무얼 써보아야 할지 모르지만~ 

[Awesome iOS]에 많은 라이브러리 목록이 있습니다. 

UI만 또 모아놓은 곳도 있구요~ [Awesome iOS UI]


이제 손쉽게 라이브러리를 검색하고 의존성 관리도 손쉽게 해보세요!








by yagom

facebook : https://facebook.com/yagomsoft

facebook group : https://www.facebook.com/groups/yagom/


p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


저작자 표시 비영리 변경 금지
신고
Posted by yagom


iOS 오픈 라이브러리 모음


제가 자주 사용하는 라이브러리들을 모아봤습니다. 

개인 취향이나 세부목적에 쓰는 기능이 아닌 보편적으로 쓸 수 있는 기능들을 위주입니다.
누군가에게는 도움이 되면 좋겠네요 :D

* [] 안에 표시된 이름은 Objective-C로 작성된 유사 라이브러리입니다.


* 유틸리티


Alamofire [AFNetworking]

말이 필요없는 네트워킹 라이브러리죠! 

Swift로 쓰여졌으며 대부분의 네트워킹 기능을 아주 멋드러지게 구현해두었습니다. 

형제로는 Objective-C로 쓰여진 AFNetworking이 있습니다.


https://github.com/Alamofire/Alamofire

https://github.com/AFNetworking/AFNetworking




SwiftyJSON [JSONModel]

스위프트에서 JSON 다루기 정말 귀찮으시죠? 
스위프트에서 JSON을 손쉽게 다룰 수 있도록 기능이 구현되어있는 라이브러리입니다.




ObjectMapper

모델 객체를 JSON과 손쉽게 상호 변환할 수 있는 라이브러리입니다.

Alamofire, Realm 등 다른 라이브러리와도 손쉽게 연계할 수 있습니다.

[전수열님 추천] <- 심지어 전수열님은 이 라이브러리의 Contributor로 활동하고 계시죠 꺅


https://github.com/Hearst-DD/ObjectMapper




Kingfisher [SDWebImage]

웹 서버에 있는 이미지를 손쉽게 가져올 수 있으며, 캐싱 등의 처리를 알아서 관리해주는 라이브러리입니다. 
다양한 옵션으로 캐싱과 이미지 로딩 방법 등을 손쉽게 제어할 수 있습니다.






RealmSwift [RealmCocoa]

Realm 모바일 데이터베이스는 SQLite와 CoreData를 대체할 수 있는 크로스 플랫폼 모바일 데이터베이스로 무료 오픈소스로 제공됩니다. 
iOS 뿐만 아니라 안드로이드, React Native, Xamarin 등 여러 플랫폼에서 사용할 수 있습니다. 
Realm 모바일 데이터베이스를 사용하면 데이터 모델을 따로 만들고 않고도 리액티브 데이터 레이어를 쉽게 구현할 수 있으면서 성능이 최적화된 앱 개발에 도움이 됩니다.

CoreData를 감싼 라이브러리가 아니라 완전히 새로운 데이터베이스입니다. 렘이라고 읽습니다. 
렘 모바일 플랫폼(https://realm.io/docs/get-started/overview/#the-realm-mobile-platform)을 사용하면 서버와 손쉬운 데이터베이스 동기화도 가능합니다.




Then

대한민국의 짱짱 iOS 개발자 전수열느님[https://github.com/devxoul]이 만든 라이브러리입니다. 

클로저를 사용하여 인스턴스를 생성한 뒤 원하는 처리를 해줄 수 있습니다. 코드가 분산되지 않고 깔끔해집니다!


https://github.com/devxoul/Then




CoreStore

CoreData를 손쉽고 안전하게 관리할 수 있도록 도와주는 라이브러리입니다. 학습비용이 조금 있습니다만, 코어데이터를 조금 더 쉽게 운용할 수 있습니다.





SugarRecord

CoreData와 Realm 데이터베이스를 손쉽게 사용할 수 있도록 감싸놓은 라이브러리입니다. 

두 데이터베이스 종류에 상관없이 손쉽게 데이터베이스를 운용할 수 있습니다.


https://github.com/carambalabs/SugarRecord




Google Analytics Service

사용자 분석과 로그분석, 크래시 분석에 유용하죠. 구글 분석 툴.


https://developers.google.com/analytics/devguides/collection/ios/v3/sdk-download



Fabric

최근에 구글로 인수된 트위터의 사용자 분석 및 인증 도움 라이브러리입니다. 여러 기능을 포함하고 있습니다. 

저는 주로 사용자분석에 많이 활용하고, 크래시리틱스를 통해 크래스 로그 분석에 사용합니다.


https://get.fabric.io





* UI/UX


SnapKit

오토레이아웃을 코드로 구성할 때 매우 편리하게 작성할 수 있게 도와주는 라이브러리입니다. 즉, 손쉬운 오토레이아웃 코드 작성 라이브러리! 


https://github.com/SnapKit/SnapKit




DZNEmptyDataSet

테이블 뷰나 컬렉션 뷰 등에 데이터가 없을 때 보여줄 수 있는 심플한 화면을 손쉽게 관리할 수 있는 라이브러리입니다.


https://github.com/dzenbot/DZNEmptyDataSet





TextFieldEffects

텍스트필드에 다양한 효과를 줄 수 있는 라이브러리입니다.

 텍스트 필드에 다양한 애니메이션을 손쉽게 넣어줄 수 있습니다.


https://github.com/raulriera/TextFieldEffects





RETableViewManager

테이블뷰를 통해 여러종류의 입력을 받을 때 매우 유용하게 사용할 수 있는 라이브러리입니다. 

내 코드에서 테이블뷰 delegate와 dataSource 메서드를 구현해줄 필요도 없습니다.

커스터마이징도 자유롭게 제공합니다. 

조금의 학습비용이 있지만 제대로 사용할 줄 알면 편하게 테이블뷰를 다룰 수 있습니다.


https://github.com/romaonthego/RETableViewManager




Spring

애니메이션을 손쉽게 구현할 수 있는 라이브러리입니다. 

다양하고 연속적인 애니메이션을 간단한 코드로 사용할 수 있습니다. 

코드 뿐만 아니라 스토리보드에서도 옵션 설정이 가능합니다.


https://github.com/MengTo/Spring




SVProgressHUD

로딩 팝업 등을 손쉽고 예쁘게 보여줄 수 있는 라이브러리입니다. 

다양한 옵션과 모양이 있어 어떤 앱에서도 사용하기 좋습니다.


https://github.com/SVProgressHUD/SVProgressHUD



iRate

사용자에게 언제, 어떻게 앱스토어 리뷰를 제안해야 할지 고민이 많다구요? 

iRate를 사용하면 시기 적절하게 앱스토어 리뷰를 요청할 수 있습니다. 

짜증나지 않는 선에서 알아서 간간히 앱스토어 리뷰를 요청합니다.


https://github.com/nicklockwood/iRate



SCAlertView

손쉽게 알림창(Alert)를 보여줄 수 있는 라이브러리입니다. 커스터마이징이 쉽고 깔끔하게 동작합니다.


https://github.com/vikmeup/SCLAlertView-Swift



MGSwipeTableCell

테이블뷰의 셀을 Swipe(옆으로 밀어 끌기) 했을 때 다양한 애니메이션과 메뉴 옵션을 제공하는 라이브러리입니다. 


https://github.com/MortimerGoro/MGSwipeTableCell



Charts

예쁜 차트를 손쉽게 그리고 관리할 수 있는 라이브러리입니다. 크으~


https://github.com/danielgindi/Charts



PagingMenuController

세그먼트 컨트롤 또는 툴바 등을 사용한 여러 메뉴를 한 화면에 보여주는 경우 스와이프 제스쳐로 페이징이 가능하도록 할 수 있는 라이브러입니다. 

iOS에서 권장하는 UX는 아니지만 종종 필요한 경우 유용합니다.


https://github.com/kitasuke/PagingMenuController




Hero

다양한 인터렉션을 통해 뷰 컨트롤러 간에 전환(transition)을 손쉽게 구현할 수 있는 라이브러리입니다. 
다양한 제스쳐와 전환 애니메이션을 제공합니다. 강추!
[윤병훈님 추천]





* 폰트/디자인


Chameleon

디자인 감각이 없는 사람도 예쁜 색 조합을 맞출 수 있습니다. 

최근 베타로 테마기능을 넣어서 테마만 설정해주면 앱 전반적으로 플랫 색상을 지정해줍니다. 

개인 개발자에게 매우 유용!


https://github.com/ViccAlexander/Chameleon




FontAwesomeKit

다양한 아이콘 폰트를 사용할 수 있는 라이브러리. 

웹에는 Font Awsome이 있다면 iOS에는 FontAwsomeKit이 있습니다!


https://github.com/PrideChung/FontAwesomeKit



FontBlaster

외부 서체(폰트)를 손쉽게 가져와서 활용할 수 있도록 도와주는 라이브러리입니다. 

기본 폰트가 아닌 앱 전용 폰트를 사용한다면 매우 유용하게 사용할 수 있습니다.


https://github.com/ArtSabintsev/FontBlaster



Material

메테리얼 디자인을 위한 라이브러리입니다. 

다양한 메테리얼 애니메이션과 그래픽 요소들이 포함되어 있습니다.


https://github.com/CosmicMind/Material




* 보너스

PinterestSwift

라이브러리는 아니지만 Pinterest와 같은 화면 이동을 구현해놓은 샘플코드입니다. 참고해볼 만한 코드.








유용한 라이브러리를 찾으셨나요?

더 좋은 라이브러리, 추천하고 싶은 라이브러리가 있다면 덧글로 알려주세요~! 한 번 모아볼까요? :D
 



by yagom

facebook : https://facebook.com/yagomsoft

facebook group : https://www.facebook.com/groups/yagom/


p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


저작자 표시 비영리 변경 금지
신고
Posted by yagom


What's New in Cocoa Touch

WWDC 2016 - Session 205 



WWDC 2016 세션 205의 주제인 What's New In Cocoa Touch 요약정리입니다.

이 포스트는 세션 205요약 중 네 번째(마지막) 글입니다.


지난 포스팅

  1. 2016/08/13 - [WWDC/WWDC2016] - What's New in Cocoa Touch [Session 205] 1/4
  2. 2016/09/05 - [WWDC/WWDC2016] - What's New in Cocoa Touch [Session 205] 2/4
  3. 2016/12/16 - [WWDC/WWDC2016] - What's New in Cocoa Touch [Session 205] 3/4


이번 포스팅에선 아래 주제를 정리합니다.


# Integrating with iOS

  • Keyboards Extensions
  • Widgets
  • User Notifications
  • CallKit
  • SiriKit
  • Intents Extensions
  • IntentsUI Extensions
  • Intents are Shared
  • iMessage Apps



# Integrating with iOS

iOS와 좀 더 통합할 수 있는 방법을 안내합니다. iOS 10에는 새로운 확장 지점(Extension points) 몇 가지가 추가되었습니다. 바로, 메세지, 시리, 통화(CallKit)입니다.


  • Keyboards Extensions

키보드와 같이 기존에 존재했던 익스텐션도 발전시켰습니다. 키보드 언어 선택 키인 지구본 키를 이제는 키보드 익스텐션에서 사용할 수 있습니다.

사용자가 상호작용하고 있는 언어에 대한 힌트도 제공합니다. 이를 통해 서드파티 익스텐션에서도 수월하게 다양한 언어 지원을 할 수 있습니다.


  • Widgets

위젯의 새로운 디스플레이 모드도 추가되었습니다. 

기존에는 개발자가 위젯사이즈를 조절하였다면 이제는 사용자가 사이즈를 조절할 수 있도록 제공할 수 있습니다.

컴팩트 모드는 위젯의 높이가 고정되어있습니다. 확장 모드는 높이가 가변적입니다. 


새로이 제공되는 API를 통해 이 화면이 어떤 모드로 변경되는지 알 수 있습니다. 또, 개발자가 이 API를 통해 화면의 최대 사이즈를 제공할 수 있으며, 어떤 모드까지 제공할지도 지정할 수 있습니다. 화면을 통해 보여질 정보들을 사용자화 할 수 있게 된 것입니다.


위젯은 잠금화면에서 표시되는 화면이므로 이곳에 표시될 정보를 잘 생각해 보아야 한다는 것입니다. 항상 일관적이고, 프라이버시를 크게 해치지 않은 한도 내에서 정보를 구성해야 할 것입니다.


  • User Notifications

iOS 10의 사용자 알림(user notification)은 완전히 새로워졌습니다.


같은 기능을 새로운 프레임워크에 구현하면서 발전을 시켰습니다. 첫째로 로컬 알림(local notification)과 원격 알림(remote notification)을 통합했습니다. 그렇기 때문에 알림을 관리하기 더욱 쉬워졌습니다. 

또 하나의 발전은, 화면에서 알림이 표시되기 전에 먼저 개발자에게 알려줍니다. 그렇기 때문에 앱에서 스스로 알림을 처리하기 훨씬 용이해졌습니다. 그리고 이런 점은 모든 플랫폼에 동일하게 적용됩니다.

여기에 더불어 두 개의 익스텐션을 추가했습니다. 


첫 번째 익스텐션은 서비스 익스텐션입니다.

서비스 익스텐션은 알림이 화면에 실질적으로 표시되기 전에 부가적인 정보를 삽입할 수 있도록 할 수 있습니다. 그렇기 때문에 알림이 화면에 표시되기 전에 미디어를 삽입하는 등 처리할 일들을 미리 처리할 수 있습니다. 

또 하나의 기능은 단말간 암호화입니다. 서버와 로컬 디바이스에서 모두 암호화 합니다. 그렇기 때문에 서버에서 무엇인가 전달 받으면 로컬 디바이스에서 복호화 해야합니다. 


또 다른 익스텐션은 사용자 알림(user notification) 프레임워크입니다. 알림에 UIView를 포함시킬 수 있습니다. 하지만 그 뷰와 직접적으로 상호작용(interaction)을 할 수는 없습니다. 그렇지만 알림 액션을 사용할 수 있습니다(액션시트 메뉴처럼).


알림에 대해 더 알고 싶다면 [Introduction to Notifications]와 [Advanced Notifications]세션을 참고하세요.


  • CallKit

콜킷(CallKit)또한 iOS 10의 새로운 프레임워크입니다. 주소록(전화번호부, directory) 익스텐션은 수신 통화를 차단하는 것을 설정할 수 있습니다. 수신 전화를 완벽히 제어할 수 있습니다.

전화번호의 신원을 확인하여 화면에 레이블(label)로 표시해 줄 수 있습니다. 전화가 들어올 때 시스템에서 주소록을 찾아보고 해당하는 번호가 없다면 익스텐션을 통해 신원을 확인하게 됩니다.


콜킷의 제일 강력한 기능은 전화제공(call provider) API일 것입니다. 전화제공 API를 통하면 보이스오버 IP 애플리케이션이 마치 시스템 기본 전화기능인 것처럼 사용할 수 있습니다. 보이스 오버 전화를 수신 할 때 기본 전화가 온 것처럼 전체 화면으로 수신을 알릴 수 있으며, 즐겨찾기, 최근통화 목록 등에도 표시됩니다.

시리를 지원할 수도 있으며, 카플레이(CarPlay)를 지원할 수도 있습니다. 잠자기 모드와 블루투스 기능과도 연동됩니다.

콜킷(CallKit)과 관련된 자세한 내용은 [Enhancing Voice Over IP apps with CallKit] 세션을 참고하세요.


  • SiriKit

다음은 시리(Siri)입니다. 여러분들은 아마 모르겠지만, 시리는 상황에 맞게 동작하고 있습니다. 홈버튼을 길게 눌러 시리를 실행할 때와, 시리야 기능일 사용하여 실행할 때와, 카플레이 중에 사용할 때, 손쉬운 사용을 통할 때 등등 각각의 다른 상황에 맞게 시리 스스로 튜닝을 합니다. 이는 매우 복잡한 작업입니다. 인식 경로라던지 분야 또는 국가, 아니면 현재의 환경 따위를 고려해야 하기 때문입니다. 그런데 이것들은 시리 익스텐션을 사용할 때 자동으로 처리해 줄 것입니다.

시리킷에서 제공하는 요청을 표현하는 의도(intent representing the request)를 통해 상호작용 할 수 있습니다.


  • Intents Extensions

시리킷을 통해 자신의 애플리케이션 또는 사용자 별로 사용할 단어들을 지정할 수 있습니다. 의도 익스텐션(intents extension)을 통해 시리와 당신의 애플리케이션이 서로 상호작용 할 수 있습니다. 의도에 따라 시리가 당신의 애플리케이션에 요청을 하고 그에 적절하게 응답할 수 있습니다. 그렇기 때문에 메세지 분야의 애플리케이션이라면 메세지를 보내고자 할 때 시리가 인식할 단어들을 제공해주면 됩니다. 시리가 의도를 파악하여 당신의 애플리케이션과 상호작용 할 것입니다.


  • IntentsUI Extensions

시리킷에 해당하는 두 번째 익스텐션이 있습니다. 의도 UI 익스텐션입니다. 이 익스텐션은 선택사항이지만 시리 화면에서 UI를 표현할 수 있기 때문에 사용자가 더욱 명확히 확인하도록 할 수 있습니다.


  • Intents are Shared



의도 시스템은 꼭 시리에만 국한되는 것은 아닙니다. 의도 시스템은 요청을 표현하는 방법입니다. 물론 이 방법이 시리와 애플리케이션과 소통하는데 사용됩니다. 그렇지만 이 시스템이 어떻게 콜킷과도 관계를 가질 수 있는지 보여드리겠습니다. 즉, 어떻게 애플리케이션의 익스텐션끼리 공유할 수 있는지 볼 수 있다는 뜻입니다. 사용자가 무엇을 하는지 시스템과 정보를 공유해야 합니다. 예를 들어, 메세지 앱이라고 한다면 WWDC 챗 애플리케이션을 통해 메세지를 전송하고 싶다고 말한다면, 연락처 UI에서 연락처에 관한 정보를 자동으로 보여줄 것입니다. 그리고 사용자의 의도를 파악하여 액션 목록에 당신의 애플리케이션을 보여줄 수 있습니다. 게다가 연락처 앱의 기본 메세지 앱으로 당신의 앱을 등록할 수도 있습니다.


  • iMessage Apps

마지막으로 iMessage 앱입니다. 이제 메세지 앱은 하나의 플랫폼이 되었고, 애플은 두 가지 기능을 덧붙였습니다. 하나는 스티커팩이고, 또 하나는 메세지 익스텐션입니다. 


스티커팩은 코드가 필요하지 않습니다. 정적이거나 동적인 이미지들로만 패키지를 구성하고 Xcode를 사용하여 이미지를 메세지 스토어에 배포하기만 하면 됩니다. 


iMessage 앱이 또 새로운 익스텐션을 사용할 수 있습니다. UIKit 기반의 익스텐션이고, 동적으로 스티커 컨텐츠를 생성할 수 있습니다. 이 익스텐션에서는 직접 카메라를 사용할 수도 있죠. 그리고 UI를 간단 모드(compact mode)와 확장 모드(expanded mode)로 구성하고, 메세지 앱에서 사용할 수 있습니다. 익스텐션을 사용하여 메세지 말풍선을 꾸밀수도 있습니다. 



또, 말풍선을 꾸밀 수 있을 뿐만 아니라, 사용자와 상호작용 하도록 만들 수도 있습니다.


iMessage 애플리케이션과 메세지, 스티커 등에 대해서 더 자세히 알고 싶다면 [iMessage Apps and Stickers, Part 1]와 [iMessage Apps and Stickers, Part 2]세션을 참고하세요.









# 간단요약

Keyboards Extensions

  • 사용자의 의도에 따라 자동으로 언어 변경 가능
  • 키보드 익스텐션에서 기본지구본(언어변경 버튼) 사용 가능


Widgets

  • 위젯의 크기를 사용자가 조절할 수 있는 디스플레이 모드 추가(컴팩트, 확장)


User Notifications

  • 로컬알림과 원격알림 통합
  • 알림이 화면에 표시되기 전에 적절한 전처리 가능
  • 알림에 UI화면을 포함할 수 있게됨


CallKit

  • 수신통화를 차단할 수 있음
  • 신원을 확인하여 레이블에 표시해 줄 수 있음
  • 서드파티 전화 애플리케이션을 전화 앱에 통합하여 목록에 표시해 줄 수 있음
  • 서드파티 전화 애플리케이션도 전화 수신 시 기본 전화 앱처럼 화면에 표시됨


SiriKit

  • 사용자의 의도에 따라 적절하게 애플리케이션과 상호작용


Intents Extensions

  • 사용자의 의도에 따라 시리와 애플리케이션 간의 상호작용을 제어


IntentsUI Extensions

  • 사용자의 의도를 명확히 하기 위해서 시리 화면에 UI를 표현할 수 있음


Intents are Shared

  • 사용자의 의도는 여러 방면으로 공유되어 상호작용 함


iMessage Apps

  • 메세지 앱에서 사용될 스티커팩을 만들어 배포할 수 있음
  • 메세지 앱의 말풍선을 꾸밀 수 있으며, 사용자와 상호작용 하도록 구성할 수 있음




* 잘못되거나 부족한 내용이 있다면 덧글 남겨주시면 감사하겠습니다.


by yagom

facebook : http://www.facebook.com/yagomSoft

facebook group : https://www.facebook.com/groups/yagom/


p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


저작자 표시 비영리 변경 금지
신고
Posted by yagom


What's New in Cocoa Touch

WWDC 2016 - Session 205 



WWDC 2016 세션 205의 주제인 What's New In Cocoa Touch 요약정리입니다.

이 포스트는 세션 205요약 중 세 번째 글입니다.


지난 포스팅

  1. 2016/08/13 - [WWDC/WWDC2016] - What's New in Cocoa Touch [Session 205] 1/4
  2. 2016/09/05 - [WWDC/WWDC2016] - What's New in Cocoa Touch [Session 205] 2/4
이번 포스팅에선 아래 주제를 정리하고, 나머지 주제는 다음 포스팅에서 이어집니다.

# Adopting System Features
  • Opening applications
  • Core Data
  • CloudKit
  • NSUserActivity
  • App Search
  • CoreSpotlight Search API
  • ReplayKit
  • SceneKit
  • Apple Pay



Adopting System Features



iOS 10에서는 굳이 신경써서 도입하지 않아도 알아서 적용될 많은 기능들이 있습니다.

애플리케이션을 향상시킬 새로운 기능들이 있습니다. 이 기능들은 애플리케이션 아키텍쳐를 조금 더 단순화 시켜줄 수도 있습니다.



이는 애플리케이션을 다른 기능들과 더욱 긴밀하게 통합하여 줍니다.


  • Opening applications


그 좋은 예로 먼저 openURL이 있습니다. 컴플리션 핸들러(completion handler)를 통해 URL 열기를 비동기적으로 수행하도록 만들었습니다. 유니버셜 링크(universal link)도 추가했습니다. 만약 예를 들어 SNS 앱에서 유니버셜 링크를 통해 다른 앱을 실행하려고 한다고 생각해 봅시다. 앱이 설치되어 있으면 그 해당 앱이 실행될 것입니다. 그러나 앱이 설치되어있지 않다면, 그것을 확인하여 현재 SNS앱에서 적절히 처리해 줄 수 있도록 해당 앱 설치여부를 확인할 수 있습니다. 이를 통해 컨텐츠를 통합하고 시스템 내부에서 이 애플리케이션들을 적절히 다룰 수 있습니다.

  • Core Data


다음은 코어데이터입니다. 먼저 쿼리 제네레이션(query generation)이라는 것을 살펴봅니다. 분리된 컨텍스트에서 메인UI를 위한 컨텍스트가 존재하고, 이것들은 백그라운드 큐에서 실행하는 것이 일반적입니다. 쿼리 제네레이션을 사용하면 메인UI의 모델을 한 버전에서 또다른 버전으로 변경하는 것을 정확히 제어할 수 있습니다. 이는 기존에 강제적으로 처리했던 것들을 더이상 강제적으로 처리하지 않아도 되는 것을 의미합니다. 왜냐하면 백그라운드 큐에서 무엇인가 변경되고, 메인UI가 새로운 버전의 데이터로 언제 변경될 것인지 정확하게 결정할 수 있게 되기 때문입니다. 이를 통해 코어데이터 코드를 조금 더 단순화 시킬 수 있습니다.

또 다른 기능은 커넥션 풀링에 관한 것입니다. 이제 저장소에서 다중 읽기를 완벽히 지원합니다. 이는 성능향상에 큰 도움이 됩니다. 

또, 코어데티어 관련 툴에 새로운 기능들이 추가되었습니다만, 이는 [What's New in Core Data]에서 더 자세히 알아보시기를 추천드립니다.  

  • CloudKit


데이터를 모델링 하는 방법에는 CloudKit을 이용하는 방법도 있습니다.CloudKit에는 이미 사용자별로 공개 데이터베이스와 개인 데이터베이스를 가질 수 있게 되어있습니다. iOS 10에서는 Record sharing이 추가되었습니다. 그래서 여러 사용자가 하나의 기록에 공동으로 접근할 수 있습니다. 




CloudKit을 사용하는 협업 기반의 애플리케이션은 UI흐름을 다루는 데에는 어려움이 있었습니다.

문서를 공동작업하는데 다른 사람을 어떻게 초대하나요? 정말 안전(secure)한 방법으로 이를 구현할 수 있나요? 그래서 UICloudSharingController를 만들었습니다. 이 뷰 컨트롤러는 UIKit을 통해 화면에 표현할 수 있으며, CloudKit에서 제공하는 recored sharing을 제어하는 새로운 공유 객체를 전달해주기만 하면 됩니다. 



이 뷰 컨트롤러는 초대 흐름을 관리할 수 있는 UI를 자동 생성해줍니다.



또, 초대한 사람들의 목록도 자동으로 생성해 줍니다. 이를 통해 CloudKit을 활용한 협업 기반의 애플리케이션을 조금 더 쉽게 구성할 수 있습니다. [What's New with CloudKit] 세션을 통해 조금 더 자세한 내용을 확인할 수 있습니다.


  • NSUserActivity


NSUserActivity는 애플리케이션의 상태를 캡쳐하는데 사용합니다. 이제껏 핸드오프나 스포트라이트 같은 곳에서 사용해 왔죠.

iOS 10에서는 user activity에 위치도 추가할 수 있습니다. 만약 주소를 다루는 애플리케이션이라면 이 주소에 관한 활동을 사용자에게 표현하고 제공할 수 있습니다. MapKit 아이템을 activity에 추가하여 전달하기만 하면 됩니다. 텍스트 필드의 제안 기능에서 이 주소는 유용하게 사용될 수도 있을 것입니다.

이는 지능과 액티비티 기반의 iOS 10 기능입니다.


  • App Search


NSUserActivity가 사용되는 다른 지점이 있습니다. 바로 검색입니다. iOS 9에서 인덱스된 액티비티가 추가되었습니다. 이 인덱스된 액티비티는 스포트라이트 검색에 노출되었습니다.



이제는 새로운 버튼(Search in App)을 통해 앱 내의 검색으로 바로 진입하여 이어갈 수 있습니다.



이 기능을 구현하려면 먼저 info plist파일에 CoreSpotlightContinuation 키를 추가해 줍니다. 그 후 새로운 UIApplicationDelegate 메서드를 구현해주면 됩니다.


  • CoreSpotlight Search API


iOS 9에서 CoreSpotlight를 통해 앱 내부의 컨텐츠를 인덱싱 할 수 있도록 지원했습니다. 이제는 스포트라이트에서 데이터를 검색할 수 있습니다. 스포트라이트 인덱스를 개방했습니다. 

검색 쿼리를 구성하고 요청을 보내면 애플리케이션의 데이터를 위한 스포트라이트 인덱스를 검색할 수 있습니다. 이를 통해 애플리케이션 내부의 데이터를 시스템에 직접 인덱싱 할 수 있습니다. 이와 관련해서 [Making the Most of Search APIs] 세션을 참고하면 됩니다. 이 세션에서는 continuation과 CoreSpotlight의 검색 등에 대해 자세히 다룹니다.


  • ReplayKit


기존의 ReplayKit은 애플리케이션의 화면을 기록하기 위한 방법이었습니다. 이제 iOS 10에서는 ReplayKit을 사용하여 라이브 스트리밍을 할 수 있습니다. 즉, 생방송이 가능합니다. 


  • SceneKit


SceneKit의 렌더링 엔진이 새로워졌습니다. 물리 기반 렌더링을 수행합니다. iOS 9에 비해 비약적으로 발전했습니다.


  • Apple Pay


사용자 측면에서 애플페이는 어떤 플랫폼을 사용하는지에 상관없이 모든 곳에서 사용할 수 있게 되었습니다. 이제는 iOS와 워치 뿐만 아니라, 웹에서도 애플페이를 사용할 수 있게 되었습니다.



개발자 측면에서 애플페이는 여러가지가 추가되었습니다. 

UIKit 기반의 애플리케이션에서만 지원되었던 애플페이가 많이 확장되었습니다. 

이제는 새로운 자바스크립트 프레임워크를 통해 사파리에서도 애플페이를 지원할 수 있습니다. 이는 SFSafariViewController에서 애플페이를 지원할 수 있게 되었다는 뜻이기도 합니다. 

또, UI가 아닌 코드에서도 애플페이를 사용할 수 있습니다. UI가 아닌 익스텐션에서 사용할 수도 있는데, iMessage 앱의 익스텐션에서 애플페이를 사용하는 것이 좋은 예가 되겠습니다. 이와 관련하여 자세한 내용은 [Apple Pay on the Web]과 [What's New with Wallet and Apple Pay]세션에서 확인해 볼 수 있습니다.




# 간단요약

Opening applications

  • 유니버셜 링크(universal link)를 통한 openURL이 개선되었음 - 비동기 처리, 다른 앱 설치 유무 미리 확인 등


Core Data

  • 쿼리 제네레이션(query generation)기능 추가
  • 동시 처리 성능 향상
  • 툴 발전


CloudKit

  • Record sharing 추가로 여러 사용자가 하나의 기록에 공동으로 접근가능
  • UICloudSharingController을 통해 문서 등의 여러사용자 협업관리를 수월하게 할 수 있음


NSUserActivity

  • NSUserActivity에 위치 정보 추가 가능


App Search

  • 스포트라이트검색의 Search in App 버튼을 통해 앱 내의 검색으로 바로 진입하여 이어갈 수 있음 - CoreSpotlightContinuation


CoreSpotlight Search API

  • 스포트라이트 인덱스를 개방하여 스포트라이트에서 애플리케이션 내부의 컨텐츠 뿐만 아니라 데이터도 검색할 수 있도록 변경


ReplayKit

  • ReplayKit을 사용하여 라이브 스트리밍을 할 수 있음


SceneKit

  • 새로운 렌더링 엔진 - 물리 기반 렌더링
  • iOS 9에 비해 비약적으로 발전


Apple Pay

  • 사용자가 iOS와 워치 뿐만 아니라, 웹에서도 애플페이를 사용할 수 있게 됨
  • 사파리에서도 애플페이를 지원(SFSafariViewController에서 애플페이를 지원가능)
  • UI가 아닌 익스텐션에서도 애플페이 사용가능





* 잘못되거나 부족한 내용이 있다면 덧글 남겨주시면 감사하겠습니다.

* What's New in Cocoa Touch [Session 205]의 나머지 내용은 다음 포스팅에서 이어집니다.


이어지는 다음 포스팅 내용


# Integrating with iOS

  • Keyboards Extensions
  • Widgets
  • User Notifications
  • CallKit
  • SiriKit
  • Intents Extensions
  • IntentsUI Extensions
  • Intents are Shared
  • iMessage Apps

2017/01/04 - [WWDC/WWDC2016] - What's New in Cocoa Touch [Session 205] 3/4



by yagom

facebook : http://www.facebook.com/yagomSoft

facebook group : https://www.facebook.com/groups/yagom/


p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   



저작자 표시 비영리 변경 금지
신고
Posted by yagom


What's New in Cocoa Touch

WWDC 2016 - Session 205 



WWDC 2016 세션 205의 주제인 What's New In Cocoa Touch 요약정리입니다.

이 포스트는 세션 205요약 중 두 번째 글입니다.


지난 포스팅

  1. 2016/08/13 - [WWDC/WWDC2016] - What's New in Cocoa Touch [Session 205] 1/4


이번 포스팅에선 아래 주제를 정리하고, 나머지 주제는 다음 포스팅에서 이어집니다.


# Building better user interfaces

  • Accessibility Inspector
  • Speech Recognition
  • Smarter Text Input
  • Dynamic Type
  • Improved Customization
  • Peek & Pop
  • Refresh Control
  • Collection View
  • Advanced in UIKit Animations



# Building better user interfaces

iOS 10에서 유저와 앱 간의 상호작용(interaction) 그리고 유저 인터페이스(UI)에 대해 생각해 봅니다.

가장 먼저 생각해 볼 것은 모든 사람이 여러분의 애플리케이션과 상호작용을 할 수 있도록 만드는 것입니다.


  • Accessibility Inspector
  • UI 요소의 접근성 프로퍼티를 곧바로 파악하고 연결할 수 있습니다.


    기기 또는 시뮬레이터에서 애플리케이션의 접근성 평가를 확인할 수 있습니다. 이를 통해 접근성 문제를 해결할 힌트를 얻을 수 있습니다.




  • Speech Recognition
  • 새로운 제스쳐와 음성 인식으로도 애플리케이션과 상호작용 할 수 있게 되었습니다. 

    간단한 API로 영어 뿐만 아니라 다른 언어도 인식합니다.


    SFSPeech 클래스를 통해 음성인식을 할 수 있습니다. 

    오디오 파일 또는 실시간 오디오 스트림에도 사용할 수 있습니다. 실시간 음성 분석이 가능하다는 뜻입니다.

    요청(request)를 통해 받아쓰기나 문자열을 통한 인식을 하도록 할 수 있습니다.

    결과(result)를 통해 콜백 받습니다. 쓰기 쉽대요.




  • Smarter Text Input
  • 텍스트 필드에 컨텐츠의 종류에 대해 정보를 추가할 수 있습니다. 이를 통해 빠른 입력을 지능적으로 제시할 수 있도록 할 수 있죠.

    예를 들어, 위치에 관련된 텍스트 필드라면 빠른 입력에서 주소를 볼 수 있습니다. 

    이메일, 전화번호, 신용카드 번호 등의 컨텐츠 종류를 표현할 수 있습니다.



  • Dynamic Type
  • iOS 7에서 추가된 동적 타입(dynamic type)의 기능이 iOS 10에서 더 추가되었습니다.

    동적 타입을 위해 컨텐츠 사이즈 카테고리를 만들었습니다.

    iOS 10 이전에는 컨텐츠 사이즈 카테고리는 UIApplication의 프로퍼티였습니다.

    사용자가 컨텐츠 사이즈를 변경하거나 하면 그에 대응하기 위해 노티피케이션을 수신하고 있어야 했습니다. 그렇지만 이제는 하나의 특성(trait)으로 통합되었기 때문에 노티피케이션을 수신할 필요가 없습니다.

    이제는 동적 타입을 익스텐션으로 사용이 가능합니다. 



    iOS 10에서는 UIKit에 이전부터 존재하던 관련 요소들에도 동적 타입을 적용하였습니다.

    텍스트와 관련된 UI 요소인 텍스트 필드, 텍스트 뷰, 레이블 등이 컨텐츠 사이즈 카테고리를 위한 글꼴 적용을 사용할 수 있게 되었습니다.



  • Improved Customization
  • UIKit에 사용자화(커스터마이징)이 대폭 추가되었습니다. 바 버튼 아이템이 그 좋은 예가 되겠습니다.

    탭바 아이템에 배치 색상을 사용자화 할 수 있으며, 텍스트에 속성(attributes)를 추가할 수 있습니다. 선택되지 않은 상태의 색상을 변경할 수도 있습니다.



  • Peek & Pop
  • 웹뷰에도 또 다른 방법으로 사용자화가 가능하게 되었습니다.

    3D 터치를 이용한 Peek & Pop 기능을 뷰컨트롤러를 위한 UIKit의 간단한 API만으로 추가할 수 있습니다. WKWebView에도 이런 기능이 추가되었습니다.

    웹뷰에서도 Peek & Pop을 좀 더 쉽게 제어할 수 있습니다. 다시 말해서 Peek 할 때 사용하는 뷰 컨트롤러를 사용자화 할 수 있습니다. Peek을 하면 미리보기를 할 수 있고, Pop을 하면 여러분의 앱 안에서 무슨 처리를 할 지 결정할 수 있습니다. 웹뷰 클래스의 델리게이트 메서드를 통해 이런 일들을 처리할 수 있습니다.

    UIKit에서 Peek & Pop 동작을 할 때, 블러 효과같은 기본적인 효과 외에도 사용자가 Peek 하려는 것을 감지하고, 어떤 행위를 할 것인지 감지해서 여러분만의 전환효과를 줄 수 있습니다. 



  • Refresh Control
  • Refresh Control을 UIScrollView와 그 자식 클래스에서 모두 사용할 수 있습니다. 즉, UITableView에만 제공되었던 기본적인 refresh control을 콜렉션 뷰를 포함한 여러 스크롤 환경에서 사용할 수 있게 되었다는 뜻입니다.



  • Collection View
  • 작년에는 콜렉션뷰의 flow layout의 새로운 모드가 생겼습니다. 자동 모드를 사용하면 더이상 셀의 크기를 예상하기 위하여 계산하지 않아도 됩니다. 또한, 스크롤뷰의 페이징 기능을 사용할 때 셀을 재정렬(reordering)하는 기능을 구현하였습니다.

    올해는 더욱 부드러운 스크롤을 위해 새로운 기능이 추가되었습니다.

    만약 셀에 복잡한 정보를 나타내야 할 때에는 빠른 스크롤을 하게된다면 버벅일 수 있었는데, 이는 사용자 경험으로 좋지 못하죠.

    그래서 cell prefetching 기능을 추가했습니다. 셀이 화면에 나타나기 전에 셀과 데이터를 미리 로드해 둘 수 있습니다. 물론 언제 어떻게 불러올지는 자동으로 모두 처리됩니다.  

    iOS 10으로 빌드한다면 셀을 미리 불러오는 것들은 자동으로 처리될 것입니다. 그렇지만 데이터를 미리 로드해 오는 것은 새로운 델리게이트 프로토콜 메서드를 통해 구현해 주어야 합니다.

    (테이블뷰에도 이런 기능이 추가되었습니다)


  • Advanced in UIKit Animations
  • UIViewPropertyAnimator라고 불리는 애니메이션 관련 기능이 추가되었습니다. 이는 새로운 애니메이션 API입니다.

    취소할 수 있고, 되감을 수 있으며, 타이밍을 정할 수 있으며, 완벽히 동적으로 동작합니다.



    애니메이션을 동영상의 타임라인처럼 관리를 할 수 있습니다. 

    타이밍과 동작시간을 매개변수로 전달하여 애니메이션에 추가할 수 있습니다.

    애니메이션 객체가 애니메이션을 표현하게 됩니다. 동작 중에 다양한 변화를 추가하거나 수정할 수 있습니다.

    뷰컨트롤러 작동 시스템에 완벽하게 녹아들어가 있습니다.

    이 새로운 애니메이션 기능의 강력한 포인트는 애니메이션을 사용자와 직접 상호작용 할 수 있도록 구현할 수 있다는 점입니다.



    # 간단요약

    Accessibility Inspector

    • 내 앱에 사용자 접근성 사용 기능이 어떤 것이 적용되어 있는지를 개발자가 더욱 편리하게 확인할 수 있는 기능이 추가됨


    Speech Recognition

    • 오디오 또는 실시간 입력으로도 음성인식 기능을 사용할 수 있음
    • 영어 외에 다른 나라 언어도 많이 지원함


    Smarter Text Input

    • 텍스트필드에 입력될 데이터가 어떤 종류인지 지정해두면 사용자가 원하는 데이터를 더 편리하게 입력할 수 있도록 도와줌


    Dynamic Type

    • 컨텐츠 사이즈 카테고리에 따라 글꼴 등을 알아서 표현해 줌


    Improved Customization

    • UIKit에 사용자화(커스터마이징) 할 수 있는 영역이 대폭 추가됨 (바 버튼 아이템의 여러 속성 등)


    Peek & Pop

    • 3D 터치를 통한 미리보기 기능의 전환효과를 사용자화 할 수 있음


    Refresh Control

    • Refresh Control을 테이블뷰 외에도 UIScrollView의 모든 자식클래스에서 사용할 수 있게 됨


    Collection View

    • 페이징 할 때 등 flow layout이 개선됨
    • 데이터를 미리 불러와 두고 처리해 둠으로써 콜렉션뷰를 조금 더 쾌적하게 사용할 수 있도록 개선


    Advanced in UIKit Animations

    • 애니메이션을 손쉽고 유려하게 다룰 수 있는 많은 기능이 추가됨
    • 애니메이션 표현 정보를 객체로 다룰 수 있게 되었고 손쉽게 사용자와 상호작용(interaction) 할 수 있음






    * 잘못되거나 부족한 내용이 있다면 덧글 남겨주시면 감사하겠습니다.
    * What's New in Cocoa Touch [Session 205]의 나머지 내용은 다음 포스팅에서 이어집니다.

    이어지는 다음(그리고 그 다음) 포스팅 내용

    # Adopting system features

    # Integrating with iOS


    2016/12/16 - [WWDC/WWDC2016] - What's New in Cocoa Touch [Session 205] 3/4

    2017/01/04 - [WWDC/WWDC2016] - What's New in Cocoa Touch [Session 205] 3/4





    by yagom

    facebook : http://www.facebook.com/yagomSoft

    facebook group : https://www.facebook.com/groups/yagom/


    p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

    RSS Feed 받기   



    저작자 표시 비영리 변경 금지
    신고
    Posted by yagom


    What's New in Cocoa Touch

    WWDC 2016 - Session 205 


    WWDC 2016 세션 205의 주제인 What's New In Cocoa Touch 요약정리입니다.

    이 포스트는 세션 205요약 중 첫 번째 글입니다.

    이번 포스팅에선 아래 주제를 정리하고, 나머지 주제는 다음 포스팅에서 이어집니다.


    # What's Not New in Cocoa Touch

    • Adaptivity
    • Advanced Touch Input
    • Keyboard Support

    # Core technologies

    • Swift 3
    • Grand Central Dispatch
    • Foundation
    • UIPasteboard
    • Wide Color
    • Image Renderer
    • Asset Management






    # What's Not New in Cocoa Touch

    작년에 변경된 코어한 내용들에 대한 소개입니다.



    작년에 3D Touch를 탑재한 iPhone 6s를 출시. 12.9인치 및 9.7인치 iPad Pro 출시. 애플 펜슬 및 스마트 키보드 출시.

    이런 제품들은 새로운 기능들을 앱에 유려하게 넣을 수 있도록 기능이 추가되었습니다.


  • Adaptivity
    • 2년 전 사이즈 클래스 기반의 반응형 기술을 소개했습니다. iPhone은 Compact 사이즈, iPad는 Regular 사이즈입니다. 그러면 iPad Pro는 Gigantic(거대)사이즈를 적용해야 할까요?



      당연히 아니겠죠. 사이즈 클래스가 중요해진 만큼 그를 지원하는 많은 툴들이 보강되었습니다. 인터페이스 빌더를 비롯하여 오토 레이아웃과 에셋 카탈로그까지 프레임워크 전반적으로 새로운 기능들이 보강되었습니다. 


    • Advanced Touch Input
      • iPad Air 2와 iPad Pro는 화면 재생 빈도(screen refresh rate)보다 빠르게 터치 입력 스캐닝을 120 HZ로 할 수 있습니다.

        방향과 각도도 파악할 수 있고, 더 정확한 위치와 압력을 인식할 수 있는 애플 펜슬응 사용할 수 있습니다. iPhone 6s에서는 이를 3D Touch 기술을 이용하여 인식할 수 있습니다.

        위 기능들을 사용하기 위해 iOS 9 및 iOS 9.1에서 새로운 API를 사용할 수 있었습니다.



        • Keyboard Support

        키보드 단축키 API는 iOS 7 부터 사용할 수 있었지만, iOS 9 부터는 단축키를 화면에 자동으로 표시할 수 있는 기능이 추가되었기 때문에 더욱 중요해 졌다고 할 수 있습니다. 커맨드 키를 계속 누르고 있으면 자동으로 단축키를 화면에 표시해줍니다.


        # What's New in Cocoa Touch

        이번 iOS 10에 변경된 내용들에 대한 소개입니다.



        Core technologies

        이번 iOS 10에 변경된 중요한 내용들에 대한 소개입니다.



        • Swift 3


        Before - Swift 2.2


        After - Swift 3.0

        거의 모든 API가 새로워졌습니다.
        Objective-C의 문법에서 Swift의 문법으로 변환하는 규칙을 변경하였습니다. 첫 번째 파라메터 이름을 사용하게 변경하여 좀 더 명확하게 표현할 수 있으며, (UIColor의 blackColor가 black으로 변경된 것처럼) 타입 메서드 이름이 타입 이름과 중복되던 현상을 줄일 수 있습니다.

        코어 그래픽(Core graphics) 메서드도 좀 더 쓰기 용이하게 변경되었습니다.

        GCD(Grand central dispatch)가 이제 완전한 객체형 API로 변경되었습니다.

        • Grand Central Dispatch

        개인 큐(private queue)를 생성할 수 있습니다. 큐 작업 아이템이 동기로 실행될 때, 오토 릴리즈 풀에 있는 각각의 작업 아이템을 래핑할 수 있도록 큐를 설정할 수 있습니다.  


        • Foundation

        Foundation도 스위프트의 발전 사항을 많이 적용하였습니다. 많은 클래스에서 NS 접두어를 없애고 새로운 기능을 추가했으며, Foundation API에 값 타입(Value types)를 더 추가했습니다.


        길이나 측량 단위도 모두 지원합니다. 

        AP 601 날짜 형식(Date format)도 추가했습니다.

        NSDateInterval을 통해 날짜를 계산하기 더 편리해졌습니다.

        • UIPasteboard

        UIPasteboard API를 사용하여 여러분의 앱에서 Mac과 iOS 기기 간에 복사/붙여넣기 영역을 공유할 수 있습니다. 

        한 가지 알아두어야 할 점이 있습니다. 큰 이미지 등과 같이 매우 큰 에셋을 가져오려면 1~2초 정도 걸릴 수 있습니다. 이를 피하려면, 그 데이터가 필요한지 아닌지를 먼저 판단해 주어야 합니다. API를 통해 URL, 이미지, 색상 등의 정보가 있는지 먼저 확인해 볼 수 있습니다. 


        pasteboard로 어떤 정보들을 실어 보낼지 제어할 수 있습니다. 데이터를 보호할 수도 있고, 만료시각을 설정할 수도 있습니다.


        • Wide Color

        iMac의 5K 화면 및 iPad Pro 9.7 인치의 하드웨어에 적용될 수 있는 기능입니다. 기존 하드웨어에서는 표현할 수 없었던 색상을 표현할 수 있습니다.

        색상을 표현하는 방법을 변경하고 있습니다. iOS 기기는 sRGB 색상을 사용했습니다. 이제는 확장된 sRGB(extended sRGB)를 사용합니다.

        iOS 10 API를 사용하여 확장된 색상을 사용할 수 있습니다.



        확장된 색상을 사용하는 그 첫 번째는 UIImageView입니다.  단순히 UIImageView를 사용하는 것으로도 광역 색상(wide color)을 사용합니다. 사실 iOS 9.3부터 그렇게 관리되어왔습니다. 



        기존에 존재하던 이니셜라이저 외(init(red: green: blue: alpha:))에 새로 하나(init(displayP3Red: green: blue: alpha:))가 추가되었습니다. 

        상단의 이니셜라이저로 확장된 sRGB 색상을 표현할 수 있습니다.

        당신이 광역 색상(wide color) 스펙으로 displayP3를 사용하려면 하단의 displayP3 이니셜라저를 사용하면 됩니다. 따로 색 공간(color space)를 관리하는 클래스는 없습니다.


        • Image Renderer

        이제까지 여러분은 이미지 UIGraphicsBeginImageContext를 사용하여 이미지 랜더링을 하고 있었습니다. 이런 방식은 이미지를 화면 밖에서 랜더링 한다는 문제점이 있었습니다.

        이 방법은 32비트 sRGB만 사용할 수 있습니다. 확장이 용이하지 못하고 좋지 못한 API의 형태였습니다.



        그래서 UIGraphicsRenderer 클래스를 만들었습니다. 

        이 클래스를 사용하면 9.7인치 iPad에서는 광역 색상 컨텍스를, 다른 기기에서는 기존 색상 컨텍스를 자동으로 판단하여 사용합니다. 

        또한, 블럭을 기반으로 설계되어 사용하기 쉽습니다. 또, 객체 기반 API로 설계하였기 때문에 이미지와 PDF를 위한 클래스를 늘렸습니다.

        또 중요한 점은 이 클래스는 컨텍스트의 활동시간(lifetime)를 관리합니다. 메모리 관리가 훨씬 용이해 졌다는 뜻이겠죠.

        • Asset Management

        이미지 에셋 카탈록에도 새로운 기능이 추가되었습니다. 에셋 카탈록이 광역 색상을 지원하고, 좌에서 우, 우에서 좌의 표현, 그리고 이미지 압축을 관리합니다. UIKit 시스템에 포함되어 있습니다.


        여러분의 애플리케이션에 광역 색상 에셋을 포함시켰을 때, 광역 색상을 사용하지 않는 기기에는 배포되지 않도록 구성할 수 있습니다. 또, 그런 기기로 배포하기 위해 sRGB로 자동으로 변형하여 주게됩니다. 이는 App Thinning 기능과 호환되어 적절한 에셋이 적용될 수 있도록 하여 앱을 더욱 가볍게 만들어 줄 수 있습니다.


        기기에 따라 이미지를 손실압축 할 수 있습니다. 용량과 화질 사이의 최상의 타협점을 찾아냅니다. 이 또한 App Thinning 기능과 호환됩니다.


        이미지마다 왼쪽읽기 및 오른쪽읽기에 따라서 이미지가 반전 되어야 하는지 아닌지를 지정할 수 있습니다.




        * 잘못되거나 부족한 내용이 있다면 덧글 남겨주시면 감사하겠습니다.
        * What's New in Cocoa Touch [Session 205]의 나머지 내용은 다음 포스팅에서 이어집니다.

        이어지는 다음(그리고 그 다음) 포스팅 내용

        # Building better user interfaces

        # Adopting system features

        # Integrating with iOS


        2016/09/05 - [WWDC/WWDC2016] - What's New in Cocoa Touch [Session 205] 2/4

        2016/12/16 - [WWDC/WWDC2016] - What's New in Cocoa Touch [Session 205] 3/4

        2017/01/04 - [WWDC/WWDC2016] - What's New in Cocoa Touch [Session 205] 3/4




        by yagom

        facebook : http://www.facebook.com/yagomSoft

        facebook group : https://www.facebook.com/groups/yagom/


        p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

        RSS Feed 받기   

        저작자 표시 비영리 변경 금지
        신고
        Posted by yagom



        Objective-C의 기능 추가

        1. Nullability annotations 
        2. Generics 



        안녕하세요 야곰입니다 :)

        Swift 2.0이 오픈소스화 되면서 관심이 많이 쏠리고 있습니다.


        그러나 기존 Objective-C 프로그래머들 사이에서는 Swift에 따라 변화되는 다양한 모습들이 부담으로 다가오기도 합니다. Swift 언어 문법과 기능들에 더 잘 맞춰주기 위하여 기존의 API들이 변경되기도 하고, Objective-C의 문법적 기능들과 키워드들이 몇몇가지 추가되기도 했습니다. 그에대해 간략히 살펴보는 시간을 가져보도록 할게요.


        # 해당내용은 2015년 6월 말에 작성된 내용으로, 애플에 의해 추후 변동의 여지가 충분히 있음을 미리 알립니다.


        # Nullability

        Swift는 지난 포스팅에 말씀드렸듯 자료형에 굉장히 민감합니다. 더불어 nil에 대해서 Objective-C와 완전히 다른 대응체계를 가졌죠. Swift 에서는 nil이란 녀석에도 굉장히 민감합니다. 그래서 그런 Swift의 특성에 맞도록 Objective-C의 기능이 추가되었습니다. 바로 nullability라는 기능인데요, 한 번 살펴보죠. Nullability 기능은 Xcode 6.3 / Swift 1.2 버전부터 정식 지원합니다.


        weakstrong, __weak__strong 이라는 키워드 기억하시나요? ARC 때문에 생겨난 새로운 키워드였죠. 이와 쓰이는 위치가 비슷합니다. (예를 든 것일뿐 weak와 strong 키워드와는 전혀 상관이 없습니다)


        Nullability 기능으로 새로 생겨난 키워드는 nullable, nonnull, null_unspecifiednull_resettable 등입니다.


        - nullable : 해당 항목이 null일 수 있다. 즉, Swift의 옵셔널 [?] 항목입니다.

        - nonnull: 해당 항목이 null일 수 없다. 즉, Swift의 논옵셔널 항목입니다.

        - null_unspecified : 해당 항목의 null 여부가 지정되어있지 않다. 즉, Swift의 암시적 추출 옵셔널 형식 [!] 항목입니다.

        - null_resettable : 해당 프로퍼티가 기본값을 가지고 있어 nil일 수 없을 경우에 사용합니다.

                                       즉, nil을 할당하면 즉기 기본값으로 초기화되는 프로퍼티에 사용할 수 있습니다. 

                                       Swift에서는 암시적 추출 옵셔널 형식 [!] 으로 표현됩니다.


        * nullability 키워드를 별도로 지정하지 않는 경우 null_unspecified가 기본입니다.

        ** nullable, nonnull, null_unspecified는 Objective-C 프로퍼티와 메소드, C와 블럭 포인터 등 

             전반적으로 모두 사용가능하지만, null_resettable은 Objective-C 프로퍼티에만 사용 가능합니다.


        일단 메소드에 쓰이는 예를 살펴보죠. UIViewController의 한 메소드입니다. Swift 코드와 Objective-C 코드를 살펴보면 기존의 API와 다르게 nullability 관련 키워드가 Swift의 옵셔널 형식에 맞게 반환자료형 또는 전달자료형 뒤에 삽입되어 있음을 확인할 수 있습니다.


        [ nonnullnullable의 API 적용 예 ]

        [ null_unspecifed의 프로퍼티 적용 예 ]


        위에서 nullability 관련 키워드를 설정해 주지 않는 경우 기본적으로 null_unspecified가 기본값으로 적용된다고 말씀드렸는데, 기본값을 변경할 수 있는 메크로가 존재합니다. NS_ASSUME_NONNULL_BEGIN과 NS_ASSUME_NONNULL_END. 이렇게 한 쌍으로 존재합니다. 저 한 쌍의 매크로 안쪽에 해당하는 항목들은 기본적으로 nonnull 옵션이 적용됩니다.

        스크린샷을 보시면 실제로 Swift에서 어떻게 적용이 되는지도 확인하실 수 있을겁니다.



        [ Objective-C 코드에서 NS_ASSUME_NONNULL_BEGIN과 NS_ASSUME_NONNULL_END의 적용 예 ]



        [ 위의 Objective-C 코드로 작성된 내용을 Swift 코드에서 확인 ]



        null_resttable에 관련된 프로퍼티를 찾아보았으나 찾지 못했습니다. 애플이 제공한 null_resettable에 관한 문서설명에는 아래 스크린샷과 같이 나와있지만 실제 tintColor는 null_resttable이 아니었습니다 :) 참고로 알아두시면 될 것 같습니다.



        null_resttable에 대한 설명 ]




        # Generics


        Objective-C에서 제네릭이 추가되었다고하여 찾아보았는데, 아마도 Swift의 콜렉션 타입(배열, 딕셔너리, 세트)를 위해 반영이 된 것 같습니다. Objective-C 에서는 배열(NSArray), 딕셔너리(NSDictionary), 세트(NSSet)에 자료형에 상관없이 한 콜렉션에 여러가지 객체형태를 넣어줄 수 있었죠. 즉, myArray라는 NSArray에 문자열도, 숫자도, 뷰 객체도 한 번에 들어갈 수 있었다는 이야기입니다. 그러나 Swift에서는 하나의 콜렉션에는 하나의 자료형밖에 담지 못합니다. Array도, Dictionary도, Set도 전부 담게되는 자료형을 명시해 주고, 그 자료형과 맞지 않으면 넣을 수 없었습니다. 이런 차이를 극복하기 위해 Objective-C에 기능을 추가했군요. 저는 Objective-C의 콜렉션이 자료형과 상관없이 넣을 수 있어서 참 강력하다고 생각했는데, 개인적으로는 아쉽습니다. Objective-C의 generics은 Xcode 7 / Swift 2.0 부터 지원합니다.


        스크린샷을 보시면 어떻게 상호 호환되는지 확인해 보실 수 있습니다. __kindof 키워드는 그 클래스와 하위 클래스까지 호환됨을 의미합니다. 실질적으로 Swift의 코드에 미치는 영향은 없습니다.


        [ Objective-C 코드에서 Generics의 적용 예 ]


        [ 위의 Objective-C 코드로 작성된 내용을 Swift 코드에서 확인 ]



        애플이 단지 Swift를 밀어주기 위해 Objective-C를 변경 하는 것인지, 아니면 두 언어의 상생을 위하여 Objective-C를 조금 희생시키는 것인지는 두고봐야 할 것 같습니다.
         

        # 오늘은 6.25 한국전쟁 발발일입니다. 오늘만이라도 뼈아픈 민족상잔의 비극을 잊지않고 되돌아 보는 시간이 되면 좋겠습니다.

        [역사를 잊은 민족에게 미래는 없습니다]

        by yagom

        facebook : http://fb.yagom.net

        facebook group : https://www.facebook.com/groups/yagom/

        twitter : http://twitter.yagom.net ( @yagomsoft )

        p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

        RSS Feed 받기   



        저작자 표시 비영리 변경 금지
        신고
        Posted by yagom

        # 재미있는 언어 Objective-C
        여러분들께서는 오브젝티브-C를 어떻게 생각하시나요? 언어의 역사와 배경을 아는 것이 정말 무의미해 보일지 모르겠지만, 오브젝티브-C의 탄생 배경을 살펴보면 재미난 점도 많고, 사용하면서 부딪힐 의문에 대해서도 더 많이 이해하게 될 수 있습니다.
        그럼 오브젝티브-C는 어떻게 태어났는지, 왜 제대로 알고 써야 할지 생각해 볼까요?

        # Objective-C는 어떻게 탄생하고 발전해왔을까?
        오브젝티브-C는 ‘객체 지향 프로그래밍 C언어 [Object-Oriented Programming in C, OOPC]’라는 이름으로 시작된 언어입니다. 즉, C를 객체 지향 언어로 발전시킨 것으로, 1983년에 발표되었습니다. 당시 사람들은 구조적 프로그래밍  습관에 따라 프로그래밍을 하였는데, 풀어내야 할 문제들이 많이 생겨나자 그 해결책으로 객체 지향 프로그래밍  연구를 활발히 하던 시절이었습니다.

        애플사에서 나온 스티브 잡스는 넥스트사를 설립한 후 오브젝티브-C의 사용 허가를 받았습니다. 그는 회사를 꾸준히 발전시켜 넥스트스텝이라는 객체 지향형 운영체제에 사용하기 위하여 AppKit과 Foundation Kit 등을 개발하였습니다. 이것이 현재 애플 운영체제의 전신이 되었습니다. 그 후 넥스트는 애플에 합병되었고, 애플은 넥스트에서 쓰던 툴들을 기반으로 Mac OS X라는 운영체제를 출시하였습니다. 오늘날 애플의 Cocoa API 대부분은 이에 기반을 두었죠(애플 운영체제의 클래스 접두어가 대부분 NS인 것이 바로 이 때문입니다).

        애플은 2006년 애플 세계 개발자 회의Apple Worldwide Developers Conference, WWDC에서 ‘현대적인 가비지 콜렉션, 문법 기능 향상, 런타임 성능 개선, 64비트 지원’을 포함하는 오브젝티브-C 언어의 리비전Rivision으로 오브젝티브-C 2.0 공개하였습니다. 즉, 우리가 현재 배우고 사용하고 있는 오브젝티브-C는 오브젝티브-C 2.0이죠.

        # 왜 Objective-C의 특성을 살려야 할까?
        앞에서 언급했듯이 오브젝티브-C는 조금은 독특한 역사를 가지고 있으며, 객체 지향의 특징을 구현하기 위하여 많은 고민을 거듭하여 발전한 언어입니다. 절차 지향 언어인 C에서 파생된 언어이고, 자세히 파헤쳐보면 100% 객체 지향 언어라고 하기에는 무리가 있지만, 저는 객체 지향 특성을 제대로 활용할 수 있는 몇 안 되는 언어 중에 하나라고 생각합니다. 또한, 같은 객체 지향 언어라 하더라도 C++, Java와는 조금 다른 특성들을 많이 갖고 있기에 기존에 개발하던 개발자들이라도 배워야 할 필요가 분명히 있습니다.

        게다가 오브젝티브-C를 사용하는 것은 대부분 애플 기기 기반의 애플리케이션을 제작하려는 목적이므로 당연히 애플이 제공한 프레임워크 및 킷을 활용하여 제작할 것은 자명한 사실이죠.

        지금에 비하여 처음의 Cocoa API는 오브젝티브-C의 특성을 잘 살리지 못했었습니다. 하지만 지금은 API의 특성을 이해하지 못하면 사용하기 어려울 정도로 오브젝티브-C의 특성들을 많이 활용하고 있습니다. 또한, 프로토콜(특히 Delegate), 카테고리, 블록, GCD 등 오브젝티브-C의 특징을 살린 API와 패턴들이 점점 많아지고 있습니다. 그러므로 좀 더 안정적이고, 유연하고, 빠른 애플리케이션 개발을 위하여 오브젝티브-C의 특성을 알아야 한다고 생각합니다



        제 생각들을 조금 정리해 보았는데, 여러분들의 생각은 어떠신지요?
        많은 고수분들의 의견을 들어보고 싶습니다 ^^

        P.S. 오브젝티브-C를 오브젝트C 라고 잘못 표현하는 분들이 종종 계십니다. 정식명칭은 'Objective-C[오브젝티브-C]'가 맞습니다.

        by yagom

        facebook : http://www.facebook.com/yagomSoft

        facebook group : https://www.facebook.com/groups/yagom/

        twitter : http://www.twitter.com/yagomSoft ( @yagomsoft )

        p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

        RSS Feed 받기   

         


        저작자 표시 비영리 변경 금지
        신고
        Posted by yagom


        오늘의 Tip

        1. 4인치 디바이스 적용하기


        음... 일단 매우 늦은감이 넘치지만ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

        요청이 있어 짬내어 포스팅합니다.

        아이폰 5가 출시되면서 화면 비율의 파편화가 생겼죠...

        Aㅏ........... 

        여튼...ㅋㅋㅋ 아이폰 5에 적절히 대응하는 방법에 대해 알아보도록 합시다.

        # 기본 준비

        일단, 4인치 기기인지 구별할 수 있는 매크로를 구현해 봅시다.

        프로젝트의 pch파일에 해당 매크로를 추가합니다.

        이렇게 해 두면 프로젝트 어디에서라도 이 매크로를 사용할 수 있습니다.


        그리고 한가지 팁을 더 추가하면

        시뮬레이터에서 기기를 변경하는 방법입니다.

        3.5인치, 4인치 번갈아가면서 하려면 기기를 선택할 줄 알아야 하죠.





        # nib(xib)을 사용하는 경우

        여러가지 방법이 존재하지만, 제가 사용하고 있는 방법을 소개해 드릴게요.

        카테고리를 이용합니다.

        프로젝트에서 카테고리 파일을 하나 만들어 줍니다.


        그리고 아래와 같이 소스를 작성해 줍니다.

        소스 내용은 과니님 소스를 참고하였습니다. ( http://tiny2n.tistory.com/139 )

        + 덧

        소스 원작자 과니님께 미리 양해를 구하지 못해 죄송합니다. 

        덧글로 말씀해주셔서 이제야 수정하고 사과드립니다.

        참, 이 소스는 ARC 기준입니다 :)


        UIViewController_Is4Inch.h

        UIViewController_Is4Inch.m




        기존 xib파일을 3.5인치 디바이스 크기로 변경해 주고,



        4인치용 xib 파일을 만들어 줍니다.

        우선 빈 xib 파일을 만들어 준 후 


        xib의 클래스를 해당 클래스에 맞게 설정 해 주신 후에, 뷰를 하나 얹습니다. 크기는 4인치용으로!


        참, 뷰 컨트롤러 xib니까 view 아울렛을 연결해 주시는 것도 잊지 마시구요~!

        아울렛 연결 방법은 ( http://blog.yagom.net/185 ) 참고! 


        4인치 디바이스 실행 시,



        3.5인치 디바이스 실행 시




        # 스토리보드를 사용하는 경우

        간단합니다.

        일단 4인치용 스토리보드를 하나 더 만들어 줍니다.


        그리고 기존 스토리보드의 크기는 3.5인치 크기로~



        새로운 스토리보드에 4인치 화면과 label을 하나 얹어주시고~ 



        AppDelegate의 application:didFinishLaunchingWithOptions 메소드에 아래와같이 작성해 줍니다.


        끝~!

        4인치 디바이스 실행 시,



        3.5인치 디바이스 실행 시,





        # 4인치 전용 이미지 로딩이 필요한 경우

        이 경우는 최건우님께서 작성해 두신 오픈소스를 사용하였습니다.

        https://gist.github.com/Hardtack/4755404

        UIImage+HTLong.h
        UIImage+HTLong.m

        두 파일을 프로젝트에 포함시켜 빌드하기만 하면 됩니다.

        -568h 라는 suffix를 가지게 되면 4인치 디바이스일 경우 자동으로 해당 이미지를 로드합니다.

        만약 -568h 접미어를 가진 파일이 없는 경우 기본 이미지를 로드하게 되구요.


        이상입니다.


        참고.

        http://cafe.naver.com/mcbugi/236038

        http://www.couplestyle.com/entry/%EC%9D%B4%EC%A0%84-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%95%84%EC%9D%B4%ED%8F%B05-%ED%95%B4%EC%83%81%EB%8F%84-%EB%8C%80%EC%9D%91


        http://blog.naver.com/PostView.nhn?blogId=whiteday910&logNo=40186791084

        http://tiny2n.tistory.com/139

        http://survival.egloos.com/310015

        http://blog.naver.com/PostView.nhn?blogId=syowoo&logNo=100172131674


        by yagom

        facebook : http://fb.yagom.net

        twitter : http://twitter.yagom.net ( @yagomsoft )

        p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

        RSS Feed 받기   


        ↓↓↓저 열심히 썼는데 손가락 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 


        저작자 표시 비영리 변경 금지
        신고
        Posted by yagom

        오늘의 주제

        1. UIGestureRecognizer 사용해 보기


        쉰 두번째 시간입니다.^^

        정말 오래간만의 포스팅입니다 :)

        오늘은 '새벽다섯시반'님의 요청으로 포스팅을 진행해 보도록 하겠습니다.

        길게 눌렀을 때 특정 동작을 할 수 있도록 구현해보고 싶다고 말씀하셨습니다.

        그녀석은 바로 Gesture Rcognizer!!

        그럼 알아볼까요?

        스따뚜~~~~~~~~~~~~



        # Gesture Recognizer란?

        말 그대로 유저의 제스쳐를 인식하는 녀석입니다.

        양쪽위아래로 밀기(swipe), 꾹 누르기(long press), 탭하기(tap, 여러번도 포함) 등등 많은 제스쳐를 인식할 수 있지요.

        자, 그럼 그녀석을 어떻게 사용하느냐?

        따라오세요~


        일단 프로젝트를 만들어야겠죠?ㅎ
         


        네, 만듭니다. 옵션 체크된거 확인해 주시구요~


        스토리보드로 와서 View 위에 ImageView를 하나 얹어주시구요. 사진은 넣고싶은거 넣으세요 ㅎㅎ

        그리고 Object Library에서 Long Press Gesture Recognizer를 끌어다가 이미지뷰 위에서 올려놓습니다.

        참, 이미지뷰의 속성에서 User Interactive Enable에 꼭 체크해 주시구요 :)



        좌측에 생성된 Long Press Gesture Recognizer를 우클릭 또는 control + 클릭하여 Image View와 연결되어있는지 확인합니다.

         


        그리고 우클릭 또는 control + 클릭으로 View Controller로 쭈욱 드래그 하신 후에 까만 창이 뜨면 delegate로 설정해 줍니다.

        자, 스토리보드에서 준비는 끝났습니다.
         


        이제 헤더로 와서 UIGestureRecognizerDelegate 프로토콜을 따르겠다고 이야기 해줍니다.


        그리고 그녀석을 어떻게 써야할지 알아보기 위하여 도큐먼트를 한 번 훑어봐야겠죠?

        UIGestureRecognizerDelegate위로 option(alt)키를 누른 상태로 커서를 올려봅니다.

        그럼 위처럼 말풍선이 뜰텐데요, Reference를 클릭합니다.
         


        자, 여기서 보면 델리게이트가 하는 일이 나와있네요.

        우리에게 필요한 것은 꾸욱 눌렀을 때 어떻게 해줘야 할지를 정해주는 것이기 때문에 - gestureRecognizerShouldBegin: 을 클릭해서 자세한 내용을 봅시다.


        요로코롬 어떤 녀석인지 상세하게 설명이 되어있네요 :)

        한 번 쭈욱 읽어보시구요, 델리게이트 메소드 구현을 위해서 저녀석을 쭉 긁어서 복사해옵니다.

        어디로? 구현파일로요 ㅋㅋ


        참, 우리는 액션시트도 쓰려고 하니까 일단 우선 헤더파일에 액션시트 델리게이트를 하겠다고 이야기 해주구요,


        아까 복사해둔 메소드를 이용해서 이렇게 구현해줍니다. 

        그리고 실행!!!



         

        짜잔~ 
        잘 되시나요?
        참 쉬죠잉~?

        ㅋㅋ 여기에서는 Long Press Gesture Recognizer만 실습해 보았는데요,

        다른 Gesture Recognizer들도 사용법은 비슷비슷 합니다.

        다른 녀석으로 한 번 구현해 보세요.

        참, 종류가 달라도 다들 UIGestureRecognizerDelegate 프로토콜을 따르게 됩니다.

        즉, 위에서 본 델리게이트 메소드들을 적절히 잘 활용하면 여러 제스쳐를 한 번에 받고 처리할 수 있다는 이야기가 되겠지요?ㅎ

        한 번 무슨말인지 고민해 보세요 :)

        오랜만의 포스팅이었습니다.

        많이 부족하고 허접한 블로그인데 이렇게 찾아주셔서 정말 고맙습니다 ^^

        또 새로운 주제가 생기면 포스팅 하겠습니다.

        그럼 다음에 뵈어요 :)

        by yagom

        facebook : http://www.facebook.com/yagomSoft

        twitter : http://twitter.yagom.net ( @yagomsoft )

        p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

        RSS Feed 받기   


        ↓↓↓저 열심히 썼는데 손가락 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 




        저작자 표시 비영리 변경 금지
        신고
        Posted by yagom

        오늘의 주제

        1. UIGestureRecognizer 사용해 보기


        쉰 두번째 시간입니다.^^

        정말 오래간만의 포스팅입니다 :)

        오늘은 '새벽다섯시반'님의 요청으로 포스팅을 진행해 보도록 하겠습니다.

        길게 눌렀을 때 특정 동작을 할 수 있도록 구현해보고 싶다고 말씀하셨습니다.

        그녀석은 바로 Gesture Rcognizer!!

        그럼 알아볼까요?

        스따뚜~~~~~~~~~~~~



        # Gesture Recognizer란?

        말 그대로 유저의 제스쳐를 인식하는 녀석입니다.

        양쪽위아래로 밀기(swipe), 꾹 누르기(long press), 탭하기(tap, 여러번도 포함) 등등 많은 제스쳐를 인식할 수 있지요.

        자, 그럼 그녀석을 어떻게 사용하느냐?

        따라오세요~


        일단 프로젝트를 만들어야겠죠?ㅎ
         


        네, 만듭니다. 옵션 체크된거 확인해 주시구요~


        스토리보드로 와서 View 위에 ImageView를 하나 얹어주시구요. 사진은 넣고싶은거 넣으세요 ㅎㅎ

        그리고 Object Library에서 Long Press Gesture Recognizer를 끌어다가 이미지뷰 위에서 올려놓습니다.

        참, 이미지뷰의 속성에서 User Interactive Enable에 꼭 체크해 주시구요 :)



        좌측에 생성된 Long Press Gesture Recognizer를 우클릭 또는 control + 클릭하여 Image View와 연결되어있는지 확인합니다.

         


        그리고 우클릭 또는 control + 클릭으로 View Controller로 쭈욱 드래그 하신 후에 까만 창이 뜨면 delegate로 설정해 줍니다.

        자, 스토리보드에서 준비는 끝났습니다.
         


        이제 헤더로 와서 UIGestureRecognizerDelegate 프로토콜을 따르겠다고 이야기 해줍니다.


        그리고 그녀석을 어떻게 써야할지 알아보기 위하여 도큐먼트를 한 번 훑어봐야겠죠?

        UIGestureRecognizerDelegate위로 option(alt)키를 누른 상태로 커서를 올려봅니다.

        그럼 위처럼 말풍선이 뜰텐데요, Reference를 클릭합니다.
         


        자, 여기서 보면 델리게이트가 하는 일이 나와있네요.

        우리에게 필요한 것은 꾸욱 눌렀을 때 어떻게 해줘야 할지를 정해주는 것이기 때문에 - gestureRecognizerShouldBegin: 을 클릭해서 자세한 내용을 봅시다.


        요로코롬 어떤 녀석인지 상세하게 설명이 되어있네요 :)

        한 번 쭈욱 읽어보시구요, 델리게이트 메소드 구현을 위해서 저녀석을 쭉 긁어서 복사해옵니다.

        어디로? 구현파일로요 ㅋㅋ


        참, 우리는 액션시트도 쓰려고 하니까 일단 우선 헤더파일에 액션시트 델리게이트를 하겠다고 이야기 해주구요,


        아까 복사해둔 메소드를 이용해서 이렇게 구현해줍니다. 

        그리고 실행!!!



         

        짜잔~ 
        잘 되시나요?
        참 쉬죠잉~?

        ㅋㅋ 여기에서는 Long Press Gesture Recognizer만 실습해 보았는데요,

        다른 Gesture Recognizer들도 사용법은 비슷비슷 합니다.

        다른 녀석으로 한 번 구현해 보세요.

        참, 종류가 달라도 다들 UIGestureRecognizerDelegate 프로토콜을 따르게 됩니다.

        즉, 위에서 본 델리게이트 메소드들을 적절히 잘 활용하면 여러 제스쳐를 한 번에 받고 처리할 수 있다는 이야기가 되겠지요?ㅎ

        한 번 무슨말인지 고민해 보세요 :)

        오랜만의 포스팅이었습니다.

        많이 부족하고 허접한 블로그인데 이렇게 찾아주셔서 정말 고맙습니다 ^^

        또 새로운 주제가 생기면 포스팅 하겠습니다.

        그럼 다음에 뵈어요 :)

        by yagom

        facebook : http://www.facebook.com/yagomSoft

        twitter : http://twitter.yagom.net ( @yagomsoft )

        p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

        RSS Feed 받기   


        ↓↓↓저 열심히 썼는데 손가락 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 




        저작자 표시 비영리 변경 금지
        신고
        Posted by yagom

        이 문서는 2013s 01. 기준으로 작성된 글이므로, 이후에 애플 문서의 내용이 변경될 수 있습니다.
        또한 전문 번역가가 아니기 때문에 의역, 오역의 소지가 다분히 많습니다.
        참고하시기 바랍니다.

        공개 수배 합니다!
        유용한 iOS 개발문서를 함께 번역해 나갈 분들을 찾습니다.
        현재도 함께 작업중이신 분들 모두 전문 번역가 아닙니다.
        모두 열정과 열의로 함께 작업하고 계십니다.
        자신의 재능을 자신뿐만 아니라 또 다른 누군가를 위해서 사용한다면 더더욱 빛이 날 것입니다.
        함께하길 원하는 분께서는 덧글 또는 이메일 주시기 바랍니다 :)
         

        오늘의 주제

        1. Manage App State Changes


        파헤치기 다섯 번째 시간입니다.^^

        이번 파트는 Scott Lim 님께서 도와주셨습니다. 번역에 도움주셔서 진심으로 고맙습니다 :)

        자, 그럼 출발해 봅시다^^~
        [##_http://yagom.tistory.com/script/powerEditor/pages/1C%7Ccfile2.uf@1979C54150E41B6B32FD56.png%7Cwidth=%22212%22%20height=%22619%22%20alt=%22%22%20filename=%221.png%22%20filemime=%22image/jpeg%22%7C_##]
        # App States and Multitasking





        iOS 어플리케이션에서는, 당신의 어플리케이션이 "현재 실행(foreground)" 상태인지 "백그라운드실행상태(background)" 인지를 아는 것이 중요하다. 시스템 리소스가 iOS 장치에 매우 한계가 정해져 있으므로, 어플리케이션은 현재 실행상태일 떄보다 백그라운드 실행상태일때 다르게 작동해야만 한다. 운영체제 또한 배터리 수명을 향상시키고, 사용자들의 현재 실행중인 어플리케이션에 대한 사용경험을 향상시키기 위해 백그라운드 실행상태인 어플리케이션이 할 수 있는 것들에 한계를 두어야만 한다. 운영체제는 당신의 어플리케이션에게 실행중상태와 백그라운드 실행상태를 이동할 때마다 알려줄 것이다. 이런 알림은 당신의 어플리케이션의 동작을 수정하는 기회가 된다.
        당신의 어플리케이션이 현재 실행중인 동안, 시스템은 프로세스처리(processing)를 위해 터치 이벤트를 어플리케이션에게 보낸다. UlKit 구조는 당신의 전용(custom) 오브젝트에 이벤트를 전달하기 위한 어려운 작업의 대부분을 수행한다. 당신이 해야하는 것은 이런 이벤트들을 처리하기 위해 적당한 오브젝트에 이 메소드를 오버라이드 하는 것이 전부다. 작동을 위해, UlKit 는 텍스트 필드의 값의 변화 같은 어떤 흥비로운 일이 발생할떄만 당신의 전용(custom) 코드를 불러낸다거나, 당신을 위한 터치 이벤트를 다루는 것으로 훨씬 간단하게 작동하도록 해준다.
        당신의 앱을 구현하고 싶다면, 이 가이드라인을 따라하십시오.
        - (필수사항) 발생하는 상태 변화(state transition) 에 적합하게 반응하십시오. 이러한 변화들을 적절하게 다루지 못하는 것은 데이터 손실이나 사용자들에게 나쁜 인상을 가져올 수 있습니다. 상태 변이에 반응하는 방법의 요약본을 찾는다면, "Managing App State Changes" 를 보십시오.

        - (필수사항) 백그라운드 실행상태로 이동할 땐, 당신의 앱이 그 동작을 적절하게 조정할 수 있는지 확실하게 해라. 당신의 앱이 백그라운드 실행상태로 이동할 때, 해야하는 것들에 대한 가이드라인을 찾는다면, "Being a Responsible Background App" 를 보십시오.

        - (권장사항) 당신의 앱이 필요로 하는 시스템 변화를 알려주는 모든 알림기능을 등록하십시오. 앱이 잠자기(suspended) 상태(아무 동작도 하지 않음)일 때, 시스템은 앱이 실행을 재개하게 될 때 키 알림을 보낸다(queue). 앱은 다시 실행으로 돌아가는 부드러운 변이를 만들어내기 위해 이런 알림기능을 사용해야만 한다. 더 많은 정보를 찾는다면, "Processing Queued Notifications at Wakeup Time" 을 보십시오.

        - (선택사항) 만약 당신의 앱이 백그라운드 실행상태에서 실제 작업을 수행할 필요가 있는 경우, 시스템에게 실행을 계속할 수 있는 적합한 허용을 요청해라. 당신이 할 수 있는 백그라운드 실행상태에서의 작업의 종류와 그 작업을 하기 위해 허가를 요청하는 방법에 대해 알고 싶다면, "Background Execution and Multitasking" 을 보십시오.



        Managing App State Changes
        [##_http://yagom.tistory.com/script/powerEditor/pages/1C%7Ccfile25.uf@157A8F4150E41B7D31B6C7.png%7Cwidth=%22824%22%20height=%22295%22%20alt=%22%22%20filename=%223.png%22%20filemime=%22image/jpeg%22%7C_##]
        어떤 주어진 상황에서든, 당신의 앱은 Table 3.1 에 나열된 상태 중의 한가지에 있어야 한다. 시스템은 시스템을 통해 일어나는 액션들의 반응으로 상태를 변화시킨다. 예를 들면, 사용자가 홈버튼을 눌렀을 때, 전화가 왔을 때, 또는 어떤 다른 인터럽션(interruptions)이 발생했을 때, 현재 실행중인 앱은 그에 대한 응답으로 상태를 변화시킨다. Figure 3-1 은 다른 상태로 변할 때 앱이 선택하게 되는 경로들을 보여준다.


        Table 3-1    앱 상태들
        실행중이 아님   :  앱이 실행되지 않았거나, 실행은 되고 있었으나 시스템에 의해 종료됨.

        비활성 상태      :  앱이 실행상테에서(현재 메인 화면에서) 실행중이지만, 현재 이벤트를 받고 있지 않고 있다. (다른 코드를 수행하고 있을 수 있다.) 어플리케이션은 보통 다른 상태로의 변이가 일어날 때 일시적으로 이 상태에 머물러 있는다.

        활성 상태  :  앱이 메인화면에서 실행중이고, 이벤트를 받고 있다. 이것은 실행상태의 앱의 일반적인 상태이다.
        백그라운드 실행 상태 : 앱이 백그라운드 상태에 있으면서 코드를 수행하고 있다. 대부분의 앱들은 종료되어가는 과정에서 일시적으로 이 상태에 들어가게 된다. 그러나, 추가적인 실행 시간을 요청하는 앱은 일정 시간동안 이 상태에 남아있을 수 있다. 게다가, 바로 백그라운드 실행상태로 시작되는 앱은

        비활성 상태(Inactive)대신 이 상태로 들어간다. 백그라운드 실행상태에 있는 동안 코드를 실행하는 방법에 대한 정보를 알고 싶다면, "Background Execution and Multitasking" 을 보십시오.

        잠자기 상태  :  앱이 백그라운드 상태로 있지만, 코드를 수행하고 있지 않는다. 시스템은 그렇게 하기 전에 앱을 자동으로 이 상태로 옮기고 통지하지 않는다. 잠자기(suspended) 상태인 동안, 앱은 메모리에 남아있으나 어떤 코드도 수행하지 않는다. 메모리 부족 상태(low-memory)가 발생할 때, 시스템은 실행상태의 앱에 더 많은 공간을 만들어주기 위해 통지 없이 잠자기 상태(suspended) 앱들을 제거할 수 있다.

        [##_http://yagom.tistory.com/script/powerEditor/pages/1C%7Ccfile24.uf@23307C3E50E41BA224ADE4.png%7Cwidth=%22824%22%20height=%22378%22%20alt=%22%22%20filename=%224.png%22%20filemime=%22image/jpeg%22%7C_##]Figure 3-1  





        주의: iOS3.2 나 그 이전 버전에서 실행되는 앱들은 백그라운드 실행상태나 잠자기(suspended) 상태가 되지 못한다. 게다가, 어떤 장치들은 멀티태스킹이나 백그라운드 실행상태 수행을 전혀 지원하지 않는다,(심지어 iOS 4나 그 이후에서 실행되더라도). 이러한 장치들에서 실행되는 앱들은 또한 백그라운드 실행상태나 잠자기(suspended) 상태로 들어가지 못한다. 대신, 앱들은 실행상태를 떠나면서 종료된다.


        [##_http://yagom.tistory.com/script/powerEditor/pages/1C%7Ccfile25.uf@24307C3E50E41BA22512F1.png%7Cwidth=%22824%22%20height=%22150%22%20alt=%22%22%20filename=%225.png%22%20filemime=%22image/jpeg%22%7C_##]
        대부분의 상태 변화는 당신의 앱에 delegate object 의 메소드에 따라 상응하는 호출에 동반된다. 이러한 메소드들은 적합한 방법으로 상태 변화에 응답하는 기회(chance)가 된다. 이러한 메소드들은 아래에 당신이 사용하는 방법의 요약과 함께 나와있다.


        - application:willFinishLaunchingWithOptions : 이 메소드는 당신의 앱이 실행(Launch) 시에 코드를 수행하는 첫 번째 기회가 된다.

        - application:didFinishLaunchingWithOptions : 이 메소드는 당신이 당신의 앱이 사용자에게 보여지기 전에 최종적으로 어떤 초기화든지 수행하도록 해준다.

        - applicationDidBecomeActive : 당신의 앱이 실행상태로 막 되려고 한다는 것을 알게 해준다. 어떠한 마지막 준비 시기(preperation)에도 이 메소드를 사용해라. 
        - applicationWillResignActive : 당신에게 당신의 앱이 실행상태에서 다른 상태로 변이될 것을 알려준다. 당신의 앱을 조용한(quiescent) 상태로 놓고자 할 때, 이 메소드를 사용해라.

        - applicationDidEnterBackground : 당신에게 당신의 앱이 백그라운드 실행상태로 실행되고, 어떤 때든지 잠자기(suspended) 상태로 갈 수 있음을 알려준다.

        - applicationWillEnterForeground : 당신에게 당신의 앱이 백그라운드 실행상태에서 나와서 실행상태로 돌아가는 것을 알게 해준다. 그러나, 아직은 실행상태는 아니다.

        - applicationWillTerminate : 당신에게 당신의 앱이 종료될 것임을 알려준다. 이 메소드는 당신의 앱이 잠자기(suspended) 상태일 때는 호출되지 않는다.


        The App Launch Cycle
        [##_http://yagom.tistory.com/script/powerEditor/pages/1C%7Ccfile29.uf@25307C3E50E41BA226953B.png%7Cwidth=%22824%22%20height=%2283%22%20alt=%22%22%20filename=%226.png%22%20filemime=%22image/jpeg%22%7C_##]
        당신의 앱이 시작되었을 때, 실행상태나 백그라운드 실행 상태로 이동하는 것이 아니라, 일시적으로 비활성상태를 통해 변이하게 된다. 실행 사이클의 부분으로서, 시스템은 프로세스를 만들고 당신의 앱을 위한 메인 쓰레드를 만들고, 당신의 앱의 메인 함수를 그 메인 쓰레드에 호출한다. 당신의 XCode 프로젝트와 함께 나오는 기본 메인 함수는 신속하게 컨트롤을 UlKit Framework 로  넘겨주는데, 이 컨트롤들은 당신의 앱을 초기화하고, 실행되는데 준비되도록 하는 작업의 대부분을 수행한다.
        Figure 3-2 는 앱이 실행상태로 시작될 때, 호출된 앱 delegate 메소드를 포함해서 발생하는 이벤트들의 순서들을 보여준다.


        Figure 3-2  앱을 실행상태로 시작하는 과정
        [##_http://yagom.tistory.com/script/powerEditor/pages/1C%7Ccfile26.uf@134E564D50E41BD3238DFF.png%7Cwidth=%22824%22%20height=%22501%22%20alt=%22%22%20filename=%227.png%22%20filemime=%22image/jpeg%22%7C_##]

        만약 당신의 앱이 백그라운드 실행상태로 시작되었다면 - 보통 백그라운드 실행상태의 이벤트들을 다루기 위해 - 시작 사이클은 Figure 3-3 에 보인 것처럼 살짝 바뀐다. 중요한 차이점은 당신의 앱을 활성상태로 만드는 대신에, 이벤트를 다루기 위한 백그라운드 실행상태로 들어가서 그 후에 금방 잠자기(suspended) 상태가 된다. 백그라운드 실행상태로 시작했을때, 시스템은 여전히 앱 사용자의 인터페이스 파일을 로드하지만  앱 창에는 보여주지 않는다.



        Figure 3-3 앱을 백그라운드 실행상태로 시작하는 과정
        [##_http://yagom.tistory.com/script/powerEditor/pages/1C%7Ccfile29.uf@154E564D50E41BD424EBF4.png%7Cwidth=%22824%22%20height=%22621%22%20alt=%22%22%20filename=%228.png%22%20filemime=%22image/jpeg%22%7C_##]
        당신의 앱이 실행상태 또는 백그라운드 실행상태로 시작되는지를 결정하기 위해서는, 당신의 application:willFinishLaunchingWithOptions: 또는 application:didFinishLaunchingWithOptions 델리게이트 메소드에 있는 공유된 UIApplication object 의 applicationState 프로퍼티를 체크하여라. 앱이 실행상태로 시작되었을 때는, 이 프로퍼티는 UIApplicationStateInactive 값을 포함한다. 앱이 비실행상태로 시작된다면, 프로퍼티는 UIApplicationStateBackground 값을 대신 포함한다. 당신은 당신의 델리게이트 메소드의 시작시간 행동을 조정하기 위해 이런 차이점들을 각각 맞추어 사용할 수 있다.

        주의 : 앱이 URL을 열 수 있도록 시작되었을 땐, Startup 이벤트의 과정이 Figure 3-2, 3-3 에 보여진 것들과는 조금 다르다. URL을 열 때 발생하는 Startup 과정들에 대한 정보를 알고 싶으면, "Handling URL Requests" 를 보십시오.



        About the main Function
        [##_http://yagom.tistory.com/script/powerEditor/pages/1C%7Ccfile4.uf@174E564D50E41BD5254F0D.png%7Cwidth=%22824%22%20height=%22262%22%20alt=%22%22%20filename=%229.png%22%20filemime=%22image/jpeg%22%7C_##] C 기반의 앱과 마찬가지로, iOS 앱의 주된 시작점은 메인 함수(main function)이다. iOS 앱에서 메인 함수는 최소한으로만 사용된다. 메인 함수의 주된 역할은 UlKit fraomwork 로 컨트롤을 전달하는 것이다. 그러므로, XCode 에서 당신이 만드는 어떤 새로운 프로젝트라도 Listing 3-1 에 보이는 것 처럼 기본 메인 함수를 가지고 시작한다. 거의 예외 없이, 당신은 이 함수의 구현을 결코 바꾸어선 안된다.


        Listing 3-1   iOS 앱의 메인 함수
        ( 코드 내용 생략 )
         
        주의 : 메모리 관리에서 autorelease pool 이 사용된다. 이는 functional block of code 동안 만들어지는 object의 release 를 지연시켜주는데 사용되는 Cocoa 메커니즘이다. autorelease pools 에 대한 더 많은 정보를 원한다면, Advanced Memory Management Programming Guide 를 보십시오.







        UIApplicationMain 함수는 4개의 변수를 택하고, 이를 앱을 초기화하는 데 사용한다. 당신은 이 함수로 전해지는 초기 값들을 결코 바꾸어선 안된다. 그렇지만 그 목적이나 그들이 앱을 시작하는 방법 등을 이해하는 것은 중요하다.
        - argc 와 argv 변수는 시스템으로부터 앱으로 전달되는 모든 시작 시간(Launch-time) 인수 (Arguments) 들을 포함한다. 이 인수들은 UlKit infrastructure 에 의하여 분석되고, 그렇지 않다면 무시될 수 있다.

        - 3번째 변수는 중요한 앱 클래스의 이름을 식별한다. 이것은 앱을 실행하는데 책임이 있는 클래스이다. 이 변수에 nil 을 사용하길 권장하는데, 이는 UIKit 이 UIApplication 클래스를 사용하도록 유도한다.

        - 4번째 변수는 당신의 전용(custom) 앱 델리게이트의 클래스를 식별한다. 당신의 앱 델리게이트는 시스템과 당신의 코드 사이의 수준높은 상호작용을 다루는 데 책임이 있다. Xcode 템플릿 프로젝트는 이 변수를 자동으로 적당한 값으로 세팅한다.


        UIApplicationMain 함수가 하는 또다른 일은 앱의 메인 사용자의 인터페이스 파일을 로드(Load)하는 것이다. 주요 인터페이스 파일은 당신이 당신의 앱의 사용자 인터페이스에 보여주도록 계획한 초기 view-related objects 들을 포함한다. 스토리보드를 사용하는 앱에 대해선, 이 함수는 당신의 스토리보드로 부터 초기 뷰 컨트롤러를 로드하고 당신의 앱 델리게이트에 의해 공급된 윈도우에 그것을 설치한다.  nib 파일을 사용하는 앱에선, 그 함수는 메모리로 nib 파일의 내용을 로드한다, 그러나 당신의 앱 윈도우에는 설치하진 않는다; 당신은 당신의 앱 델리게이트의 application:willFinishLaunchingWithOptions: 메소드에서 그것들을 설치해야만 한다.

        앱은 메인 스토리보드 파일이나 메인 nib 파일 중 하나를 가질 수 있다, 그러나 동시에 둘다 가질 수는 없다. 스토리보드는 당신의 앱의 사용자 인터페이스를 구체화하는 방법으로 선호된다. 하지만 iOS 모든 버전에 지원되지는 않는다. 당신의 앱의 메인 스토리보드 파일의 이름은 당신의 앱의 Info.plist 파일의 UIMainStoryboardFile 키값에 저장된다. (nib 기반 앱에 대해서는, 대신에 메인 nib file 의 이름이 NSMainNibFile 키에 저장된다.) 일반적으로, Xcode 는 당신이 프로젝트를 만들 때, 적당한 키값을 정한다, 그러나 필요하다면 당신은 그 값을 바꿀 수 있다.

        Info.plist 파일과 당신의 앱을 설정하기 위해 그 파일을 사용하는 방법에 대한 더 많은 정보를 원한다면, "The information Property List File" 을 보십시오.


        What to Do at Launch Time
        [##_http://yagom.tistory.com/script/powerEditor/pages/1C%7Ccfile3.uf@135A9F3350E41C22132B4A.png%7Cwidth=%22824%22%20height=%22134%22%20alt=%22%22%20filename=%2211.png%22%20filemime=%22image/jpeg%22%7C_##]
        당신의 앱이 시작되었을 때 (실행상태든 백그라운드 실행상태든) 당신의 앱 델리게이트의 application:willFinishLaunchingWithOptions:와 application:didFinishLaunchingWithOptions: 메소드를 다음 내용을 구현하도록 사용하여라.

        - 앱이 실행된 이유에 대한 정보를 찾는 실행 옵션 사전 (Launch options dictionary) 의 내용들을 확인하고, 알맞게 대응해라.

        - 어플리케이션의 중요 데이터 구조를 초기화하여라.

        - 보여질 앱의 윈도우와 뷰를 준비하여라.

        OpenGL ES 를 사용하는 앱들은 그들의 그려낸 배경등을 준비하기 위해 이 방법을 써서는 안된다. 대신, 그들은 applicationDidBecomeActive: 메소드에 전달되는 모든 OpenGL ES 호출을 지연시켜야 한다.

        [##_http://yagom.tistory.com/script/powerEditor/pages/1C%7Ccfile8.uf@145A9F3350E41C22142077.png%7Cwidth=%22824%22%20height=%22130%22%20alt=%22%22%20filename=%2212.png%22%20filemime=%22image/jpeg%22%7C_##]

        만약 당신의 앱이 시작 시간에 자동으로 메인 스토리보드나 nib 파일을 불러오지 않는다면, 당신은 보여주기 위한 당신 앱의 윈도우를 준비하기 위하여 application:willFinishLaunchingWithOptions: 메소드를 사용할 수 있다.
        가로, 세로방향을 전부 지원하는 앱에 대해선, 항상 당신의 메인 윈도우의 root view controller 를 세로 방향으로 설정하여라. 만약 장치가 시작 시간에 다른 방향으로 놓인다면, 윈도우를 보여주기 전에 시스템이 root view controller 에게 당신의 뷰를 올바른 방향으로 회전하라고 말해줄 것이다.

        당신의 application:willFinishLaunchingWithOptions: 와 application:didFinishLaunchingWithOptions: 메소드들은 항상 당신의 앱의 시작 시간을 줄이기 위해 가능한 가벼워야만 한다. 앱들은 5초 이내에 그들 자신을 초기화하고 시작하고 이벤트들을 다루도록 기대되어 진다. 만약 앱이 적절한 시간에 시작 사이클을 완료해내지 못한다면, 시스템은 무반응 상태로 놓이기 전에 그것을 죽일 것이다. 이와 같이, 당신의 시작을 늦추는 어떤 작업들도(네트워크에 접속하는 것과 같은) 동시에 발생하지 않도록 2차 쓰레드에서 실행되어야만 한다.


        실행상태로 시작할 때, 시스템은 실행 상태로의 변이를 완료하기 위해 applicationDidBecomeActive: 메소드를 호출한다. 이 메소드는 시작시간에도 그리고 백그라운드 실행상태로 변이할 때에도 호출되므로, 두 변이상태에 공통인 작업들을 수행하도록 그것을 사용하여라.
        백그라운드 실행상태로 시작될 때, 도착한 각종의 이벤트들을 다루기 위해 준비상태가 되는 것 말고는 당신의 앱이 해야할 것들이 많지 않아야만 한다.






        Responding to Interruptions
        [##_http://yagom.tistory.com/script/powerEditor/pages/1C%7Ccfile2.uf@122AFF3F50E41C791137FB.png%7Cwidth=%22824%22%20height=%22383%22%20alt=%22%22%20filename=%2213.png%22%20filemime=%22image/jpeg%22%7C_##] 전화가 왔을 때 처럼, 경보(alert) 기반의 인터럽션이 발생했을 때 어플리케이션은 사용자가 진행해야할 방법으로 유도해주기 위해서 일시적으로 비활성 상태로 이동한다. 앱은 사용자가 경보를 끝낼 떄까지 이 상태에 남아있는다. 이 지점에서, 앱은 활성 상태로 돌아가거나 백그라운드 실행상태로 이동한다. Figure 3-4는 경보기반의 인터럽션이 발생했을 때 당신의 앱을 통과하는 이벤트들의 흐름을 보여준다.
        Figure 3-4. 경보기반 인터럽션을 다루기
        (그림 생략)

        [##_http://yagom.tistory.com/script/powerEditor/pages/1C%7Ccfile29.uf@132AFF3F50E41C79128EC0.png%7Cwidth=%22824%22%20height=%2298%22%20alt=%22%22%20filename=%2214.png%22%20filemime=%22image/jpeg%22%7C_##] iOS5 에선, 배너를 보여주는 알림은 경보기반 알림이 하는 방식처럼 당신의 앱을 비활성화시키지는 않는다. 대신, 배너는 당신의 앱 윈도우의 가장 최상층에 놓이게 되고 당신의 앱은 전처럼 터치 이벤트를 계속해서 받는다. 그러나, 만약 사용자가 알림센터(notification center)를 드러내기 위해 화면을 위에서 아래로 끌어 내리면 당신의 앱은 경보기반 인터럽션이 발생했던 것처럼 비활성 상태로 이동한다. 당신의 앱은 사용자가 또다른 앱을 시작하거나, 알림 센터를 그만둘 떄까지 비활성 상태에 남아있게 된다. 이 지점에서, 당신의 앱은 알맞은 활성 상태나 백그라운드 실행 상태로 이동하게 된다. 사용자는 어떤 알림이 배너를 보여줄 것인지, 또 경보를 보여줄 것인지 설정하기 위해 앱 셋팅 (the Setting app) 을 사용할 수 있다.

        Sleep/Wake 버튼을 누르는 것은 일시적으로 당신의 앱이 비활성화되도록 하는 인터럽션의 또다른 종류이다. 사용자가 이 버튼을 눌렀을 때, 시스템은 터치 이벤트를 불능 상태로 만들고 앱을 백그라운드 실행 상태로 옮긴다, 그러나 앱의 applicationState 프로퍼티 값을 UIApplicationStateInactive ( UIApplicationStateBackground 와는 반대로) 에 할당하고, 결국 화면을 잠근다(lock). 잠긴 화면은 파일을 암호화하기 위한 데이타 보호를 사용하는 앱들을 위해 부가적인 과정을 가지고 있다. 이런 과정들은 "What to Do When an Interruption Occurs" 에 설명되어 있다.



        What to Do When an Interruption Occurs
        [##_http://yagom.tistory.com/script/powerEditor/pages/1C%7Ccfile30.uf@222AFF3F50E41C7A132410.png%7Cwidth=%22824%22%20height=%22253%22%20alt=%22%22%20filename=%2215.png%22%20filemime=%22image/jpeg%22%7C_##]
        경보기반 인터럽션은 당신의 앱에 의해 일시적인 컨트롤의 손실을 낳게 된다. 당신의 앱은 실행상태로 계속 진행된다, 하지만 시스템으로부터 터치 이벤트를 받지는 않는다.(알림 및 가속센서같은 이벤트의 종류는 계속해서 받는다.) 이 변화에 대응하여, 당신의 앱은 applicationWillResignActive: 메소드에 있는 다음의 사항을 해야만 한다.

        - 타이머와 다른 주기적인 작업등을 멈춘다.
        - 실행중인 모든 메타데이타 쿼리를 멈춘다.
        - 어떤 새로운 작업도 시작하지 않는다.
        - 동영상 재생을 멈춘다 (Airplay 인 경우만 제외하고)
        - 만약 앱이 게임 중이면, 멈춤 상태(Pause state) 로 들어간다.
        - OpenGL ES 의 Frame rate 를 줄인다.
        - 중요하지 않은 코드를 실행하는 모든 전송 혹은 작동 큐를 중단한다(suspend).


        당신의 앱이 활성 상태로 돌아갔을 때, applicationDidBecomeActive: 메소드는 applicationWillResignActive: 메소드에서 행한 모든 과정을 되돌린다. 이와 같이 재활성화 때엔 당신의 앱은 타이머를 재시작해야하고, 전송 큐를 재개해야 하고, OpenGl ES 의 Frame rate 를 다시 높여야 한다. 그러나, 게임은 자동으로 재게되지는 않는다; 게임은 사용자가 재개하기를 선택할 때 까지는 멈춤 상태로 남아있는다.

        사용자가 Sleep/Wake 버튼을 눌렀을 때, NSFileProtectionComplete 보호 옵션에 의해 보호된 파일을 가진 앱들은 그 파일에 관련된 모든 레퍼런스(reference)를 닫아야만 한다. 적당한 패스워드로 설정된 장치들에서는, Sleep/Wake 버튼을 누르는 것은 화면을 잠그고, 시스템은 확실한 보호가 실행된 파일에 대한 해독 키를 사라지게끔(throw away)한다. 스크린이 잠겼을 때, 파일에 상응하는 모든 접근 시도는 무시된다. 그러므로 만약 그러한 파일을 당신이 가지고 있다면, 당신은 applicationWillResignActive: 메소드에 있는 관련된 모든 레퍼런스를 닫아야 하고, applicationDidBecomeActive: 메소드에 있는 새로운 레퍼런스를 열어야 한다.


        Adjusting Your User Interface During a Phone Call



        사용자가 전화를 받았을 때, 그리고 전화받는 도중 당신의 앱으로 돌아왔을 때, 상태 바(status bar) 의 세로길이는 사용자가 전화하고 있다는 사실을 나타내기 위해 커지게 된다. 비슷하게, 사용자가 전화를 끝마쳤을 때, 상태 바는 보통 사이즈로 줄어든다.
        상태 바의 변화를 다루는 가장 좋은 방법은 당신의 뷰를 관리하도록 뷰 컨트롤러를 사용하는 것이다. 당신의 인터페이스에 설치되었을 때, 뷰 컨트롤러는 자동으로 상태 바 프레임 사이즈가 변할 때 그 관리되는 뷰들의 세로 길이를 조절한다.
        만약 당신의 앱이 어떤 이유로 뷰 컨트롤러를 사용하지 않는다면, 당신은 UIApplicationDidChangeStatusBarFrameNotification 의 알림에 수동으로 등록함으로써 상태 바 프레임의 변화에 대응해야 한다. 이 알림에 대한 처리 부분은 상태 바의 세로 길이를 받아서 당신의 앱의 뷰에 알맞게 적응되도록 이를 사용해야 한다.



        Moving to Background
        [##_http://yagom.tistory.com/script/powerEditor/pages/1C%7Ccfile29.uf@0260433D50E41CC92ACB16.png%7Cwidth=%22824%22%20height=%22579%22%20alt=%22%22%20filename=%2217.png%22%20filemime=%22image/jpeg%22%7C_##]사용자가 홈버튼을 눌렀을 때, Sleep/Wake 버튼을 눌렀을 때, 또는 시스템이 다른 앱을 시작했을 때, 실행상태의 앱은 비활성 상태로, 그리고 백그라운드 실행 상태로 변이한다. 이런 변이는 Figure 3-5. 에 보이는 것 처럼 앱 델리게이트의 applicationWillResignActive: 와 applicationDidEnterBackground: 메소드들을 호출하는 결과를 가져온다. applicationDidEnterBackground: 메소드에서 온 다음에, 대부분의 앱들은 결국 곧 잠자기(suspended) 상태로 이동한다. 백그라운드 실행 상태의 특정 작동을 요청하거나 (음악을 재생하는 것과 같은) 시스템으로부터 짧은 추가 실행 시간을 요청하는 앱들은 조금 더 길게 실행이 이어질 수 있다.
        Figure 3-5.  실행 상태에서 백그라운드 실행 상태로의 이동 (Moving from the foreground to the background)
        ( 그림 생략 )

        주의 : 앱들은 멀티태스킹을 지원하는 장치에서만 그리고 iOS4.0 이나 이후 버전을 실행하는 장치에서만 백그라운드 실행상태로 이동한다. 다른 모든 경우에선, 앱은 백그라운드 실행상태로 이동되는 대신 종료된다(메모리에서 부터 제거된다).


        What to Do When Moving to Background




        앱들은 백그라운드 실행상태로 움직이는 것에 대비해서 applicationDidEnterBackground: 메소드를 사용할 수 있다. 백그라운드 실행상태로 이동할 때, 모든 앱들은 다음의 내용을 해야만 한다.
        - 현재 상태 이미지가 찍히는 것에 대한 준비를 해라. 
        applicationDidEnterBackground: 메소드가 돌아왔을 때, 시스템은 당신의 앱의 사용자 인터페이스의 상태를 찍는다(picture). 그리고 변이될 에니메이션을 위한 결과 이미지를 사용한다. 만약 당신의 인터페이스의 어떤 뷰라도 민감한 정보를 포함하고 있다면, applicationDidEnterBackground: 메소드가 돌아오기 전에 그런 뷰들을 숨기거나 수정해야만 한다.

        - 사용자 데이터와 앱 상태 정보를 저장해라.
        모든 저장되지않은 변화들은 백그라운드 실행상태로 들어갈 때 디스크에 기록되어야만 한다. 이 단계는 당신의 앱이 백그라운드 실행 상태에 있는 동안 수많은 사유로 인해 조용히 종료될 수 있으므로 매우 필요하다. 당신은 필요에 따라 이 작업을 백그라운드 실행상태 스레드에서 수행할 수 있다.

        - 가능한한 많은 메모리를 비워놓아라(Free up).
        무엇을 해야하고, 왜 이것이 중요한지에 대한 더 많은 정보를 원한다면, "Memory Usage for Background Apps" 를 보십시오.

        당신의 앱 델리게이트의 applicationDidEnterBackground: 메소드는 대략 모든 업무를 종료하고 돌아오는 데 5초를 가진다. 실제로, 이 메소드는 가능한 빠르게 돌아와야만 한다. 만약 메소드가 시간이 끝나기 전에 돌아오지 못한다면, 당신의 앱은 메로리로부터 종료될 것이다. 만약 당신이 여전히 작업들을 수행하는 데 더 많은 시간을 필요로 한다면, 백그라운드 실행상태의 실행 시간을 요청하기 위한 beginBackgroundTaskWithExpirationHander: 메소드를 호출하여라 그리고 2차 스레드에서 오래 걸리는 작업들을 시작해라. 당신이 어떤 백그라운드 실행상태 작업들을 실행했더라도, applicationDidEnterBackground: 메소드는 여전히 5초 내에 종료해야만 한다.


        주의 : UIApplicationDidEnterBackgroundNotification 알림은 또한 당신의 앱의 특정한 부분들에게 백그라운드 실행상태로 들어간다는 것을 알리기 위해 전송된다. 당신의 앱의 오브젝트들은 이 알림에 대한 등록을 위해 이 기본 알림 센터를 사용할 수 있다.

        당신의 앱의 특징들에 따라, 백그라운드 실행상태로 들어갈 때, 당신의 앱이 해야만 하는 다른 것들이 있다. 예를 들면, 모든 활성상태의 Bonjour 서비스들은 잠자기(suspended) 상태로 가야만 한다. 그리고 앱은 OpenGl ES 함수들을 호출하는 것을 멈춰야만 한다. 백그라운드 실행상태로 들어갈 때 당신의 앱이 해야만 하는 것들의 목록을 보려면, "Being a Responsible Background App" 를 보십시오.


        Memory Usage for Background Apps
        [##_http://yagom.tistory.com/script/powerEditor/pages/1C%7Ccfile24.uf@14349C4450E41CE11F0AB6.png%7Cwidth=%22824%22%20height=%22238%22%20alt=%22%22%20filename=%2219.png%22%20filemime=%22image/jpeg%22%7C_##]
        모든 앱들은 백그라운드 실행상태로 들어갈 때 실용적일 수 있을 만큼 많은 메모리를 비워놓아야만 한다. 시스템은 할 수 있는 한 동시에 메모리에 많은 앱들을 유지하려고 한다. 그러나 메모리가 부족할 때, 시스템은 메모리를 회복하기 위해 잠자기(suspended) 상태의 앱들을 종료한다. 백그라운드 실행상태에 있을 때 많은 양의 메모리를 소비하는 앱들은 종료되어야 할 첫번째 앱이 될 것이다.
        실용적으로 말해서, 당신의 앱은 strong 레퍼런스가 더이상 필요하지 않게 되는 즉시 제거해야만 한다. strong 레퍼런스들을 제거하는 것은 컴파일러가 상응하는 메모리가 회복될 수 있도록 바로 오브젝트들을 release하게 해준다. 그러나 만약 당신이 퍼포먼스를 향상시키기 위해 일부 오브젝트들을 캐시(cache)에 저장하길 원한다면, 당신은 그 레퍼런스들을 제거하기 전에 앱이 백그라운드 실행상태로 변이될 떄까지 기다려야만 한다.

        당신이 가능한 빠르게 strong 레퍼런스들을 제거해야만 하는 오브젝트들의 예들은 다음을 포함한다 :

        - 이미지 오브젝트
        - 당신이 디스크로부터 다시 불러올 수 있는 큰 미디어 혹은 데이타 파일들
        - 당신의 앱이 필요로 하지 않고, 나중에 쉽게 다시 만들 수 있는 다른 모든 오브젝트들

        당신의 앱의 메모리 흔적들을 줄이기 위해, 시스템은 당신의 앱이 백그라운드 실행상태로 이동할 때 당신의 앱을 대신해서 할당된 일부 데이터들을 자동으로 삭제한다.

        - 시스템은 모든 Core Animation Layers 에 쓰이는 backing store 를 삭제한다.(?) 이런 수행은 메모리로부터 당신의 앱의 layer 오브젝트들을 삭제하지 않고, 현재의 layer 프로퍼티들을 바꾸지도 않는다. 그것은 단순히 그런 레이어의 컨텐츠들이 스크린에 등장하는 것을 막는데, 이는 백그라운드 실행상태의 앱이 어떻게든 실행되지 않도록 주어진다.

        - 캐쉬에 저장된 이미지들의 시스템 레퍼런스들을 삭제한다. (만약 당신의 앱이 이미지들에 strong 레퍼런스를 가지고 있지 않다면, 그들은 메모리로부터 차후에 삭제될 것이다).

        - 다른 시스템에 의해 관리된 캐쉬 데이터들의 strong 레퍼런스 들을 삭제한다.


        Returning to the Foreground



        실행상태로 돌아오는 것은 앱이 백그라운드 실행상태로 갔을 때 멈췄던 작업들을 다시 시작할 기회이다. 실행상태로 이동할 때 발생하는 단계들은 Figure 3-6. 에 나와있다. applicationWillEnterForeground: 메소드는 당신의 applicationDidEnterBackground: 메소드에서 행해진 모든 것들을 되돌려야(undo) 한다. 그리고 applicationDidBecomeActive: 메소드는 시작시간에 있었던 동일한 활성화 작업들을 계속해서 수행해야 한다.

        Figure 3-6. 백그라운드 실행상태에서 실행상태로의 변이 (Transitioning from the background to foreground)

        (그림 생략)


        주의 : UIApplicationWillEnterForegroundNotification 알림 또한 당신의 앱이 실행상태로 다시 들어갈 때 트랙킹하는 데 사용될 수 있다. 당신이 앱의 오브젝트들은 이 알림에 등록을 위한 기본 알림 센터를 사용할 수 있다.



        Processing Queued Notifications at Wakeup Time
        [##_http://yagom.tistory.com/script/powerEditor/pages/1C%7Ccfile27.uf@2136443F50E41D0804B24A.png%7Cwidth=%22824%22%20height=%22109%22%20alt=%22%22%20filename=%2221.png%22%20filemime=%22image/jpeg%22%7C_##]
        잠자기(suspended) 상태에 있던 어플은 실행상태나 백그라운드 실행상태로 돌아올 때 모든 대기중인 알림을 다룰 준비가 되어있어야 한다. 잠자기(Suspended) 상태 앱은 어떤 코드도 실행하지 못하므로 가로,세로의 방향 변화, 시간 변화, 설정(preference) 변화 및 앱의 보이는 모습이나 상태에 영향을 줄 수 있는 다른 많은 것들에 관련된 알림을 처리할 수 없다. 이런 변화들이 손실되지 않게끔 확신하기 위해서, 시스템은 많은 관련 알림들을 큐로 내보내고 다시 코드를 시작하는 순간 (실행상태이든 백그라운드 실행상태이든) 앱에게 그 내용들을 전달한다. 재개했을 때, 알림이 오버로딩되는 걸 막기 위해서, 시스템은 이벤트들을 합치고 앱이 잠자기(suspended) 된 이후의 순수 변화만을 반영하는 하나의 알림 (또는 각각 관련된 타입들)을 전달한다.
        Table 3-2. 는 합쳐져서 당신의 앱으로 전달될 수 있는 알림들을 나열했다. 이 알림들의 대부분은 등록된 옵저버들에게 직접적으로 전달된다. 장치의 화면 출력방향 (가로, 세로) 변화에 관련된 것들은 일반적으로 시스템 framework 에 의해 인터셉트되어 다른 방식으로 당신의 앱에게 전달된다.
        Table 3-2.  깨어있는 앱들에 전달되는 알림들 (Notifications delivered to waking apps)



        - 악세사리가 탈착 또는 부착될 때
        - 기기의 가로 또는 세로로 방향 전환을 할 때
        - 시간대가 변경될 때
        - 배터리가 저전력 상태로 변경될 때
        - 근접 센서가 작동할 때
        - 보호된 파일이 변경되었을 때
        - 외부 디스플레이에 연결되거나 해제되었을 때
        - 디스플레이 모드가 변경되었을 때
        - 설정 앱에서 내 어플의 설정이 변경되었을 때
        - 언어 또는 지역이 변경되었을 때
        - 사용자의 iCloud 계정이 변경되었을 때

        [##_http://yagom.tistory.com/script/powerEditor/pages/1C%7Ccfile1.uf@14343D4050E41D290FFDD1.png%7Cwidth=%22824%22%20height=%2293%22%20alt=%22%22%20filename=%2223.png%22%20filemime=%22image/jpeg%22%7C_##]대기된 알림들은 당신의 앱의 메인 run loop 에 전달되고 일반적으로 다른 터치 이벤트나 다른 사용자 입력 이전에 전달된다. 대부분의 앱들은 재개되었을 때 사용자가 알아차릴 수 있는 정도의 지연이 일어나지 않을 정도로 충분히 신속하게 이런 이벤트들을 전달할 수 있어야만 한다. 그러나, 만약 당신의 앱이 백그라운드 실행상태에서 돌아왔을 때 느리게 움직이는 모습을 보인다면 당신의 알림 전달 코드가 그 지연을 일으키고 있는지 결정할 Instruments 를 사용해라.

        실행상태로 돌아온 앱은 또한 마지막 업데이트 이후로 어지러워진(marked dirty) 어떤 뷰에 대해서도 뷰-업데이트 알림을 받는다. 백그라운드 실행상태에서 돌아가고 있는 앱은 여전시 setNeedDisplay 나 setNeedsDisplayInRect: 메소드들을 그 뷰의 업데이트를 요청하기 위해 호출할 수 있다. 그러나, 뷰들은 보이지 않기 때문에, 시스템은 요청들을 합치고, 앱이 실행상태로 돌아오고 난 뒤에 뷰들을 업데이트한다.


        Handling iCloud Changes



        만약 iCloud 의 상태가 어떤 이유든지 변하게 되면, 시스템은 당신의 앱에 NSUbiquityIdentityDidChangeNotification 알림을 전송한다. iCloud 상태는 사용자가 iCloud 계정에 로그인 혹은 아웃을 하거나 문서와 데이터의 싱크(syncing)가 가능해지거나 불가능해지는 상태로 변하게 된다. 이 알림은 변화를 수용하기 위한 캐시메모리나 모든 iCloud 관련 사용자 인터페이스 요소들을 업데이트하라는 신호이다. 예를 들면, 사용자가 iCloud 로그아웃을 했을 경우, 당신은 iCloud 기반의 모든 파일과 데이터들의 reference 를 삭제해야만 한다.

        만약 당신의 앱이 이미 iCloud 에 파일을 저장할 것인지에 대해 사용자에게 전달하였다면, iCloud 상태가 변했을 때 다시 전달할 필요는 없다. 사용자에게 처음으로 전달한 후에, 당신의 앱의 위치 설정들에서 사용자의 선택을 저장해라. 당신은 그러고 나면 그 설정을 Setting 번들을 사용하거나 당신의 앱의 옵션으로서 드러내길 원할수도 있다(?). 그러나 설정이 현재 사용자 기본 데이터베이스에 있지 않다면, 그 프롬프트를 반복할 필요는 없다.


        Handling Locale Changes Gracefully
        [##_http://yagom.tistory.com/script/powerEditor/pages/1C%7Ccfile25.uf@16316C4650E41D4D06368A.png%7Cwidth=%22824%22%20height=%22138%22%20alt=%22%22%20filename=%2225.png%22%20filemime=%22image/jpeg%22%7C_##]만약 사용자가 당신의 앱이 잠자기(suspended) 되어있는 동안 현재 언어를 변경한다면, 당신은 당신의 앱이 실행상태로 돌아왔을 때, 날짜, 시간, 숫자같은 지역(Locale)에 민감하게 관련된 정보들을 담고 있는 모든 뷰를 업데이트하도록 NSCurrentLocaleDidChangeNotification 알림을 사용할 수 있다. 물론, 언어관련된 문제점들을 피하는 가장 좋은 방법은 당신의 코드를 업데이트 뷰를 쉽게 만들 수 있는 방법으로 작성하는 것이다. 예를 들면:

        - NSLocale 오브젝트들을 다시 받았을 때, autoupdatingCurrentLocale 클래스 메소드를 사용하여라. 이 메소드는 변화에 대응해서 자동으로 스스로를 업데이트 해주는 지역기반 오브젝트를 반환한다. 그래서 당신은 그것을 다시만들 필요가 없다. 그러나, 지역 변화가 일어났을 때, 당신은 여전히 현재 지역에서 전달된 내용을 포함하고 있는 뷰들을 리프레쉬 해줄 필요가 있다.

        - 현재 지역 정보가 변할 때마다 캐쉬에 저장된 날짜나 숫자 formatter 오브젝트들을 다시 만들어라.
        지역 변화를 다루도록 당신의 코드를 세계화하는 데 더 많은 정보를 찾는다면, Internationalization Programming Topics 를 보십시오.


        Responding to Changes in Your App's Settings



        만약, 당신의 앱이 셋팅 앱(Setting app)에 의해 관리되는 셋팅을 가졌다면, 당신의 앱은 NSUserDefaultsDidChangeNotification 알림을 관찰해야만 한다. 사용자는 당신의 앱이 잠자기(suspended) 상태이거나 백그라운드 실행상태인 동안 셋팅을 수정할 수 있으므로, 그러한 셋팅에서 중요한 모든 변화에 대해 응답하기 위한 이런 알림을 사용할 수 있다. 어떤 경우에서는, 이 알림에 대해 응답하는 것이 잠재적인 보안 구멍을 없애는 데 도움을 줄 수 있다. 예를 들면, 이메일 프로그램은 사용자의 계정 정보의 변화에 반응해야만 한다. 이런 변화들의 감지 실패는 프라이버시, 보안 문제점들을 야기시킬 수 있다. 구체적으로, 현재 사용자들은 계정이 더이상 그 사람에게 속해있지 않은 경우에도 예전의 계정 정보를 사용하여 이메일을 보낼 수도 있다.


        NSUserDefaultsDidChangeNotification 알림을 받을 때, 당신의 앱은 모든 관련 셋팅들을 다시 로딩해야만 하고, 필요하다면 그 사용자 인터페이스를 적절하게 리셋해야 한다. 비밀번호나 다른 보안관련 정보가 변경된 경우에는, 당신은 또한 이전에 표시된 정보들을 가려야만 하고, 사용자들에게 새로운 비밀번호를 입력하도록 만들어야 한다.


        App Termination
        [##_http://yagom.tistory.com/script/powerEditor/pages/1C%7Ccfile4.uf@203FD84550E41D6E22F083.png%7Cwidth=%22824%22%20height=%22233%22%20alt=%22%22%20filename=%2227.png%22%20filemime=%22image/jpeg%22%7C_##]비록 일반적으로 앱들이 백그라운드 실행상태나 잠자기(suspended) 상태로 이동하였더라도, 다음에 나오는 조건들이 참값이라면, 당신의 앱은 종료되고, 메모리로부터 삭제된다.
        - 앱이 iOS 4.0 이전의 버전에 반하는 연결이 되었다.
        - 앱이 iOS 4.0 이전의 버전을 실행하는 장치에 배치되었다.
        - 현재 장치가 멀티테스킹을 지원하지 않는다; "Determining Whether Multitasking Is Available)"을 보십시오.
        - 앱이 Info.plist 파일에 UIApplicationExitsOnSuspended 키를 포함한다.; "Opting out of Background Execution" 을 보십시오.


        만약 당신의 앱이 (실행상태든 백그라운드 실행상태든) 종료 시기에 실행되고 있다면, 시스템은 당신의 앱 엘리게이트의 applicationWillTerminate: 메소드를 호출하여 당신이 필요한 모든 정리(Cleanup) 을 수행할 수 있게 해준다. 당신은 현재 상태를 다음 실행 때 복원하기 위해 사용하게 되는 앱 상태 정보나 사용자 데이터 등을 저장하기 위해 이 메소드를 사용할 수 있다. 당신의 메소드는 모든 작업을 수행하고 반환하는 데 약 5초의 시간을 가질 수 있다. 만약 시간 내에 반환하지 못한다면, 앱은 메모리로부터 삭제되고 종료될 것이다.

        중요: TheapplicationWillTerminate: 메소드는 만약 당신의 앱이 현재 잠자기(suspended) 상태라면 호출되지 않는다.


        당신이 당신의 앱을 iOS SDK4 나 이후 버전을 사용해서 개발하는 경우, 당신은 아무 통지없이 당신의 앱이 종료되는 것에 대해 준비되어야만 한다. 사용자는 멀티태스킹 UI 를 사용하여 분명하게 앱을 종료시킬 수 있다. 게다가, 만약 메모리가 제한되었다면, 시스템은 더 많은 공간을 만들어내기 위해 앱을 메모리로부터 제거할 수도 있다. 잠자기(suspended) 상태의 앱들은 종료의 통지를 받지 않는다, 그러나 만약 당신의 앱이 백그라운드 실행 상태(잠자기(suspended) 상태가 아니라)에서 현재 돌아가고 있다면, 시스템은 당신의 앱 델리게이트의 applicationWillTerminate: 메소드를 호출한다. 당신의 앱은 이 메소드로부터 추가적인 백그라운드 실행상태 수행 시간을 요청할 수 없다.




        by yagom

        facebook : http://fb.yagom.net

        twitter : http://twitter.yagom.net ( @yagomsoft )

        p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

        RSS Feed 받기   


        ↓↓↓저 열심히 썼는데 손가락 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 





        저작자 표시 비영리 변경 금지
        신고
        Posted by yagom

        이 문서는 2012. 12. 기준으로 작성된 글이므로, 이후에 애플 문서의 내용이 변경될 수 있습니다.
        또한 전문 번역가가 아니기 때문에 의역, 오역의 소지가 다분히 많습니다.
        참고하시기 바랍니다.

        공개 수배 합니다!
        유용한 iOS 개발문서를 함께 번역해 나갈 분들을 찾습니다.
        현재도 함께 작업중이신 분들 모두 전문 번역가 아닙니다.
        모두 열정과 열의로 함께 작업하고 계십니다.
        자신의 재능을 자신뿐만 아니라 또 다른 누군가를 위해서 사용한다면 더더욱 빛이 날 것입니다.
        함께하길 원하는 분께서는 덧글 또는 이메일 주시기 바랍니다 :)
         

        오늘의 주제

        1. The User Interface
        2. The App Bundle 



        파헤치기 네 번째 시간입니다.^^

        이번 파트는 낭만떡대 님께서 도와주셨습니다. 번역에 도움주셔서 진심으로 고맙습니다 :)

        자, 그럼 출발해 봅시다^^~


        # The User Interface



        The User Interface
        모든 iOS앱은 적어도 하나의 윈도우와 하나이상의 뷰를 가지고 있습니다. UIWindow클래스의 인스턴스인 window는 컨텐츠를 나타낼 공간?을 제공합니다. View들은 UIView의 서브글래스로서 컨텐츠를 그리고 터치 이벤트를 다루는 역할을 담당합니다. OpenGL ES를 사용하여 만든 인터페이스는 보통 하나의 뷰를 갖고 그 뷰를 컨텐츠를 랜더링 하는데 사용합니다. 
        뷰 컨트롤러는 사용자 인터페이스를 위한 매우 중요한 역할을 담당 합니다. 뷰 컨트롤러는 UIViewController의 서브클래스로 뷰들의 셋을 관리하고 그 뷰들간의 인터랙션을 관리 및 다른 역할을들 수행해야 합니다. iOS 앱은 컨텐츠를 표현하기에 너무 제한적인 공간을 가지고 있습니다. 뷰들을 교체하고 다른 뷰 컨트롤러의 뷰들과 바꿀 수 있는 인프라스트럭쳐를 제공합니다. 그러므로 뷰 컨트롤러들은 하나의 컨텐츠 타입에서 다른 타입으로 변환하는데 당신이 어떻게 구현을 하는가에 달려있습니다. 

        당신은 뷰 컨트롤러 객체들은 독립적이라는 것을 항상 생각해야 합니다. 뷰 컨트롤러들은 자신이 가지고 있는 뷰 들을 만들고 제거하며, 뷰들을 화면에 보여주고, 뷰와 다른 객체들간의 상호작용을 돕습니다.




        Building an Interface Using UIKit Views
        UIKit의 view들을 사용하면 기본적인 인터페이스를 빠르게 구현할 수 있기 때문에 앱을 쉽게  만들 수 있습니다.
        UIKit을 이용하면 다양한 종류의 view를 이용하여 데이터를 표현할 수 있습니다. 
        Contol(뷰의 특별한 타입)들은 사용자의 액션이 일어날 때 특정 행동을 수행 할 수 있도록 빌트인 매커니즘 을 제공합니다. 예를 들어, 버튼을 클릭하면 버튼과 연결된 액션 메소드가 호출됩니다.

        UIKit view를 기반으로 어플을 만들때 Interface Builder(xCode에 설치되어있는 인터페이스 에디터)를 사용하면 시각적으로 뷰들을 구성할 수 있습니다.
        Interface Builder는 표준 view들과 control들 그리고 그 외 객체들을 라이브러리형태로 제공합니다. 
        라이브러리에서 객체들을 드래그해서 화면에 배치할 수 있습니다. (WYSWYG 형태로 사용자 인터페이스를 구성 할 수 있습니다)
        또한 inspectors를 이용해 객체들의 속성값을 설정할 수 있습니다. 코드로 직접 작성하는 것보다 인터페이스 빌더를 사용하면 처리속도가 빠르며 앱의 실행 없이 결과를 즉시 확인 할 수 있습니다.

        Note: 커스텀 뷰를 UIKit의 뷰를 UIKit 뷰 구조에 포함시킬 수 있습니다. 커스텀 뷰는 이벤트 제어와 그리기 등을 모두 당신이 제어하는 UIView의 서브클래스 입니다. 커스텀 뷰의 제작과 그것을 당신의 뷰 구조에 포함시기는 방법에 대하여 추가적인 정보를 얻으려면 View Programming Guide for iOS를 참고하십시오.

        그림 2-3은 뷰 객체들로만 구성된 앱의 기본 구조를 보여줍니다.
        흰색 배경을 가진 main view가 3개의 서브뷰(이미지뷰, 텍스트뷰, 버튼뷰)를 가지고 있고 윈도우에 올라가 있으며 이 모든 뷰는 하나의 View Controller가 관리합니다.


        뷰 컨트롤러는 하나의 컨텐츠 뷰를 가지고 있고 이 뷰는 스스로 다른 뷰들을 가지고 있을 수 있습니다. 
        몇몇의 뷰 컨트롤러들은 다른 뷰 컨트롤러의 컨테이너 역할을 합니다.
        두 개의 뷰 컨트롤러를 하나의 화면에 보여주는 역할을 하는 split view Controller가 하나의 예 입니다.
        뷰 컨트롤러의 역할에 대해 더 많은 정보를 얻고 싶으면 "View Controller Programming Guide for iOS"를 읽어보세요. 뷰에 대한 정보를 원하시면 "View Programming Guide for iOS"를 읽어보세요.



        Building an Interface Using Views and OpenGL ES


        높은 프래임 래이트 또는 정교한 표현이 필요한 게임 같은 앱들은 OpenGL ES를 사용하여 구성 할 수 있습니다.

        가장 심플한 OpenGL ES 앱은 하나의 윈도우에 하나의 view를 올린 형태 입니다. 또한 OpenGL ES와 UIKit view들을 혼합해서 앱을 구현 할 수 도 있습니다.


        그림 2-4는 OpenGL ES를 이용한 앱을 구성을 보여줍니다. UIKit view와 달리 OpenGL ES는 다른 종류의 layer객체(CAEAGLLayer 객체)에 지원을 받습니다.


        CAEAGLLayer 객체는 OpenGL ES이 화면에 컨텐츠를 표현할 수 해줍니다. 또한 앱은 화면을 관리 하기 위해 EAGLContext 객체를 생성하고 뷰들을 저장하고 관리리 합니다.


        OpenGL ES에 대한 더 많은 정보는 "OpenGL ES Programming Guide for iOS"를 참고하세요



        The App Bundle

        앱을 build할때 xCode는 bundle로 묶습니다. bundle이란 앱의 정보와 자료를 하나의 공간에 그룹화해서 저장한 하나의 디렉토리 입니다.

        앱 번들은 app icon, 이미지 파일, 지역화된 컨텐츠들과 같은 자원과 앱 실행파일을 담고 있습니다. 

        테이블 2-3은 전형적인 iOS 앱 번들의 내용을 보여 줍니다. (이 앱 번들은 하나의 예이기 때문에 몇몇 파일들은 당신의 앱 번들에 보이지 않을 수 있습니다.)




        File

        Example

        Description

        App executable

        MyApp

        [필수] 컴파일 된 코드를 담은 실행 파일.(.app 확장자를 가진다)

        The information property list file

        Info.plist

        [필수]Info.plist파일은 앱의 설정 데이터를 담고 있습니다. 시스템에서 이 데이터를 보고 어떻게 앱과 상호작용 할지 결정합니다.

        App icons

        Icon.png

        Icon@2x.ong

        Icon-Small.png

        Icon-Small@2x.ong

        [필수]App icon은 디바이스의 홈 스크린에 앱을 표현하는데 사용됩니다. @2x라고 이름이 붙은 아이콘들은 레티나 디스플레이를 위해 사용되는 아이콘 입니다.

        Lanch images

        Default.png

        Default-Portrait.png

        Default-Landscape.png

        [필수(1개이상)]시스템은 이 이미지들은 앱이 처음 실행될 때 임시 배경으로 사용합니다. 이 배경은 앱의 인터페이스가 화면에 나타날 준비가 완료되면 바로 제거됩니다.

        Storyboard files(or nib files)

        MainBoard.storyboard

        스토리보드는 앱이 화면에 보여주는 뷰와 뷰 컨트롤러들을 포함합니다. 뷰는 뷰 컨트롤러들이 뷰를 보여주는 것에 따라 조직됩니다. 또한 스토리보드는 화면전환 방법을 보여줍니다.

        메인 스토리보드 파일은 Xcode에서 프로젝트를 생성할 때 지정됩니다. Info.plist파일에서 NSMainStoryboardFile 키의 값을 변경하여 메인 스토리보드 파일의 이름을 변경할 수 있습니다. 스토리보드 대신 nib 파일을 사용하는 앱에서는 NSMainStoryboardFile키 대신 NSMainNibFile 키를 사용하여 메인 nib 파일을 지정할 수 있습니다.

        스토리 보드 또는 nib를 꼭 사용하여야 하는 것은 아니지만 사용하는 것을 추천합니다.

        Ad hoc distribution icon

        iTunesArtwork

        Ad-hoc방법으로 당신의 앱을 배포하려고 한다면 512x512사이즈의 앱 아이콘이 필요합니다. 보통 이 파일은 앱 스토어에 등록할 때 iTunes Connect에서 요구하는 파일인데 Ad-hoc 방법으로 앱을 배포하면 앱 스토어를 거치지 않기 때문에 이 아이콘이 반드시 필요하다. 이 아이콘은 iTunes에서 당신의 어플을 표시할 때 사용됩니다.

         

        파일 이름은 반드시 iTunesArtwork여야 하고 파일 확장자를 붙이면 안됩니다. 이 파일은 Ad-hoc방법으로 앱을 배포할때만 필요하며 그 외의 경우에는 필요하지 않습니다.

        Setting bundle

        Settings.bundle

        설정 앱(톱니바퀴모양의 아이폰 기본 셋팅 어플리케이션)”을 통해 당신의 앱의 환경설정을 보여주고 싶다면 반드시 Settings.bundle을 사용해야 한다. bundle은 앱의 환경설정을 위해 속성목록과 다른 리소스를 담고 있습니다. “설정 앱은 이 번들을 당신의 앱이 필요한 인터페이스 요소들을 수집하기 위하여 사용합니다.

        bundle의 사용은 선택사항이며 더 많은 정보를 얻고 싶다면 “Preferences and Settings Programming Guide”를 읽어보세요

        Nonlocalized resource files

        Sun.png

        Mydata.plist

         

        Nonlocalized resource는 이미지, 사운드, 비디오, 커스텀 데이터 파일 등을 포함할 수 있습니다. 이 모든 파일은 App bundle의 상위 레벨에 위치 하는 것이 좋습니다.

        Subdirectories for localized resources

        en.lproj

        fr.lproj

        es.lproj

        지역화된 리소스들은 반드시 language-specific project directories에 위치해야 합니다. 또한 파일 이름은 ISO 639-1 에 정의된 언어 축약형태 + .lproj 라는 접미사가 붙어야 합니다. ( 예들 들어, en.lproj, fr.lproj, es.lproj 이 디렉토리들은 영어, 프랑스어, 스페인어를 위한 지역화 자원을 담고있다)

         

        app icon, lunch image, Settings icon 등의 정보 또한 language-specific project directories에 설정하면 지역화가 가능합니다. 더 많은 지역화 정보는 “Localized Resource Files”를 참고하세요.


        iOS앱 번들의 구조에 대해 더 많은 정보를 원하시면 “Bundle Programming Guide”를 참고하시고, 번들로부터 리소스파일을 어떻게 로딩하는지에 대한 정보는 “Loading Resources Into Your App”을 참고하세요.



        후아~ 힘드네용+_+ !!!

        번역하느라 고생하신 낭만떡대님께 다시 한 번 진심으로 감사의 말씀 전합니다 :)
         
        많은 분들의 도움의 손길 필요로 합니다.

        만약 내용 중에 오역, 또는 잘못된 점이 있다면 언제든지 지적해 주시고, 잘 이해가 되지 않는 부분에 대해서는 덧글 남겨주시면 고맙겠습니다 :)

        새해 복 많이 받으세요~! 



        by yagom

        facebook : http://fb.yagom.net

        twitter : http://twitter.yagom.net ( @yagomsoft )

        p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

        RSS Feed 받기   


        ↓↓↓저 열심히 썼는데 손가락 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 





        저작자 표시 비영리 변경 금지
        신고
        Posted by yagom

        이 문서는 2012. 12. 23. 기준으로 작성된 글이므로, 이후에 애플 문서의 내용이 변경될 수 있습니다.
        또한 전문 번역가가 아니기 때문에 의역, 오역의 소지가 다분히 많습니다.
        참고하시기 바랍니다.


        공개 수배 합니다!
        유용한 iOS 개발문서를 함께 번역해 나갈 분들을 찾습니다.
        현재도 함께 작업중이신 분들 모두 전문 번역가 아닙니다.
        모두 열정과 열의로 함께 작업하고 계십니다.
        자신의 재능을 자신뿐만 아니라 또 다른 누군가를 위해서 사용한다면 더더욱 빛이 날 것입니다.
        함께하길 원하는 분께서는 덧글 또는 이메일 주시기 바랍니다 :)


        오늘의 주제

        1. Core App Objects of Your App
        2. The Data Model 



        파헤치기 세 번째 시간입니다.^^

        이번 파트는 낭만떡대 님께서 도와주셨습니다. 번역에 도움주셔서 진심으로 고맙습니다 :)

        자, 그럼 출발해 봅시다^^~


        # The Core Objects of Your App



        Core App Objects

         UIKit은 모든 앱을 위한 기반을 제공합니다. 그러나 앱의 특정한 동작을 위해 커스텀 객체를 정의해야 합니다. 당신의 앱은 iOS와의 중요한 상호작용과 이벤트 루프를 관리하는 UIKit 객체로 구성 되야 합니다. 상속, 델리게이션 그리고 그 외 다른 테크닉들의 조합을 통해 UIKit에 정의된 기본 동작을 수정할 수 있습니다.
         
        UIKit 객체들을 커스터마이징 하는 것뿐만 아니라, 객체들을 직접 정의할 수 있습니다. 앱 개발의 가장 큰 부분은 데이터 객체 구현 입니다. 또한 사용자인터페이스 객체를 제공해야 하는데 다행스럽게도 사용자 인터페이스 쉽게 만들 수 있도록 유용한 클래스들을 UIkit에서 제공합니다.

        The Core Objects of Your App

        사용자에 의해 앱이 구동 될 때부터 종료될 때까지 UIKit 프레임워크는 앱의 수많은 핵심 동작을 관리합니다. 앱의 심장은 UIApplication 객체이며 이 객체는 시스템으로부터 이벤트를 받고 핸들링 하기 위해 커스텀 코드에 이벤트를 전달합니다. 그 외 다른 UIKit 객체들도 당신의 앱 동작을 관리하기 위한 역할을 담당합니다. 이러한 객체들은 앱의 상세구동을 다루기 위해 비슷한 방법으로 당신의 코드를 호출합니다.

        UIKit이 어떻게 커스텀 코드와 동작하는지 이해하기 위해서, 다음 그림과 도표를 보면 도움이 됩니다.
        그림 2-1은 앱의 가장 보편적인 객체간의 상호작용을 볼 수 있으며, 테이블 2-1은 각각의 객체들의 역할에 대해 설명되어 있습니다. 그림에서 볼 수 있듯이 iOS 앱은 MVC 디자인 패턴으로 구성되어 있습니다. 이 패턴은 데이터를 표현하기 위해 view로 부터 데이터 객체를 분리 합니다. 이러한 분리는 특히 유니버셜 앱을 만들 때 유용한데, 동일한 데이터 객체를 이용하면서 view들 만 교체하여 사용 할 수 있습니다. (즉 동일한 데이터 모델을 사용해 view만 상황에 맞게 표현해주면 아이폰과 아이패드에서 동시에 동작하는 유니버셜 앱 제작에 편리합니다.)


        테이블 2-1 The roll of objects in an iOS

        Object(객체)

        Description(설명)

        UIApplication object

         

        당신은 UIApplication 객체를 상속작업 없이 있는 그대로 사용합니다. 이 컨트롤러 객체는 상위계층에서의 앱 동작을 조정하고, 앱 이벤트 루프를 관리합니다. 당신의 커스텀 앱 계층 로직은 UIApplication 객체와 함께 동작하는 앱델리게이트 객체에 속하게 됩니다.

        App delegate object

         

        App delegate 구동 시 UIApplicationMain function 의해 생성되는 커스텀체입니다. 객체의 중요한 역할은 앱 내에서 상태 전이를 관리 하는 일 입니다. 예를 들어, 객체는 앱이 처음 구동할 (또는 background상태에서 다시 재 구동 될 때) 초기화 및 transitions(특정작업, 변화) 핸들링을 담당합니다. app delegate가 어떻게 state transitions(상태변화) 관리 하는지를 자세히 알고 싶다면 “Managing App State Changes.” 읽어보세요.

         iOS 5.0이후 버전에서는 app delegate 다른 app-related events(앱 관련 이벤트들) 다루는데 사용할 있습니다. xCode 프로젝트 템플릿들은 app delegate UIResponder의 서브클래스로 정의되어 있습니다. 만약 UIApplication객체가 이벤트를 처리하지 않으면 처리되지 않은 이벤트는 app delegate에게 전달됩니다. 이때 다룰 수 있는 이벤트 종류와 자세한 정보 “UIResponder Class Reference.” 읽어보세요.

        Documents and data

        model objects

         

        Data model 객체는 앱의 컨텐츠를 저장합니다. 예를 들어, 은행 앱은 금융거래 정보를 저장하고, 그림그리는 앱은 이미지를 저장하거나 더 나아가 그림이 그려지기 위한 명령 순서를 저장하기도 합니다.(후자의 경우, 이미지 객체는 이미지 데이터를 포함하기 위한 보관장소이므로 데이터 객체입니다.)

        데이터 모델 객체의 부분 또는 전체를 관리하기 위해 다큐먼트 객체(UIDocument 서브글래스 객체) 사용할 있습니다. 다큐먼트 객체의 사용은 필수는 아니지만 파일 또는 파일패키지에 데이터를 그룹화해 저장할 수 있는 편리한 방법을 제공합니다. 많은 정보는 “Defining a Document-Based Data Model.” 읽어보세요. 

        View controller objects

         

        View controller objects는 앱의 화면 구성을 관리합니다. 하나의 view controller는 하나의 view 와 그 view sub-view들을 관리 합니다그것들이 화면에 보여지는 순간, 뷰 컨트롤러는 그것들을 앱 윈도우에 올려서 화면에 보여지도록 합니다.

        UIViewController 클래스는 view controller 객체들의 기본 클래스 입니다. UIViewController view를 위한 기본 기능을 제공하고 화면에 표현하고, 디바이스의 로데이션에 대응해 view들을 로테이션 하는 역할을 담당하며 그 외 추가의 표준 시스템 행동을 제공합니다. UIKit과 다른 프레임 워크들은 이미지 픽커, 탭바, 네비게이션과 같은 기본 시스템 인터페이스의 동작을 위해 추가의 view controller 객체들을 제공하고 있습니다. 더 많은 정보를 원하면 "View Controller Programming Guide for iOS"를 읽어보세요.

        UIWindow object

         

        UIWindow 객체는 스크린에 보여지는 view들을 관장합니다. 대부분의 앱들은 하나의 윈도우를 가지고 있고 그 윈도우는 메인 스크린이 됩니다. 그러나 몇몇 앱들은 외부 디스플레이에 보여지는 컨텐츠들을 위해 추가의 window를 가지는 경우도 있습니다.(외부 모니터 등 외부 화면 출력을 위해)

        view를 교체하기 위해 view controller를 사용해 window에 올려진 view들을 변경해야 하고 절대로 윈도우 자체를 교체하면 안됩니다.

        덧붙여, 뷰들을 관리하기 위해서 윈도우들은 뷰와 뷰컨트롤러들에게 이벤트들을 전달해주는 UIApplication 객체와 함께 작동합니다

        View, control, and layer objects

         

        View Control은 컨텐츠의 시각적 표현을 위해 사용 됩니다. View는 지정된 직사각형 영역에 컨텐츠를 그리고(묘사하고) 그 영역에서 발생하는 이벤트에 응답하는 객체입니다. Control은 버튼, 텍스트필드 같은 특별한 타입의 view들을 의미 합니다.

        UIKit 프레임 워크는 많은 종류의 표준화된 view들을 제공합니다. 또한 UIView(또는 그 하위 클래스)를 직접 상속하여 당신만의 커스텀 view를 정의 할 수도 있습니다.

         또한 뷰와 컨트롤들이 결합되는 것과 마찬가지로, 앱들은 코어 애니메이션 레이어와 뷰들이 결합될 수 있습니다. 레이어 객체은 눈에 보이는 컨텐츠를 표현하기위한 데이터 객체입니다. 뷰들은 레이어를 짧은시간안에 효율적으로 그들의 컨텐츠를 렌더링하기 위해서 사용합니다.커스텀 레이어 객체를 추가하여 복잡한 애니메이션을 구현하는데 사용할 수 있습니다.





        하나의 iOS 앱이 다른 앱들과 구분되는 것은 데이터를 어떻게 관리하고 사용자에게 데이터를 어떻게 보여주는가에 따라 달려있습니다. UIKit과 상호작용하는 대부분의 객체들은 당신의 앱을 결정짓지 못하지만 앱의 동작을 개선할 수 있습니다. 예를 들어, 앱 델리게이트의 메소드가 앱 상태 변화에 대한 알림을 준다면 그에 상응하여 당신의 커스텀 코드가 적절한 반응을 할 수 있을 것입니다.

        위의 클래스들에 대한 정보를 얻고 싶다면 해당 클래스 레퍼런스를 보세요. 또한 어떻게 이벤트들이 동작하는지에 대한 flow정보와 그 flow 안에서 당신의 앱이 어떤 반응을 해야 하는지에 대한 정보를 얻고 싶으면 "App States and Multitasking"부분을 참고하세요

        # The Data Model

         




        The Data Model

        앱의 데이터 모델은 데이터 구조와 항상 같은 상태로 데이터를 유지하는데 필요한 작동 로직으로 구성됩니다. 데이터 모델을 앱의 사용자 인터페이스로부터 완전히 분리 하기 싫겠지만 데이터 모델 객체의 구현은 특정 view 또는 view contoller에 의지하면 안되고 분리 되어야 합니다. 사용자 인터페이스로부터 데이터를 분리 시키면 유니버셜 앱(아이폰과 아이패드을 모두 지원하는 앱)을 만들기 쉬워지고, 코드를 부분적으로 재사용하기 좋게 해줍니다.

        만약 데이터 모델을 아직 정의 하지 않았다면, iOS frameworks가 데이터 모델을 분리하도록 도와 줄 것입니다. 다음에 나오는 섹션은 데이터모델의 특정 타입을 정의할 때 당신이 사용할 수 있는 객체들을 보여줍니다.

        Defining a Custom Data Model

        커스텀 데이터 모델을 정의할 때, 상위 레벨 구조를 표현하기 위한 커스텀 객체를 생성하십시오. 그러고 시스템에서 제공하는 객체의 이점을 잘 활용하여 더욱 간편하게 데이터 타입을 만들도록 하세요. Foundation framework는 표 2-2에 나열되어있는 것과 같이 객체지향적으로 문자열, 숫자 그리고 많은 종류의 간단한 데이터들을 관리하기위한 객체들을 제공합니다. 시간도 절약되고, 많은 수의 시스템 루틴들이 기본 객체들을 사용하기 때문에 이 객체들을 사용하는 것이 선호됩니다.



        테이블 2-2 Data classes in the Foundation framework

        Data

        Class

        Description

        String and text

        NSString

        (NSMutableString)

        NSAttributedString

        (NSMutableAttibutedString)

        iOS에서 string Unicode기반입니다. string클래스들은 다양한 방법으로 string을 생성하고 조작하는 방법을 제공합니다.

        Attributed string클래스는 string을 꾸밀 수 있도록 해줍니다(, 반드시 Core Text와 결합하여 사용하여야 합니다)

        Numbers

        NSNumber

        NSDecimalNumber

        NSIndexPath

        숫자와 관련된 정보를 저장하고 싶을 때는 number클래스를 이용하세요. NSNumber클래스는 정수(Integer), 실수(floating-point values), Booleans, 문자(char) 타입을 표현할 수 있습니다. NSIndexPath 클래스는 주로 계층적인 리스트에서 다중 레이어 선택을 명시할 때 주로 사용되는 숫자들의 순서를 저장합니다(주로 테이블뷰에서 많이 사용하죠).

        Raw bytes

        NSData(NSMutableData)

        NSValue

        바이트 데이터(Raw streams of bytes)를 저장할 때는 data object를 사용하세요. 데이터 객체는 아카이브 형식으로 객체를 저장할 때도 사용됩니다. NSValue 클래스는 카테고리를 사용하여 확장할 때 또는 point rectangle과 같은 데이터 타입을 저장하는데 사용됩니다.

        Dates and times

        NSData

        NSDataComponents

        타임스탬프, 달력날짜, 다른 시간관련 정보를 저장할 때 사용하세요.

        URLs

        NSURL

        네트워크 자원의 참조하는 것 뿐만 아니라 URLs 은 파일 저장 위치(file path)를 저장하는데도 사용할 수 있습니다. NSURL클래스는 심지어 파일에 관련된 속성들을 얻어오고 수정할 수 있도록 지원합니다.

        Collections

        NSArray

        (NSMuatableArray)

        NSDictionary

        (NSMuatubaleDictionary)

        NSIndexSet

        (NSMutableIndexSet)

        NSOrderedSet

        (NSMutableOrderedSet)

        NSSet

        (NSMuatableSet)

        collection들은 관련된 객체들을 그룹화해 한곳에 저장할 때 사용하세요. Foundation framwork는 여러 다른 타입의 콜렉션 클래스들을 지원해 줍니다.

         



        -          NSInteger/NSUInteger : 부호가 있는 또는 없는 정수(시스템 아키텍쳐에 따라서 사이즈가 결정됨).

        -          NSRange: 영역을 지정하는 구조체. 예를 들어, 문자열 내에서 선택된 문자들의 영역을 지정할 수 있음.

        -          NSTimeInterval: 주어진 시간 간격의 초 단위 수

        -          CGPont: 위치를 정의하는 x,y좌표

        -          CGSize: 가로와 세로의 넓이 좌표값

        -          CGRect:  사각형 지역을 정의하는 값(CGPoint CGSize를 가진다)

         

        물론, 커스텀 데이터 객체는 스칼라 값과 객체변수를 혼합해서 클래스의 멤버 변수로 선언 가능합니다. Listing 2-1은 간단한 사진첩을 위한 클래스 구현부분 입니다. 이 클래스의 인스턴스는 이미지 배열”, “이미지에 대한 익덱스번호”, “사진첩 제목  “수정가능여부(스칼라 변수인 BOOL)”를 갖습니다.

        Listing 2-1 Definition of a custom data object


        주의 : 데이터 객체를 정의할 때, 어떤 멤버변수든간에 객체에 접근하려는 클라이언트트에게 노출시키기 위해서 프로퍼티 선언을 해줄 것을 강력히 권고합니다. 구현파일에 이 프로퍼티를 결합해 주는 것은 당신이 요청하는 속성에 따라서 적절한 접근 메소드를 자동으로 생성해 줍니다. 이것은 객체의 관계가 적절하게 유지되는 것과 적절한 시기에 객체가 제거되는 것을 보장합니다.

        당신의 커스텀 객체를 다룰 때 되돌리기 기능이 어떻게 동작할 것인가 고려해 보십시오. 되돌리기 기능을 지원한다는 것은 당신의 객체가 바꾼 것을 깨끗하게 되돌린다는 것을 의미합니다. 만약 당신의 객체가 복잡한 로직을 포함한다면, 당신은 되돌리기 쉽도록 하는 것을 고려해야 합니다. 아래에 당신의 객체에 되돌리기 기능을 구현하기 쉽도록 하는 팁들이 있습니다.

        -          대칭이 되도록 메소드들을 구현 하십시오. 예를 들어, 아이템을 더하는 메소드를 구현하면 아이템을 빼는 매소드도 같이 구현하세요

        -          멤버 변수의 값을 바꾸는 코드를 동작 로직에서 제거하십시오.

        -          많은 단계를 거치는 액션의 경우에는 NSUndoManager 객체를 사용하여 단계를 통합하도록 하십시오.

         

        되돌기리 기능을 제공하는 방법에 대한 더 많은 정보를 얻고 싶으면 “Undo Architecture”를 참고하세요.



        Defining a Structured Data Model Using Core Data.
        Core Data는 객체를 영구적으로 저장할 수 있도록 해주는 프레임워크 입니다. Core Data는 MVC디자인패턴에서 model data를 파일로 영구 저장하고 다시 읽어 들일 수 있도록 해줍니다. 이것은 아카이빙과(“Archives and Serializations Programming Guide를 보세요) 비슷하지만 더 많은 기능을 제공 합니다.

        -          Core Data는 모델 객체의 모든 변화를 관리하기 위한 인프라스트럭쳐 입니다. Core Data undo(되돌리기), redo(되돌긴거 취소하기) 기능을 제공하며, 객체들의 상호관계를 유지하도록 지원해 줍니다.

        -          코어데이터는 언제든지 메모리 내에 있는 모델 객체의 일부분을 유지할 수 있도록 해줍니다. 이것은 iOS 앱에서 굉장히 중요합니다.

        -          코어데이터는 모델 객체의 구조를 표현하는데에 사용됩니다. 당신의 모델 클래스의 주요 기능과 그 관계에 대해서 GUI 기반의 편집기를 통하여 정의 할 수 있습니다. 이는 기본값과 값의 범위 등을 설정 등을 포함아여 강력한 기능을 무료로 사용할 수 있도록 제공합니다.

        -          코어데이터는 당신의 객체를 수정한 것에 대하여 분리된 상태로 유지할 수 있습니다. 이는 당신이 원한다면 유용하게 쓰일 수 있씁니다. 예를 들어, 사용자가 하나의 뷰에서 수정을 해도, 다른 뷰에서는 수정한 것의 영향을 주지 않게 할 수 있습니다.

        -          또한 데이터의 버져닝과 마이그레이션을 지원합니다. 이 기능은 예전 데이터를 현재의 버전으로 업그레이드를 하기 쉽게 도와 줍니다.

        -          데이터를 iCloud에 쉽게 저장할 수 있도록 해주며, 다양한 디스바이스에서 접근 할 수 있도록 해줍니다.

         

        Core Data 에 대한 자세한 정보는 “Core Data Programming Guide”를 참고 하세요


        Defining a Document-Based Data Model
        Document-based 데이터 모델은 디스크에 파일을 저장할 수 있는 편리한 방법입니다. 이 타입의 데이터 모델에서는, 당신은 디스크상의 하나의 파일(또는 하나의 파일 패키지)에 구성되어있는 도큐먼트 객체를 사용합니다. 그 도큐먼트 객체는 파일에 읽기 쓰기에 대해 반응하는 것이 가능하며, 도큐먼트 컨텐츠를 화면에 보여줄 수 있도록 뷰 컨트롤러들과 동작할 수 있습니다. 도큐먼트 객체의 원래 사용목적은 사용자 데이터를 포함한 파일을 관리하는 것입니다. 예를 들어, 앱은 각각의 도큐먼트 객체가 각각의 텍스트 파일을 관리하기 위하여 텍스트 파일들을 만듭니다. 그러나 당신은 도큐먼트 객체를 보호하여야 할 앱 데이터를 파일로 저장할 때도 사용할 수 있습니다.

        그림 2-2는 도큐먼트, 파일, 객체 간의 관계를 보여줍니다. 예외 없이 각각의 document는 다른 document와 직접적으로 연결되지 않습니다. 도큐먼트는 하나의 파일(또는 파일 패키지)를 관리하며, 파일 내부의 데이터를 메모리와 연결하는 역할을 합니다. 왜냐하면 파일 내부의 컨텐츠는 유일하고, 각가의 도큐먼트에 연관된 데이터 구조도 유일하기 때문입니다. 

        UIDocument 클래스를 사용하여 당신의 iOS 앱에 도큐먼트 객체를 구현하십시오. 이 클래스는 도큐먼트의 측면에서 파일 관리에 필요한 기본 기반을 제공할 것입니다. UIDocument가 가지는 다른 장점들은 아래와 같습니다.
        - 적당한 시점에 도큐먼트 컨텐츠가 자동으로 저장되도록 지원한다.
        - iCloud에 저장된 도큐먼트들을 관리할 할 수 있습니다. 버전 충돌을 위한 방법도 제공합니다.
        - 되돌리기 기능을 제공합니다.

        UIDocumet를 이용한 다큐먼트 기반의 앱을 구현해야 하는지 알고 싶다면  “Document-Based App Programming Guide for iOS”를 보세요. 


        Integrating iCloud Support Into Your App
        데이터를 저장하는 방법과 관계 없이 iCloud는 사용자의 모든 단말에서 데이터를 사용할 수 있게 만드는 가장 좋은 방법입니다. 데이터를 앱의 샌드박스 디렉토르에 저장하는 것 대신 사용자 iCloud저장소에 저장 할 수 있습니다.  그런데 주의할 점은 아이클라우드에 저장하게 되면 파일에 대한 멀티플 엑세스가 가능해지기 때문에 추가의 작업이 필요합니다.
        - Document 기반의 앱은 UIDocument 클래스를 통해 iCloud에 접근 할 수 있습니다. UIDocument클래스를 이용하면 iCloud 기반의 파일을 다룰 때 복잡한 인터랙션을 쉽게 다룰 수 있습니다.
        - Core Data 를 사용한 앱 또한 Core Data Framework를 이용하면 자동으로 사용자의 모든 단말계정에 데이터를 저장하고 관리 할 수 있습니다.
        - 만약 파일 관리를 위하여 커스텀 데이터모델을 구현한다면, 파일이 변경된 것과, 사용자의 다른 기기에 변경된 점을 반영하기 위하여 file presenter와 file coordinator를 사용할 수 있습니다.
        - 설정 또는 자주 변경되지 않는 데이트를 공유하고 싶다면, NSUbiquitousKeyValueStore 객체를 사용할 수 있습니다. 이 객체는 문자열, 숫자, 날짜 등 간단한 데이터를 공유할 수 있게 해줍니다.

        iCloud를 지원하는 앱을 만들기 위한 더 많은 정보는 “iCloud Design Guide”를 읽어보세요




        후아~ 힘드네용+_+ !!!

        번역하느라 고생하신 낭만떡대님께 다시 한 번 진심으로 감사의 말씀 전합니다 :)

        by yagom

        facebook : http://fb.yagom.net

        twitter : http://twitter.yagom.net ( @yagomsoft )

        p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

        RSS Feed 받기   


        ↓↓↓저 열심히 썼는데 손가락 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 





        저작자 표시 비영리 변경 금지
        신고
        Posted by yagom

        오늘의 주제

        1. App Design Basics


        파헤치기 두 번째 입니다~^^

        처음 문서 파헤치기는 어땠나요?
        좀 허접..아니 많이 허접하고... 이거 왜 쓰나 싶기도 하죠?

        네... 뭐 ... 일단 해보고 보는겁니다 ㅎㅎ

        일단 칼을 들었으면 무라도 베어봐야죠?

        참...!! 

        공개 수배 합니다!

        함께 이 일을 해나가실 분이 있으면 좋겠습니다!!

        100% 완벽 번역과 해석을 요하는 것이 아닙니다.

        중요 포인트를 짚어서 반(?)번역 이라도 함께 해 주실 분을 찾습니다!

        아무래도 생각보다 시간이 많이 걸리네요...

        물론 원문 그대로 보는 것이 훨씬 좋겠지만, 그래도 우리나라 글로 풀어 쓴다면 조금이나마 장벽을 낮출 수 있지 않을까 싶습니다.

        저를 도와주실 의향이 있으시다면 주저마시고 이메일 yagomsoft@gmail.com 또는 덧글로 말씀해 주시면 고맙겠습니다.

        아니면 혼자 꿋꿋히 해보는 수밖에요...^^

        자, 그럼 이제 본론으로 들어가 볼까요????



        # App Design Basics


        앱 디자인 기초

        만약 당신이 iOS 앱 개발이 처음이라면 어디서부터 시작해야 할지 알고 싶을 것입니다. 앱을 만들이 위한 아이디어를 생각해 냈다면 앱으로 구현하기 위한 행동계획을 세워야 겠지요. 

        만약 iOS 앱 개발이 처음이라면 기본 개념에 친숙해지기 위한 시간이 필요합니다. 곧바로 코드작성을 시작하고 싶다면 몇몇 튜토리얼들이 있습니다만, 기본 패턴과 개념들을 위한 시간을 조금만 투자한다면 이것이 후에 엄청난 도움이 될 것입니다.

        * 제 생각과 똑같습니다...ㅎㅎㅎ

        # Doing Your Initial Design


        앱을 디자인 하는 방법은 여러가지가 있습니다. 그리고 코드를 작성하는 것은 대부분 좋은 접근방법이 아닙니다. 좋은 앱의 시작은 모든 기능을 상세히 설명해 놓은 것을 확장하는 것입니다. High-level의 기능들을 작성하는 것이 아이디어를 구현하는 것에 필요합니다. 사전 조사는 유저들을 당신의 목적에 얼마나 끌어들일 수 있는지 이해할 수 있게 합니다. 그리고 당신의 앱이 어떻게 생겼을지 눈에 보이도록 종이에 스케치 하십시오.

        내부 디자인의 궁극적인 목표는 당신의 앱에 대한 중요한 질문의 해답입니다. 기능들과 기초 스케치는 코드를 작성하기 시작할 때 어떤 것이 필요한지 생각할 수 있게 합니다. 

        물론 가장 중요한 것은 앱 내부 디자인을 하기 전에 iOS Human Interface Guidelines 를 읽어보는 것입니다. 이 문서는 내부 디자인을 할 때 사용할 수 있는 많은 전략들이 담겨있습니다. 또한 iOS 내부에서 앱이 잘 동작할 수 있도록 만드는 팁들이 담겨있습니다. 그리고 iOS Technology Overview를 읽으면 iOS의 능력과 이 능력을 사용하여 어떻게 목표를 이룰 수 있는지에 대해 이해할 수 있을 것입니다.

        * 뭐... 너무나 당연하고 좋은 이야기들이라서...^^; 실전 경험이 있는 분들은 충분히 와닿고... 때로는 뼈에 사무치는 말일지도 모르겠습니다..ㅎㅎ
        오역, 의역 그리고 빼놓은 부분도 종종 있습니다^^;

        # Learning the Fundamental iOS Design Patterns and Techniques


        핵심적인 iOS 디자인 패턴과 테크닉 배우기

        어떤 앱을 만들던지 코드를 작성하기 전에 필수로 알아야 하는 디자인 패턴과 테크닉이 있습니다. iOS에서 시스템 프레임워크는 중요한 기반을 제공하고 하드웨어에 접근할 수 있는 방법이 하나뿐인 경우도 있습니다. 다시말해서, 시스템 프레임워크는 많은 세부 디자인 패턴을 사용하며 당신은 그것과 친숙해 져야한다는 말입니다. 이 디자인 패턴을 이해하는 것은 당신의 앱을 만드는 데 있어서 첫 걸음입니다.

        당신이 꼭 알아야 할 중요한 디자인 패턴입니다.

        Model-View-Controller - 이 디자인 패턴이 앱의 모든 구조를 관리합니다.
        Delegation - 이 디자인 패턴은 객체간 정보나 자료를 전송하는데 용이합니다.
        Target-action - 이 디자인 패턴은 유저의 행동을 당신의 코드에 전달하는 역할을 합니다.
        Block objects - 비동기와 콜백 코드를 구현하기 위해 블럭을 사용할 수 있습니다.
        Sandboxing - 모든 iOS은 시스템과 다른 앱에 의해 보호받도록 sandbox에 위치해 있습니다. 샌드박스 구조는 앱의 동작에 관여한 파일의 위치에 영향을 줍니다.

        메모리 관리와 정확성은 iOS 앱에서 중요합니다. 앱은 데스크탑에 비하여 사용가능한 메모리가 적기 때문입니다. 앱은 메모리 효율을 관리하기 위하여 컴파일러의 ARC를 사용합니다. 비록 ARC가 필수는 아니지만 우리는 적극 추천하는 바입니다. ARC를 사용하지 않는다면 당신이 직접 메모리 관리를 해주어야 합니다.

        * 사견이 필요없네요...;

        # Translating Your Initial Design into an Action Plan


        당신 안의 디자인을 행동으로 옮기기
        iOS앱은 Model-View-Controller 디자인 패턴을 사용하는 것을 가정합니다. 

        * 데이터 모델에 기본 접근을 선택합니다.
          @ 이미 존재하는 데이터 모델 코드 - 만약 C언어를 기반으로 한 데이터 모델 코드를 가지고 있다면 iOS앱에 직접 적용할 수 있습니다.
          @ 커스텀 객체 데이터 모델 - 커스텀 객체는 간단한 데이터의 집합입니다.
          @ 구조적 데이터 모델 - 만약 데이터가 데이터베이스를 쓸 정도로 구조적이라면 코어 데이터 또는 SQLite를 사용하면 됩니다. SQLite는 iCloud에 적용될 수 없지만 코어 데이터는 가능합니다.

        * 도큐먼트를 지원할 것인지 결정하기
           도큐먼트는 유저에게 필요한 파일을 저장하는 공간으로 쓰입니다. 이 파일은 유저에 의하여 관리될 수도, 아닐 수도 있습니다. 도큐먼트를 사용하는 가장 큰 장점은 UIDocument 클래스가 iCloud와 상호작용할 수 있도록 하고 로컬 파일 시스템이 더욱 심플해 지는 것입니다. 코어데이터를 사용하여 컨텐츠를 저장하는 것과 유사한 UIManagedDocument라는 클래스가 제공됩니다.

        * 유저 인터페이스에 접근하는 방법 고르기
           @ 빌딩 블럭 접근 - 유저 인터페이스를 만드는 가장 쉬운 방법은 주어진 view 객체를 이용하는 방법입니다. view는 테이블, 버튼, 텍스트 필드 등과 같은 눈에 보이는 요소들을 나타냅니다. 뷰를 있는 그대로 사용할 수 있지만, 당신이 원하는 대로 하려면 커스터마이즈를 할 수도 있습니다. 뷰를 사용하는 장점은 더 적은 코드로 복잡한 인터페이스를 빠르게 작성할 수 있고 유저에게 익숙한 인터페이스를 제공한다는 것입니다.
           @ OpenGL ES기반 접근 - 세련된 렌더링이 필요하거나 잦은 화면 업데이트가 필요하다면 컨텐츠들을 OpenGL ES를 사용하여 표현하는 것이 필요할 것입니다. 최고의 퍼포먼스를 필요로 하거나, 세련된 그래픽 또는 게임에 주로 사용됩니다.

        * 사실 제가 써놓고도... 이게 무슨말인지;;; 영어를 우리말로 바꿔놓으니 영 어색하고 잘 맞지를 않네요 ㅠㅠ

        # Starting the App Creation Process


        앱 제작 시작하기

        행동 계획을 세웠따면 코딩을 시작할 때입니다. iOS 앱 제작이 처음이라면 Xcode 내장 템플릿을 살펴보는 시간을 갖는 것이 좋습니다. 이 템플릿들은 몇 분 안에 앱을 만들어 실행 할 수 있을 정도로 간략화 되어있습니다. 마지막으로, Xcode 프로젝트를 만들 때, 당신은 다음 질문들의 대답을 마음속에 가지고 있어야 합니다.

        * 기본 인터페이스 스타일은 무엇인가?
         - 다른 타입의 앱은 다른 타입의 뷰와 뷰 컨트롤러들이 필요합니다. 언제라도 인터페이스를 변경 할 수 있지만, 먼저 정하는 것이 프로젝트를 시작하기 쉽습니다.

        * iPhone 또는 iPad만을 위한 앱을 만들 것인가, 아니면 둘 다를 위한 앱을 만들 것인가?
         - Universal 앱을 만드는 것은 동적으로 iPhone과 iPad를 위한 뷰와 뷰 컨트롤러들을 선택하도록 지정해 주어야 합니다. 더 많은 기기를 지원할 수 있기 때문에 Universal 앱을 만드는 것이 더 선호되지만, 각각의 플랫폼에 맞도록 코드가 가공되어야 합니다. Universal 앱이 코드작성에 미치는 영향을 알고싶다면 Creating a Universal App을 보십시오.

        * 스토리보드를 사용할 것인가?
         - 스토리보드는 뷰와 그 동작을 한 번에 볼 수 있기 때문에 디자인 프로세스를 간략화 해줄 수 있습니다. 스토리보드는 iOS 5 이상에서 지원합니다. 그 미만의 버전에서 동작하게 하려면 nib 파일을 사용해야 합니다.

        * 데이터 모델을 위해 코어데이터를 사용 할 것인가?
         - 코어데이터를 사용하여 얻을 수 있는 이점을 알고싶다면 Core Data Programming Guide를 참고하세요.

        이 질문들을 통하여 코딩 시작을 위하여 Xcode를 사용합니다.

        1. Xcode가 설치되어 있지 않다면 설치하고, iOS development team을 구성하세요. Xcode 개발환경 세팅에 대하여 자세히 알고 싶다면 Developing for the App Store를 참고하세요.

        2. 첫 Xcode 프로젝트를 생성합니다.

        3. 코드를 작성하기 전에 새로운 프로젝트에서 빌드와 실행을 합니다. iOS 시뮬레이터를 타켓으로 한다면 실행되는 것을 볼 수 있을 것입니다.

        4. 앱 코드를 작성합니다.

        5. 앱 상태변화를 지원하기 위한 기능을 추가합니다.

        6. 필요한 리소스를 제작합니다.

        7. 필요하다면 앱과 관련된 적절한 동작을 구현합니다.

        8. 앱이 특별해지기 위한 발전된 기능을 추가합니다.

        9. 기본적인 퍼포먼스 튜닝을 합니다.

        10. 이것을 반복합니다.



        아... 정말 이 짧은거 하는데도 시간 정말 오래 걸리네요 ㅠ_ㅠ

        그냥 포스팅 몇개는 하겠네요...;;;;;;;;;

        으악... 힘들어요~

        이거 계속 할 수 있을런지 모르겠네요... 여러분의 도움이 절실히 필요합니다..
         
        오역 번역 발번역 항상 넘칩니다... 이점 참고하시구요, 부족한 부분이 있다면 덧글 주시면 보충해 드릴게요^^;

        그럼 전 이만~!


        by yagom

        facebook : http://fb.yagom.net

        twitter : http://twitter.yagom.net ( @yagomsoft )

        p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

        RSS Feed 받기   


        ↓↓↓저 열심히 썼는데 손가락 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 




        저작자 표시 비영리 변경 금지
        신고
        Posted by yagom

        오늘의 주제

        1. 계산기 기능 넣기
        2. 메모장 화면 구성 바꾸기



        쉰 한 번째 시간입니다.^^

        지난 번에 만들어 놓은 계산기 아직 잘 갖고 계신가요?ㅎㅎㅎ
        이제 계산기 로직을 완성해 볼 차례입니다.

        아............. 지금 제가 글을 쓰고 있는 이 시간은 아직 훈련소에 가기 전이지만, 전 지금 훈련소에서 뒹굴고 있겠군요 ㅋㅋㅋㅋㅋㅋㅋㅋ

        뭐, 응원의 한마디...는 볼 수 없겠지만 무탈히 돌아오도록 기도해주세요 ㅋㅋㅋㅋㅋ

        2일 전인데 한달이라도 막상 가려니까 싱숭생숭 하네요 ㅋㅋㅋ

        아마 들어가기 전까지도 계속 블로그 포스팅 예약을 하다 갈거 같은..ㅋㅋㅋㅋㅋㅋㅋㅋ

        뭐 여튼 사설은 각설하고 시작해 봅니다~~~~~~~~~~~~~


        # 계산기 기능 완성하기

        일단, 지난번에 구현파일에 만들어 주었던 enum을 헤더로 옮겨옵니다. 거기에 FUNC_INVALID도 추가해줬어요 ㅎ

        그리고 아래 interface에 enum 변수 하나를 만들어 주었구요~

        enum이 뭔지 잘 모르겠다 하시는 분들은
        2012/05/24 - [C] - C <20>. enum 

        을 참고해 주세요 ㅎㅎㅎ


        자, 이제 다시 구현파일로 넘어와서~

        일단, 변수 초기화를 따로 메소드로 빼주었습니다. 왜냐면 2번 이상은 사용할 것 같거든요 ㅎㅎㅎ C버튼 눌렀을 때랑, 처음 viewDidLoad되었을 때. 생각난김에 메소드로 빼주고 viewDidLoad에서 호출도 해 줍니다.


        자, 그리고 화면에 숫자를 출력해 줄만한 메소드도 하나 따로 빼줍니다 ㅎㅎㅎ


        자, 그리고 이제 계산을 해 줄 메소드를 하나 만들어 줍니다. 아마도 = 버튼을 눌렀을 때 요녀석이 실행이 되겠죠?ㅎㅎㅎ
        (현재 로직은 약간 틀린 부분이 있습니다만, 아래쪽에서 조금 수정을 해 줄거예요. 일단 요렇게 작성해 주세요..ㅎㅎㅎ)


        자, 그리고 숫자 버튼을 눌렀을 때 동작할 메소드를 채워넣어 줍니다.


        자, 그리고 기능키를 눌렀을 때 어떻게 동작할지를 버튼과 연결된 메소드에 채워넣어 줍니다 ㅎㅎ
        switch문이 아직도 헷갈리는 분들은
        2011/12/14 - [C] - C <7>. 조건문(2) switch 
        참고 해 주시면 좋을 것 같네요 ㅎㅎ 


        자, 그리고 나서 실행 해 봅니다. command + R
        어때요 ㅎㅎㅎ 잘 동작하나요?
        이것저것 해보다 보면 뭔가 약간 안맞는게 있습니다...ㅎㅎㅎ
        네......그렇죠 ㅎㅎㅎ
        2 + 3 하고 = 을 누르면 5가 나옵니다.
        그리고 또다시 = 을 누르면 8이 나와야 하는데 7이 나올거예요... 흐음... 로직에 문제가 있다!!!!!!!!!!!! (제가 새벽에 정신이 혼미한 상태로 하다보니...)ㅋㅋㅋㅋㅋㅋㅋㅋㅋ

        그래서 수정해 줬습니다.
        헤더파일에 와서 새로운 flag 변수를 하나 만들어 주었구요~


        구현파일에 와서 약간의 조건을 추가해 줍니다. 기존에 변수에 저장하던 값들도 살짝 바꿔줬구요.


        그리고 계산부분의 변수들도 살짝 바꿔줬습니다 ㅎㅎ



        자, 그리고 다시 실행!!!!!!

        어떠세요? 잘 동작하나요?

        제가 계산기를 잘 안써봐서 로직을 생각해 보려고 한참 쑈를 했었더랬죠... 계산기 한 번만 켜서 해보면 되는것을...ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

        여튼 뭐 이렇게 초간단 계산기가 완성되었습니다~!

        가로 모드로 바꾸면 공학용 계산기가 나오게도 해보고 싶었으나... 시간이 없는 관계로(낼모레 입소... 'ㅁ') 메모장으로 넘어가 볼게요 ㅋㅋㅋ



        # 메모장 화면구성 변경

        지난번에 메모장 화면도 조금 만들어 놨었는데요, 살짝만 바꾸도록 합니다 ㅎㅎ


        다들 그림만 보고 이해는 하셨으리라 믿습니다 ㅎㅎㅎ

        자, 이제 본격적으로 메모장 구현은?

        다음 포스팅에......ㅋㅋㅋ



        by yagom

        facebook : http://fb.yagom.net

        twitter : http://twitter.yagom.net ( @yagomsoft )

        p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

        RSS Feed 받기   


        ↓↓↓저 열심히 썼는데 손가락 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 






        저작자 표시 비영리 변경 금지
        신고
        Posted by yagom

        오늘의 주제

        1. 계산기 기능 넣기
        2. 메모장 화면 구성 바꾸기



        쉰 한 번째 시간입니다.^^

        지난 번에 만들어 놓은 계산기 아직 잘 갖고 계신가요?ㅎㅎㅎ
        이제 계산기 로직을 완성해 볼 차례입니다.

        아............. 지금 제가 글을 쓰고 있는 이 시간은 아직 훈련소에 가기 전이지만, 전 지금 훈련소에서 뒹굴고 있겠군요 ㅋㅋㅋㅋㅋㅋㅋㅋ

        뭐, 응원의 한마디...는 볼 수 없겠지만 무탈히 돌아오도록 기도해주세요 ㅋㅋㅋㅋㅋ

        2일 전인데 한달이라도 막상 가려니까 싱숭생숭 하네요 ㅋㅋㅋ

        아마 들어가기 전까지도 계속 블로그 포스팅 예약을 하다 갈거 같은..ㅋㅋㅋㅋㅋㅋㅋㅋ

        뭐 여튼 사설은 각설하고 시작해 봅니다~~~~~~~~~~~~~


        # 계산기 기능 완성하기

        일단, 지난번에 구현파일에 만들어 주었던 enum을 헤더로 옮겨옵니다. 거기에 FUNC_INVALID도 추가해줬어요 ㅎ

        그리고 아래 interface에 enum 변수 하나를 만들어 주었구요~

        enum이 뭔지 잘 모르겠다 하시는 분들은
        2012/05/24 - [C] - C <20>. enum 

        을 참고해 주세요 ㅎㅎㅎ


        자, 이제 다시 구현파일로 넘어와서~

        일단, 변수 초기화를 따로 메소드로 빼주었습니다. 왜냐면 2번 이상은 사용할 것 같거든요 ㅎㅎㅎ C버튼 눌렀을 때랑, 처음 viewDidLoad되었을 때. 생각난김에 메소드로 빼주고 viewDidLoad에서 호출도 해 줍니다.


        자, 그리고 화면에 숫자를 출력해 줄만한 메소드도 하나 따로 빼줍니다 ㅎㅎㅎ


        자, 그리고 이제 계산을 해 줄 메소드를 하나 만들어 줍니다. 아마도 = 버튼을 눌렀을 때 요녀석이 실행이 되겠죠?ㅎㅎㅎ
        (현재 로직은 약간 틀린 부분이 있습니다만, 아래쪽에서 조금 수정을 해 줄거예요. 일단 요렇게 작성해 주세요..ㅎㅎㅎ)


        자, 그리고 숫자 버튼을 눌렀을 때 동작할 메소드를 채워넣어 줍니다.


        자, 그리고 기능키를 눌렀을 때 어떻게 동작할지를 버튼과 연결된 메소드에 채워넣어 줍니다 ㅎㅎ
        switch문이 아직도 헷갈리는 분들은
        2011/12/14 - [C] - C <7>. 조건문(2) switch 
        참고 해 주시면 좋을 것 같네요 ㅎㅎ 


        자, 그리고 나서 실행 해 봅니다. command + R
        어때요 ㅎㅎㅎ 잘 동작하나요?
        이것저것 해보다 보면 뭔가 약간 안맞는게 있습니다...ㅎㅎㅎ
        네......그렇죠 ㅎㅎㅎ
        2 + 3 하고 = 을 누르면 5가 나옵니다.
        그리고 또다시 = 을 누르면 8이 나와야 하는데 7이 나올거예요... 흐음... 로직에 문제가 있다!!!!!!!!!!!! (제가 새벽에 정신이 혼미한 상태로 하다보니...)ㅋㅋㅋㅋㅋㅋㅋㅋㅋ

        그래서 수정해 줬습니다.
        헤더파일에 와서 새로운 flag 변수를 하나 만들어 주었구요~


        구현파일에 와서 약간의 조건을 추가해 줍니다. 기존에 변수에 저장하던 값들도 살짝 바꿔줬구요.


        그리고 계산부분의 변수들도 살짝 바꿔줬습니다 ㅎㅎ



        자, 그리고 다시 실행!!!!!!

        어떠세요? 잘 동작하나요?

        제가 계산기를 잘 안써봐서 로직을 생각해 보려고 한참 쑈를 했었더랬죠... 계산기 한 번만 켜서 해보면 되는것을...ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

        여튼 뭐 이렇게 초간단 계산기가 완성되었습니다~!

        가로 모드로 바꾸면 공학용 계산기가 나오게도 해보고 싶었으나... 시간이 없는 관계로(낼모레 입소... 'ㅁ') 메모장으로 넘어가 볼게요 ㅋㅋㅋ



        # 메모장 화면구성 변경

        지난번에 메모장 화면도 조금 만들어 놨었는데요, 살짝만 바꾸도록 합니다 ㅎㅎ


        다들 그림만 보고 이해는 하셨으리라 믿습니다 ㅎㅎㅎ

        자, 이제 본격적으로 메모장 구현은?

        다음 포스팅에......ㅋㅋㅋ



        by yagom

        facebook : http://fb.yagom.net

        twitter : http://twitter.yagom.net ( @yagomsoft )

        p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

        RSS Feed 받기   


        ↓↓↓저 열심히 썼는데 손가락 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 






        저작자 표시 비영리 변경 금지
        신고
        Posted by yagom

        오늘의 주제

        1. 계산기 기능 넣기
        2. 메모장 화면 구성 바꾸기



        쉰 한 번째 시간입니다.^^

        지난 번에 만들어 놓은 계산기 아직 잘 갖고 계신가요?ㅎㅎㅎ
        이제 계산기 로직을 완성해 볼 차례입니다.

        아............. 지금 제가 글을 쓰고 있는 이 시간은 아직 훈련소에 가기 전이지만, 전 지금 훈련소에서 뒹굴고 있겠군요 ㅋㅋㅋㅋㅋㅋㅋㅋ

        뭐, 응원의 한마디...는 볼 수 없겠지만 무탈히 돌아오도록 기도해주세요 ㅋㅋㅋㅋㅋ

        2일 전인데 한달이라도 막상 가려니까 싱숭생숭 하네요 ㅋㅋㅋ

        아마 들어가기 전까지도 계속 블로그 포스팅 예약을 하다 갈거 같은..ㅋㅋㅋㅋㅋㅋㅋㅋ

        뭐 여튼 사설은 각설하고 시작해 봅니다~~~~~~~~~~~~~


        # 계산기 기능 완성하기

        일단, 지난번에 구현파일에 만들어 주었던 enum을 헤더로 옮겨옵니다. 거기에 FUNC_INVALID도 추가해줬어요 ㅎ

        그리고 아래 interface에 enum 변수 하나를 만들어 주었구요~

        enum이 뭔지 잘 모르겠다 하시는 분들은
        2012/05/24 - [C] - C <20>. enum 

        을 참고해 주세요 ㅎㅎㅎ


        자, 이제 다시 구현파일로 넘어와서~

        일단, 변수 초기화를 따로 메소드로 빼주었습니다. 왜냐면 2번 이상은 사용할 것 같거든요 ㅎㅎㅎ C버튼 눌렀을 때랑, 처음 viewDidLoad되었을 때. 생각난김에 메소드로 빼주고 viewDidLoad에서 호출도 해 줍니다.


        자, 그리고 화면에 숫자를 출력해 줄만한 메소드도 하나 따로 빼줍니다 ㅎㅎㅎ


        자, 그리고 이제 계산을 해 줄 메소드를 하나 만들어 줍니다. 아마도 = 버튼을 눌렀을 때 요녀석이 실행이 되겠죠?ㅎㅎㅎ
        (현재 로직은 약간 틀린 부분이 있습니다만, 아래쪽에서 조금 수정을 해 줄거예요. 일단 요렇게 작성해 주세요..ㅎㅎㅎ)


        자, 그리고 숫자 버튼을 눌렀을 때 동작할 메소드를 채워넣어 줍니다.


        자, 그리고 기능키를 눌렀을 때 어떻게 동작할지를 버튼과 연결된 메소드에 채워넣어 줍니다 ㅎㅎ
        switch문이 아직도 헷갈리는 분들은
        2011/12/14 - [C] - C <7>. 조건문(2) switch 
        참고 해 주시면 좋을 것 같네요 ㅎㅎ 


        자, 그리고 나서 실행 해 봅니다. command + R
        어때요 ㅎㅎㅎ 잘 동작하나요?
        이것저것 해보다 보면 뭔가 약간 안맞는게 있습니다...ㅎㅎㅎ
        네......그렇죠 ㅎㅎㅎ
        2 + 3 하고 = 을 누르면 5가 나옵니다.
        그리고 또다시 = 을 누르면 8이 나와야 하는데 7이 나올거예요... 흐음... 로직에 문제가 있다!!!!!!!!!!!! (제가 새벽에 정신이 혼미한 상태로 하다보니...)ㅋㅋㅋㅋㅋㅋㅋㅋㅋ

        그래서 수정해 줬습니다.
        헤더파일에 와서 새로운 flag 변수를 하나 만들어 주었구요~


        구현파일에 와서 약간의 조건을 추가해 줍니다. 기존에 변수에 저장하던 값들도 살짝 바꿔줬구요.


        그리고 계산부분의 변수들도 살짝 바꿔줬습니다 ㅎㅎ



        자, 그리고 다시 실행!!!!!!

        어떠세요? 잘 동작하나요?

        제가 계산기를 잘 안써봐서 로직을 생각해 보려고 한참 쑈를 했었더랬죠... 계산기 한 번만 켜서 해보면 되는것을...ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

        여튼 뭐 이렇게 초간단 계산기가 완성되었습니다~!

        가로 모드로 바꾸면 공학용 계산기가 나오게도 해보고 싶었으나... 시간이 없는 관계로(낼모레 입소... 'ㅁ') 메모장으로 넘어가 볼게요 ㅋㅋㅋ



        # 메모장 화면구성 변경

        지난번에 메모장 화면도 조금 만들어 놨었는데요, 살짝만 바꾸도록 합니다 ㅎㅎ


        다들 그림만 보고 이해는 하셨으리라 믿습니다 ㅎㅎㅎ

        자, 이제 본격적으로 메모장 구현은?

        다음 포스팅에......ㅋㅋㅋ



        by yagom

        facebook : http://fb.yagom.net

        twitter : http://twitter.yagom.net ( @yagomsoft )

        p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

        RSS Feed 받기   


        ↓↓↓저 열심히 썼는데 손가락 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 






        저작자 표시 비영리 변경 금지
        신고
        Posted by yagom


        오늘의 Tip

        1. 스토리보드가 xml로 나올 때 스토리보드 화면으로 나오도록 열기


        # 스토리보드야 나와줘!!!

        으히히, 가끔 스토리보드 기반으로 작업하다보면 xCode가 멍때리는지 스토리보드가 아닌 xml문서로 열리는 경우가 가끔 생깁니다.
        아래 화면처럼요.


        자, 그럼 스토리보드로 열어 봅시다.
        이렇게요 ㅎㅎ .storyboard파일에서 우클릭 또는 ctrl 클릭 하면 팝업메뉴가 나오죠. 거기서 Open As - Interface Builder를 선택해 줍니다.



        짜잔~~~~~~~~~~~~~~~~~



        초간단 팁 끝~~~~~~~~~

        by yagom

        facebook : http://fb.yagom.net

        twitter : http://twitter.yagom.net ( @yagomsoft )

        p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

        RSS Feed 받기   


        ↓↓↓저 열심히 썼는데 손가락 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 


        저작자 표시 비영리 변경 금지
        신고
        Posted by yagom

        오늘의 주제

        1. 실전 프로젝트 생성



        벌써 쉰 번째 시간입니다.^^

        많이도 써왔나 보네요...ㅎㅎ
        벌써 오십번 째 글이라니 +_+

        이거 한 편 쓰는데 시간이 얼마나 오래걸리는지 여러분들을 모르실거예요..ㅋㅋㅋㅋㅋㅋㅋ

        이제 실전 프로젝트(?) 라고 하기는 좀 그렇지만 예제 앱을 하나 만들어 볼까해요.
        물론 저는 디자인을 하지 못하기 때문에 그냥 있는 그대로의 녀석들을 쓰겠지만 말예요..ㅎㅎ

        간단한 계산기랑 메모장(?) 정도를 만들어 볼까해요.
        단순히 감을 익히는데에는 큰 무리가 없을 것이라고 봅니다.

        스토리보드를 원하는 분들이 많이 계셔서, 간단한 앱이기도 하니까 스토리보드와 ARC를 사용하여 진행하도록 하겠습니다.

        iOS5.1 Xcode 4.3.3 기준입니다.

        오늘의 간단 결과물입니다.
        미리보기 +_+ㅋㅋㅋ


        한 번 출발해 봅니다 ㅎㅎ

        # 프로젝트 생성

        우리는 두 개의 탭을 가진 탭바 기반 어플리케이션을 만들거예요.


        스토리보드와 ARC사용에 체크를 했구요~



        # 화면구성하기

        짜잔~ 제 포스팅에서 처음으로 스토리보드가 등장을 했군요..ㅎㅎㅎ
        저는 좀 구식이라 스토리보드는 저도 아직 잘 사용할 줄 모릅니다 ㅎㅎ 
        눈에 보여서 편하긴 한데, 그만큼 뭔가 댓가가 있겠죠?ㅎㅎ 여튼 잡소리는 그만하고, 계속 가 봅니다 ㅋㅋㅋㅋㅋㅋ 


        자, 일단 First View는 계산기로 사용하려고 해요.

        뷰 속성에 들어가서 배경색을 그럴싸하게 좀 바꿔주고~ (그래봐야... 뭐... 쩝..ㅋㅋㅋㅋㅋㅋㅋ 그래도 기본만으로 뭔가 할 수 있게 해준 애플의 디자인 센스는 좋습니다ㅋㅋ)


        First View라고 써있던 라벨의 위치와 크기를 적절히 조절해주고 오른쪽 정렬~ 그리고 0으로 세팅해줍니다 ㅎ


        자, 그리고 뭔가 계산기처럼 그럴싸하게 버튼들을 넣어주세요 ㅋㅋㅋ


        그리고 어시스턴스 모드로 전환해서 아울렛 연결하는 방법 다들 아시죠?ㅎㅎㅎ
        오른쪽 버튼 드래그 또는 컨트롤 키 누르면서 드래그!!
        라벨의 property 생성해 줍니다~
        요게 잘 이해가 안되신다면?
        2012/04/03 - [iOS Dev/깨알 Tips] - Xcode4 xib의 객체 소스파일과 쉽게 연결하기

        를 참고하시면 되겠습니다 ㅎㅎ


        그리고 두번째 탭에 있던 뷰도 텍스트뷰 하나 올려주시고, 버튼 두개 올려서 아울렛이랑 액션 연결 해 주세용~ 


        자. 이거 좀 헷갈리실 수 있는데, 0부터 9까지 한 메소드에 연결을 할 거예요.
        0에서 액션을 하나 생성해 주시고, 1~9까지 같은 메소드 자리로 연결하시면 됩니다. 자세한 설명은 그림에~! 
        점(.)을 포함한 기능키들은 아래에서 또 따로 해줄거예요~ 



        자, 기능키들도 하나의 액션 메소드에 연결해 줍니다. 방법은 동일해요~


        자, 그리고 버튼마다 태그를 지정해 줍니다.
        0번 버튼은 0
        1번 버튼은 1...
        9번까지 태그를 지정해 줍니다. 



        그리고 기능버튼들도 마찬가지 입니다.

         
        + : 100, - : 101, * : 102, / : 103, C : 104, = : 105, . : 106


        자, 이렇게 106번까지요 ㅎ


        자, 이렇게 화면구성은 대강 마무리 된 것 같군요~

        그럼 계산기로 사용될 FirstViewController에 와서 코딩을 좀 해봅시다 ㅎㅎ
        일단 사용하여야 할 변수들을 선언해 주시구요.
        추후에 수정하였는데 CGFloat이 아니라 double로 선언해주세요!!! 꼭이요!!!



        아까 태그달았던 버튼들 나중에 번호 헷갈릴게 분명합니다.
        벌써부터 헷갈리는데요?ㅎㅎ
        enum을 사용하여 우리가 알아보기 쉽게 만들어 줍시다.

        내려와서...
        변수 초기화 잊지 말아주시구요 :)
        숫자 버튼을 눌렀을 때 동작하는 메소드 부분을 구현해 봅시다.
        자세한 설명은 역시나 주석에 ^^*

        추가적으로 설명하지 않은 것은 pow라는 녀석인데,
        pow( x, y )라고 해주면 x의 y제곱을 구해주는 함수입니다. ㅎ

        그리고 또! %.0lf,  %lf 등이 무슨말인지 잘 모르겠다 하시는 분들은 아래 포스팅을 참고하세요ㅎㅎ
         
        2011/12/05 - [Objective-C] - Objective C <4>. 실수 표현 방법
        2011/12/03 - [Objective-C] - Objective C <3>. 변수. Variable



        자... 여기까지 작성하고 한 번 실행해 보세요~

        화면에 숫자가 제대로 표시되나요?ㅎㅎ

        아 물론 소수점이 찍히는 기능키는 코딩하지 않았기 때문에 동작을 하지 않지요 ^^ 

        자, 오늘은 여기까지 해볼게요...ㅎㅎㅎ

        신나지 않나요?

        물론 전 지금 훈련소에서 뒹굴고 있겠죠...ㅋㅋㅋ

        어차피 포스팅은 예약 되어 있으니까 다음에 또 뵙도록 해용 >_<



        by yagom

        facebook : http://fb.yagom.net

        twitter : http://twitter.yagom.net ( @yagomsoft )

        p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

        RSS Feed 받기   


        ↓↓↓저 열심히 썼는데 손가락 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 




        저작자 표시 비영리 변경 금지
        신고
        Posted by yagom

        오늘의 주제

        1. 예외처리

        마흔 아홉번째 시간입니다.^^

        싱글턴 패턴에 대해서는 조금 익히셨나요?
        그 외에도 디자인 패턴이란 것은 많이 존재합니다. 싱글턴 패턴은 아주 간단한 예에 지나지 않습니다.
        디자인 패턴에 관심이 생기신다구요?
        그렇다면 이제 아주 기초는 벗어나고 있다~ 라고 생각하시면 되겠습니다..ㅎㅎㅎ
        물론 제가 말씀드리지 않은 것들은 정말 많지만, 저의 목표는 레퍼런스들을 나열하여 언제든 가져다 쓸 수 있는 것보다는 여러분들이 직접 원리를 알고, 개발문서를 통해 스스로 뭔가를 만들어 낼 수 있는 그런 포스팅이 되길 바라기 때문에 굳이 레퍼런스들을 다 나열하진 않았습니다.

        많은 도움이 되셨는지 모르겠습니다. :)

        이 기초 포스팅도 이제 막바지를 향해 달려가고 있습니다.
        정말 몇 개 쓴거 같지도 않은데 이제 두어달만 있으면 일년이 되네요^^;
        그동안 부족한 포스팅에 덧글도 응원도 많이 해 주신 여러분들께 진심으로 감사의 마음을 표합니다.

        사설은 여기까지 하도록 하구요,

        지난 포스팅에 이어 이번에도 iOS에 국한된 이야기라기 보다는 Objective-C 언어에서의 이야기를 해보려 합니다.
        싱글턴도, 예외처리도 코코아 터치 프레임워크를 사용하는 것이라기 보다는 언어를 사용하는 테크닉 중 하나라고 볼 수 있겠지요.

        오늘 포스팅은 정말 짧지만 정말 강력한 하나가 될 것이라 믿어 의심치 않습니다 ㅎㅎ

        어쨌거나 저쨌거나 출발합니다~~~~~~~~~~


        # @try @catch @finally

        예외처리가 뭔가요???

        여러분 여기까지 오면서 누구나 한 번 쯤은 Memory  Access Violation, Exception Error... 등등, 어플리케이션이 튕겨버리는 일을 겪지 않으신 분 없을겁니다.

        즉, 어플리케이션이 죽어버리는... 만약 사용자가 사용하다가, 내가 사용하다가 퍽하고 강제종료 되어버리는... 이런 참사를 예방하려면 예외처리에 많은 심혈을 기울여야 하겠습니다. ㅎㅎㅎ

        즉, 잘못된 처리로 인해 튕겨버릴 상황이 와도 한 번은 내가 컨트롤 해 볼 수 있는 여지를 만드는 것이 예외처리 입니다.

        말로만 해서 잘 감이 안오시죠?

        한 번 해봅시당 ㅎㅎ

        지난 번에 사용하던 프로젝트에 그대로 적용해 보겠습니다.

        싱글톤 객체에서 파일을 저장하던 메소드에 임의로 exception 에러를 발생시켜 봅니다.

        NSDictionary는 Mutable이 아니기 때문에 setObject 메소드를 사용할 수 없지요. 그런데 임의로 Mutable인 것처럼 가장하여 메소드를 호출 해 봅니다.

        말도 안되는 코드이긴 하지만, 실제로 종종 일어날 수 있는 일이기도 합니다. 이제 추가적으로 남은 것은 주석으로 모두 설명이 되어있습니다 ㅎㅎ

        결과까지 한 화면에 나와있지요?



        자, 이렇게 혹시 모를 상황에 대비하여 예외처리를 잘 사용해 주는것이 중요합니다.

        이 하나의 포스팅으로 여러분의 어플리케이션이 조금 더 안정적이 되기를 희망합니다~

        그럼 이만 뿅 ㅎㅎ



        by yagom

        facebook : http://fb.yagom.net

        twitter : http://twitter.yagom.net ( @yagomsoft )

        p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

        RSS Feed 받기   


        ↓↓↓저 열심히 썼는데 손가락 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 




        저작자 표시 비영리 변경 금지
        신고
        Posted by yagom

        오늘의 주제

        1. Singleton 패턴 사용해 보기


        마흔 여덟 번째 시간입니다.^^

        지난 번에 이어서 싱글턴 패턴 사용 방법에 대해 알아보도록해요 ㅎ

        일단... 뭐... ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
        지금 여러분들이 이 포스팅을 보고계신 시간이면 저는 논산 훈련소에 있겠네요~ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
        아이 좋아.............는 개뿔......
        면회 환영합니다..............는 개뿔.........ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

        여튼 오늘부터는 한달동안 제가 덧글을 달아드릴 수 없게되었군요...ㅠ_ㅠ

        몸 건강히 돌아오겠습니다.ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

        한 달 캠프 으쌰~

        자 잡소리 때려치고~

        스따뚜~~~~~~~~~~~~


        # 싱글톤 객체 활용

        이제 싱글톤 객체를 사용하기 위해, 헤더를 import해 옵니다.

        그리고 원래 있던 메소드는 깔쌈히 지워주시고 싱글톤 객체 안에 구현해놓은 녀석들을 사용하기 위해 예쁘게 작성합니다 호호호


        불러오기도 마찬가지로 예쁘게 바꿔줍니다~


        자, 그리고 파일로 읽고 쓰는 것 대신 싱글톤 객체에만 세팅하고 가져오는 기능도 따로 만들어주기 위하여 이렇게 또 버튼을 만들고 메소드를 만들어 줍니다~


        자 이렇게 간단히 메소드 구현을 마쳐주시구요~~~~~~~



        SecondViewController로 넘어와 봅니다~ 여기도 위와 똑같이 작성해 주시면 됩니당 ㅎㅎ



        그리고 생각해보니 화면전환 기능을 안 넣어줬군요.....

        훈련소의 압박으로 정신머리가 좀 나갔습니다ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

        ViewController로 와서 화면전환을 위한 버튼을 만들어주고 연결 해 줍니다~ 



        자, 그리고 이렇게 깔쌈하게 두줄로 완성~


        그리고 다시 돌아올 방법도 만들어줘야겠죠?ㅋㅋㅋ
        이렇게 연결해 줍니다. 


        그리고 이렇게 한줄로 구현 끝~!


        자, 실행 해 봅니다~
        뭔가 되나용?ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ


        어!? 그런데..... 아오....... 이놈의 키보드때문에 뭐가 안되는구만요...ㅠㅠㅠ


        키보드놈을 없애봅시다~!

        각각버튼을 누르고 나면 키보드를 사라지게 하는 마술을 심어줍니다 ㅎㅎㅎ 


        그러고나서 이리저리 왔다갔다 하면서 어떻게 동작을 하는지 확인해 보세요~ 예상했던 것과 같은 동작들을 하는가 잘 살펴보세요 ㅎㅎㅎ



        자... 이처럼 싱글턴 객체는 한 번 생성되면 메모리에 계속 상주하면서 데이터를 지니고 있게 됩니다.

        어떤 곳에서도 그 한 객체를 불러내서 쓸 수 있는거죠~

        재미있는녀석이죠?ㅎ 

         
        잘 활용하면 득이되고, 잘못 활용하면 독이되는 녀석이기도 합니다.

        뭐..... 제가 매번 이런말을 하는 것 같긴 하네요 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

        자, 그럼 이만 뿅~!


        by yagom

        facebook : http://fb.yagom.net

        twitter : http://twitter.yagom.net ( @yagomsoft )

        p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

        RSS Feed 받기   


        ↓↓↓저 열심히 썼는데 손가락 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 




        저작자 표시 비영리 변경 금지
        신고
        Posted by yagom


        티스토리 툴바