63
iCloud 튜토리얼 스마트앱 개발자 포럼 2013. 6 창원대학교 박동규

iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

Embed Size (px)

DESCRIPTION

iCloud는 iOS 또는 Mac장비들 간의 자료를 동기화시키는 애플사의 서비스로 iCloud는 사용자의 문서나 그림등을 저장하는 중심서버의 집합을 일컫는 용어로 사용되기도 합니다. 이 튜토리얼에서는 iCloud의 개념과 개발상의 문제점을 알아보며 간단한 소스코드를 통하여 실제 활용하는 기법을 익혀봅니다.

Citation preview

Page 1: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

iCloud 튜토리얼

스마트앱 개발자 포럼 2013. 6

창원대학교 박동규

Page 2: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

iCloud

• iOS 또는 Mac장비들 간의 자료를 동기화시키는 애플사의 서비스

• iCloud는 사용자의 문서나 그림등을 저장하는 중심서버의 집합

• No matter where you go, there you are

• 문서를 읽고, 쓰고, 수정하기 위해 클라우드 서버와 상호작용하는 간단한 어플리케이션

• 출처 : Raywenderlich.com, Apple WWDC 자료등

Page 3: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

Apple iCloud 논쟁

• http://liveandventure.com/2012/11/22/icloud/

• 내가 iCloud를 안쓰는 이유

• http://alphawolf.tistory.com/306

• 내가 iCloud를 쓰는 이유

Page 4: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

Apple iCloud 논쟁

Page 5: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

Apple iCloud 논쟁• 핵심은 애플의 강점인 UI/UX 부분이 네트워크 서비스쪽에서도 발휘될 수 있을 것인가?

• 애플기기들에서만 동작하는 iCloud 서비스가 PC 이용자층을 공략할 수 있을것인가?

• gmail, 에버노트, Dropbox, 구글 드라이버 서비스등 경쟁 서비스와 어떤 장점을 발휘할 것인가?

Page 6: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

iCloud 구현상의 문제• 불일치 해결

• iCloud의 문서 A를 iPad에서 수정하고 동시에 Mac에서 다른 페이지를 수정했다.

• 이를 다른 iPad에서 열면 어떤 버젼의 문서 A을 읽어야 하는가?

• 백그라운드 관리

• 동기화 기능을 항상 백그라운드로 실행시켜야 한다

Page 7: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

iCloud 구현상의 문제• 네트워크 문제

• 계속 전송되는 방대한 문서는 문제를 발생시킬 수 있다

• 문서를 덩어리로 쪼개는 방식으르 문제를 해결함

• P2P 솔루션 방식으로 동작, 디바이스간 직접이동도 가능함

Page 8: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

iCloud

Page 9: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

자료 공유의 필요성

Page 10: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

iCloud Storage• 앱을 위한 iCloud 샌드박스를 제공함

• 샌드박스에 저장된 자료와 파일을 업로드 할 수 있음

• key-value 데이터방식으로 업로드 가능함

• 실시간방식은 아니지만 지속적으로 작동함

• 백그라운드 관리를 통해 문서가 최신상태가 되도록 함.

• 네트워크 비용 감소

• 문서를 덩어리로 쪼개고(chunk) 변경이 감지되면 변경된 부분만을 클라우드로 업로드(네트워크비용 최소화)

Page 11: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

iCloud Storage

• 디바이스 사이에 자료를 이동시킴

• 파일의 변화를 알려줌(notify)

• 충돌이 발생할 경우 자동으로 해결

Page 12: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

How does it work?

Page 13: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

How does it work?

Page 14: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

iCloud 메타데이터• 메타데이터는 iCloud로 push(디바이스->클라우드 저장소)됨

• iCloud는 새 파일을 pull함

• 디바이스는 필요할 경우 파일을 pull(클라우드->디바이스)시킴

• OS는 데이터를 아토믹 단위로 pull할 수 있음

• 앱은 아직 로컬저장소에 있지 않은 파일을 알 수 있음

• 파일이 있으나 데이터가 도착하지 않았을 경우

Page 15: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

iCloud 인프라

• New Maiden, NC data center

• 5억불의 투자

• iCloud를 통한 데이터 접근

Apple data center

Page 16: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

Beginning iCloud

• 간단한 문서 공유 프로그램

• 아이클라우드를 사용하기 위해서는 개발자 계정이 필요함

• 게임센터와는 달리 개발자 포털에서 직접 활성화시켜야 함

• 게임센터는 itunesconnect에서 활성화가 가능함

• 시뮬레이터에서 테스트할 수 없음

• 장비에서도 iCloud 활성화, 도큐먼트 켜기 실행후 테스트

Page 17: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

iCloud 앱 아이디 생성• iOS Provisioning Portal -> Certificates,

Identifiers & Profiles -> identifiers -> App ID

Page 18: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

앱 아이디 설정

앱 아이디 설정에서 iCloud를 활성화시킨다

Page 19: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

앱 아이디

• com.apple.myAppID 와 같은 방식으로 앱을 다른 앱과 구별하는 식별자

• 앱마다 유니크해야 함

• 다른 앱이 동일한 앱 아이디를 사용하면 안됨

Page 20: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

앱 프로파일 생성• Provisioning Profiles -> Development ->

Add

개발자용 Provisioning Profile을 생성한다

Page 21: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

프로파일 저장

Page 22: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

Xcode Project for iCloud

Bundle ID가 App ID 생성시 만든 식별자와 일치 해야함

Page 23: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

프로젝트 설정

Page 24: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

프로젝트 설정• Entitlements file

• info.plist 파일과 같은 property 목록 정보

• entitlement는 iCloud 데이터 저장소 사용을 가능하게 한다.

• 보안허가에 관한 내용 참조

• iCloud Key-Value Store

• iCloud 내의 key-value 저장값을 가리키는 유일한 식별자

Page 25: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

Entitlement• iCloud entitlements let you enable the use of iCloud data storage for

your iOS or OS X app.You set iCloud entitlement values on a target-by-target basis in your Xcode project.

• Push notifications let your app alert the user even when your iOS or OS X app is not executing.You set push notification entitlement values as part of configuring your development and distribution provisioning profiles.

• App Sandbox entitlements let you enable the security feature called sandboxing for your OS X app. (In iOS, all apps are sandboxed automatically, so these sandboxing entitlements do not apply.)By carefully enabling only the resource access that you need, you minimize the potential for damage if malicious code successfully exploits your app. You set App Sandbox entitlement values on a target-by-target basis in your Xcode project.

Page 26: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

프로젝트 설정• iCloud Containers

• 클라우드에서 어플리케이션을 읽고 쓸 수 있는 디렉토리

• 다른 어플리케이션에 의해 관리될 수 있는 사용자 컨테이너

• Keychain Access Group

• 키체인 데이터를 공유하는 어플리케이션에서 필요한 키들

Page 27: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

아이클라우드 활성화• 사용자가 iCloud를 활성화시켰는가 검사하는 모듈

• AppDelegate.m의 - (BOOL)application: didFinishLaunchingWithOptions: 메소드 수정

Page 28: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

프로젝트 설정• URLForUbiquityContainerIdentifier

• iCloud에 접근하기 위한 식별자가 필요하다

• nil 파라메터는 프로젝트 설정의 첫 번째 컨테이너가 반환된다(현재 하나 뿐임)

• 실제 기기에서 테스트 할것

• 성공할 경우 다음과 같은 메시지가 나타남(아이클라우드용 저장소)

• iCloud access at file://localhost/private/var/mobile/Library/Mobile%20Documents/8SUWC89YUK~com~profpark~iCloudTest/

Page 29: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

테스트

Page 30: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

Lab 1

• iCloud 앱을 위한 프로비저닝 프로파일을 만들고 single view application을 만들어서 iCloud 기능을 테스트한다

• 시뮬레이터에서는 안됨, 디바이스에서 테스트

• 소스 : 페북 그룹

Page 31: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

Lab 2

• iCloud를 이용한 간단한 문서관리 프로그램

• Raywenderich 블로그의 튜토리얼 자료

Page 32: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

iCloud API

• UIDocument

• iCloud 문서작업을 위한 클래스

• NSFileManager, NSFilePresenter등의 복잡한 파일처리 클래스의 역할을 대체함

• 자기자신과 실제 데이터사이의 미들웨어로 동작함

• 문서 콘텐츠를 포장(wrapping)하는 기능을 통해 iCloud와 연결

Page 33: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

iCloud API• UIDocument

• 다큐먼트의 데이터를 관리하기 위한 추상 베이스 클래스

• 백그라운드 큐에 비동기 방식으로 데이터를 읽고 쓸 수 있음

• 읽기, 쓰기 연산이 이루어지는 동안에도 어플리케이션은 멈추거나 버벅거리지 않음

• 클라우드 서비스와 결합되어 자동으로 문서를 읽고 쓰는 작업을 코디네이트함

• 데이터의 안전한 저장을 보장

Page 34: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

iCloud API

• UIDocument

• M-V-C 디자인 패턴 모델에서 UIDocument 객체는 모델 객체 또는 모델-컨트롤러 객체에 해당함

• 도큐먼트 기반 어플리케이션은 반드시 그 도큐먼트를 위해서는 UIDocument를 서브클래스하여야 한다.

• UIDocument 아키텍쳐내의 주요속성으로 파일 URL이 있다.

Page 35: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

iCloud API• iCloud에 저장된 문서 열기

• 백그라운드 큐에 read 메시지를 유발하게 됨

• 그 시간동안 앱은 블러킹되지 않기 때문에 UI와 같은 작업을 수행할 수 있다

• 파일 읽기가 끝나면 읽기 동작에 의해 반환된 데이터는 자유롭게 로딩할 수 있다.

• loadFromContents:ofType:error:메소드를 오버라이딩하는 방법이 있다.

Page 36: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

UIDocuments

• 노트앱을 위한 코드

Page 37: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

UIDocuments• 파일을 오픈하면 두 개의 콜백을 받는다

• 데이터 읽기가 끝났을때 UIDocument 서브 클래스 안에서 받는다

• 열기 동작이 완전히 끝났을 때 받는다

• 쓰기동작도 비슷한데 이중 큐를 이용함

• 파일을 열때 NSData 인스턴스를 파싱해야 함

• 파일을 쓸 경우 다큐먼트 데이터를 NSData 형식으로 변한시켜야 함(백그라운드 큐를 이용)

Page 38: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

도큐먼트 저장하기• UIDocument에 있는 수동저장, 자동저장 메소드

• 수동으로 저장할 때 사용하는 메소드

• completion 핸들러가 저장이 완료된 후에 호출된다

Page 39: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

UIDocument 서브클래싱

• Note라는 UIDocument 하위 클래스를 통해 노트 어플을 만들어보자

• loadFromContents: ofType: error: 와contentsForType: error: 메소드를 만들자

• 이 메소드는 애플리케이션이 파일 시스템으로부터 데이터를 읽으려 할 경우 호출됨

Page 40: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

UIDocument subclassing

Page 41: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

iCloud File 열기• AppDelegate수정

Page 42: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

loadDocument• Query 객체를 통해 메타데이터 추출

• 메타데이터의 스코프는NSMetadataQueryUbiquitousDocumentsScope

• NSPredicate

• 페치 또는 메모리상의 필터링을 위한 검색시 제약을 주기 위해서

• Query의 파라메터로 Predicate을 준다

Page 43: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

NSPredicate

• 인메모리의 내용이나 페치할 내용에 대하여 constraint(제약사항)을 정의하는 클래스이다

• 단순 비교, 검색, 논리연산등과 같은 관계를 정의한다

• 메타데이터에 있는 콘텐츠를 가져올때 일정한 조건을 부여하여 가져오도록 한다

• 효과적인 조건제어를 위해서 사용한다

Page 44: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

NSPredicate

• 다양한 질의를 통해서 메모리상의 내용을 페치하는 것이 가능하다

• iCloud 컨테이너내의 문서객체를 페치할때 조건문으로 적당하다

Page 45: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

메타데이터

• 파일명, 크기, 수정된 내용, 날짜, 수정된 디바이스등의 정보들은 클라우드로 전송되고 이 전송된 정보를 이용하여 다른 디바이스에 전송될지를 결정함

• 디바이스의 상태를 보고 전송여부를 결정한다

• 아이폰/아이패드등 디바이스의 밧데리 상태에 따라 전송여부를 결정

• 이를 통해 밧데리 최적화를 수행

Page 46: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

loadDocument 메소드

Page 47: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

query complete

Page 48: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

query

• 질의를 실행한 후 멈추지 않을 경우, 어플리케이션을 종료할때 까지 질의가 실행된다

• 클라우드 환경에서는 이러한 일이 자주 일어난다

• 질의 결과를 처리하는 동안 발생

• disableUpdate와 stopQuery를 호출하여 중지시킴

Page 49: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

query

Page 50: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

NSMetadataItem

• NSMetadataQuery는 NSMetadataItem 배열을 wrap시킨 것으로 결과를 포함하고 있음

• key-value를 저장

• 각 파일에 대해 그 정보를 살펴보는 용도로 사용

• 사전에 정의된 키를 가짐

Page 51: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

NSMetadataItem 키• NSMetadataItemURLKey

• NSMetadataItemFSNameKey

• NSMetadataItemDisplayNameKey

• NSMetadataItemIsUbiquitousKey

• NSMetadataUbiquitousItemHasUnresolvedConflictsKey

• NSMetadataUbiquitousItemIsDownloadedKey

• NSMetadataUbiquitousItemIsDownloadingKey

• NSMetadataUbiquitousItemIsUploadedKey

• NSMetadataUbiquitousItemIsUploadingKey

• NSMetadataUbiquitousItemPercentDownloadedKey

• NSMetadataUbiquitousItemPercentUploadedKey

Page 52: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

iCloud에 저장하기

• 로컬 iCloud 디렉토리를 추출

• 그 디렉토리내에 다큐먼트 인스턴스 초기화

• saveToURL 메소드 호출

• 저장에 성공하면 openWithCompletionHandler를 호출함

Page 53: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

iCloud에 저장하기

Page 54: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

여기까지 한 일• iCloud를 사용하기 위한 Provisioning Profile을 받고, 여러가지 셋업을 한 후

• UIDocument를 상속받은 Note객체를 만들고

• AppDelegate에서 Query 객체를 통해 메타데이터 추출한다음에 Predicate을 이용해서 검색시의 제약도 주고

• Query를 처리하는 메소드를 알아보고

• Metadata 키를 활용하는 방법도 알아보았다

Page 55: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

사용자 인터페이스 설정

Page 56: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

사용자 인터페이스• iPad 용 사용자 인터페이스 만들기

Page 57: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

테스트

• iOS 기기 2대에 앱을 실행시키고 한 앱에서 임의의 텍스트를 입력한다.

• 두 기기가 동기화되는 것을 확인한다.

Page 58: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

테스트

Page 59: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

부록: NSData

• NSData와 수정이 가능한 클래스인 NSMutableData는 데이터 오브젝터, 바이트 버퍼를 위한 객체지향 래퍼를 제공한다

• 데이터 오브젝트는 Foundation 객체의 행위를 책임지는 단순한 할당 버퍼로서의 역할을 한다.

Page 60: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

UIDocument에서 제공하는 편리한 기능

• 충돌 다루기 및 에러 핸들링

• 앞서 다룬 문제와 같이 A라는 문서를 디바이스1, 디바이스2에서 동시에 수정할 경우의 처리방법

• 두 버전을 보여주고 선택할 수 있다

• 두 버전을 머지하여 변경함

• 가장 최근 버전을 선택한다

• 등과 같은 방법을 선택할 수 있다

• 에러 핸들기 기법도 제공함

Page 61: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

기타

• 클라우드 서비스에서는 예상치 못한 복잡한 상황들이 발생할 수 있다.

• 로컬 저장소에 저장하는 방법(Programming)에 비해서 매우 복잡할 수 밖에 없는 이유가 여기에 있다.

Page 63: iCloud 튜토리얼(2013.6 스마트앱개발자포럼 발표)

참조문헌• Raywenderich 블로그

• http://www.raywenderlich.com/ko/25498/ios-5%EC%97%90%EC%84%9C-%EC%95%84%EC%9D%B4%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-%ED%8C%8C%ED%8A%B8-1

• http://liveandventure.com/2012/11/22/icloud/

• 내가 iCloud를 안쓰는 이유

• http://alphawolf.tistory.com/306

• 내가 iCloud를 쓰는 이유