지속 업데이트 중....



OS 버전

기능SDK출시일비고
1iOS 11 (beta 2)
  • 파일 탐색기 지원
  • 독을 활용한 Splitview/Slideover (멀티태스킹)
  • 드래그앤 드롭 기능
  • Live Photo 루프/바운스/장노출 효과
  • App Store 리뉴얼
  • Siri 번역 기능
  • Apple Music 친구 기능 강화
  • 제어센터 리뉴얼
  • 애플 지도 건물 내부 지원
  • Quicktype 키보드 한손 타이핑 가능
  • 가까이 있는 iOS와 Mac으로 자동 복원 기능
  • 사진앱에서 GIF 및 QR code 기능 지원
  • 파일앱에서 FLAC 재생 가능
  • 32-bit 미지원
  • ARKit (증간현실) 지원
  • ApplePay (NFC API 개방 : iPhone7 이후 모델 대상)
  • 바이너리 바코드 지원 : CIBardoceDescriptor를 이용
  • MusicKit : 애플 뮤직 카탈로그와 라이브러리에 접근 가능
  • 로컬/아이클라우드 탐색기를 활용한 파일 엑세스 가능
  • FileProvider, FileProviderUI로 써드파티 앱 파일 탐색 지원
  • Vision framework : 얼굴, 바코드, 문자, 이미지 등을 인식 가능
  • 이미지를 데이터화 하기 위한 core ML 활용 가능 (machine-learning)
  • 비디오 속의 물체들을 트래킹 가능
  • Metal2 (3D 모델링)
  • core ML (machine learning 지원) : Vision / Non-vision 관련
  • visual code 인식을 위한 시리 지원
  • SiriKit 노트 및 to-do list 관련 도메인 추가
  • 장치가 바라보는 방향에 대한 프로퍼티 추가
  • 인앱결제 앱스토어에서 가능
  • 라이브 메시지 지원
  • HEVC(동영상) / HEIF(이미지) 지원
  • HLS(HTTP Live Streaming) 저장 파일 자동 관리를 AVAssetDownloadTask에 추가
  • APFS 지원 (APple File System)
2017.06.21 (beta2)Xcode9
2iOS 10.3
  • 나의 에어팟 찾기
  • 아이클라우드 설정 메뉴 변경
  • APFS 사용 (Apple File System)
  • 앱내 리뷰 및 평가 기능 추가
  • 업데이트 없이, 앱 아이콘 변경 가능
  • 앱내 리뷰 및 평가를 위해 SKStoreReviewController API 추가
2017.03.28
3iOS 10.2
  • 이전 카메라 설정 유지 기능
  • 이모지 업데이트

2016.12.13
4iOS 10.1
  • 아이폰7 plus 인물사진 모드 추가
  • CSS상, 애플 페이 버튼 지원을 위한 property 추가
2016.10.25
5

iOS 10

  • 위젯, 홈스크린 추가
  • iMessages App/Sticker 기능 추가
  • Siri Kit을 통한 Third party app 지원
  • Notification 사용자 응답 처리 기능 강화
  • iMassage App/Sticker pack target 추가
  • Siri Kit 추가
  • UNNotification kit 추가
  • 아이폰 7 / 7plus 햅틱 피드백 생성 가능
  • Spotlight, Map kit, UIKit, Media player framework 등을 통해 사용자에게 앱 정보 제공 가능
  • Speech framework를 사용하여 연속 말하기 인식 기능을 사용 문장 추출 가능
  • UIColor에서 sRGB 확장 색공간을 지원
  • Call kit을 통한 수신화면 및 차단 기능 구현 가능 (VoIP 이용)
  • 새로운 extension 7가지 추가 (notification, siri, message, sticker, call 관련)
  • 기타 버그 수정
  • Deprecated : 기존 UINotification 관련 일체 (User Notification framework로 대체 : WatchKit 포함), NSPersistantStoreCoordinator 관련 심볼 (CoreData disk 저장 관련 객체), CloudKit record(record : CloudKit에서 DB tuple에 해당) sharing 관련 일체
2016.09.14Xcode8
6iOS 9.3
  • Night Shift 지원
  • 보안 패치
  • Music 라이브러리 접근 지원
  • CloudKit
  • HealthKit
  • HealthKit UI
  • Watch Connectivity
2016.03.22
7iOS 9.2
  • 보안 패치
  • 기타 버그 수정
  • CloudKit : API 토큰을 제공할 때 사용할 웹 토큰 관련 CKFetchWebAuthTokenPeration 제공
  • WatchKit : WKInterfaceDevice에서 Right to Left 언어 지원
2015.12.09
8iOS 9.1
  • 유니코드 7.0/8.0 지원 이모티콘 업데이트
  • 기타 버그 수정
  • Live Photo 관련 API 제공
  • 애플 펜슬 지원 API 제공
2015.10.22
9iOS 9
  • 아이패드 멀티태스킹 지원 (Split view, Slide Over, Picture in Picture 등)
  • 3D touch 지원, 3D touch 지원 기기에 한해 Short cut / Pick & Pop 지원
  • Search를 통한 앱 정보 제공, Spotlight 'Depp Search' 제공
  • Quicktype keyboard '한국어' 단어 예측 지원
  • Siri 개선 및 기능 추가
  • Third party app에서 애플페이 지원
  • GameplayKit 제공
  • Model I/O, Metal, SpriteKit 등 게임 관련 API 제공
  • App Thining 제공
  • Right to Left 언어 지원 (아랍어 등)
  • App Transport Security 지원
  • Live Photo 지원
  • iPad에서 Split view, Slide over를 지원하기 위해 auto layout / size class 등을 사용
  • Picture in Picture를 지원하기 위해서 AVKit 혹은 AV Foundation API를 사용, Media Player framework의 play back 클래스는 deprecate
  • 3D touch 지원 : UIApplicationShortcutItem, UIViewControllerPreviewing, UIVuewControllerPreviewingDelegate 등
  • Core Spotlight framework를 통해 Deep search 기능을 제공
  • 게임 기능 지원을 위해 GameplayKit, Model I/O, MetalKit (3D 그래픽 엔진), SceneKit (3D 그래픽 엔진), SpriteKit (2D 그래픽 엔진) 등 추가 및 개선
  • App Thining 지원 : Slicing (Asset 사용), On-Demand Resource (tag 구현), Bitcode (빌드 설정)
  • TLS 미지원 통신을 사용할 때, Info.plist에 추가 설정 필요
  • 기존 Address/Address UI 대신 Contact/Contact UI framework 지원
  • Watch Connectivity 지원 : WKSession을 통한 iOS앱, 와치앱 간의 통신 지원 개선
  • Passcode와 Touch ID를 통한 키체인 접근 제한 기능 추가
  • Deprecated : Address Book / Address Book UI framework, NSURLConnection 대체 등
2015.09.10Xcode7
10iOS 8.4
  • 애플 뮤직 추가

2015.07.01
11iOS 8.3
  • 성능 향상
  • 이모티콘 업데이트
  • 기타 버그 수정
  • 애플페이 로고를 활용한 PKPaymentButton 제공
  • Metal에서 쉐이더 버퍼와 버택스 타입을 조정하기 위한 객체와 메소드 추가
2015.04.08
12iOS 8.2
  • 애플 워치 앱 추가
  • Glance, custom notification interface 제공
  • WatchKit에 label, image, button, table 등 interface object 추가 및 강화
2015.03.09
13iOS 8.1
  • 애플페이 추가
  • 키보드 받아쓰기 기능 추가
  • 기타 버그 수정
  • PassKit에 애플페이 지원 추가
2014.10.21
14iOS 8
  • Interactive notification 지원
  • Quicktype 지원
  • iMessage 추가
  • iCloud drive를 통한 맥, 윈도우 파일 공유 가능
  • Health 앱 추가
  • 가족 공유 지원
  • App Extension 지원 : Share (공유), Action (컨텐츠 액션), Today (위젯), Photo editing (이미지 편집), Storage provider (iCloud Drive 및 기타 앱 접근), Custom keyboard (Third party 키보드 지원) 등
  • Touch ID 지원 : LocalAuthentication framework 추가
  • Asset Library를 대체할 Photos framework 추가
  • AV Foundation framework를 활용하여 카메라 초점, 노출, 밸런스 등의 기타 설정을 직접 조작 가능
  • 아이폰 6/6 plus를 위한 HDR, 떨림 보정, 스틸 이미지, 초점 조절을 위한 property 제공
  • 게임 엔진 개선 (Metal, SceneKit, SpriteKit, AV audio engine, openGL es 등)
  • HealthKit, HomeKit 추가
  • iCloud 지원 강화 : 마이그레이션, CloudKit, Document Picker 추가
  • Handoff 지원
  • 새로운 대화면 지원을 위한 Size class 추가 및 auto layout 강화
  • Deprecated : UIApplication APNS 등록 method 대체, UIViewController interface orientation methods, UISearchDisplayController 대체
2014.09.25Xcode6
15iOS 7.1
  • 성능 향상
  • 카플레이, 지문인식 기능 강화
  • Media player 지원 강화 : MPPlayableContentManager, MPPlayableContentDataSource , MPContentItem, MPRemoteCommand, MPRemoteCommandEvent 등
  • openGL es 개선
2014.03.10
16iOS 7
  • UI 전면 교체
  • 64 비트 지원
  • 제어센터 추가
  • 한국어 10키 키보드 추가
  • AirDrop 지원
  • Third party 게임 컨트롤러 API 지원
  • SpriteKit 추가
  • 앱스토어 셀룰러 지원 상한 50MB->100MB 상향
  • 64비트 지원 (빌드 설정)
  • TextKit 지원 : NSAttributedString (문자열 개체 값을 확장하여 지정), NSLayoutManager (각 글자별 레이아웃을 별도로 지정 가능), NSTextContainer (문자열의 배치 영역을 지정 가능), NSTextStorage (글자 기반의 컨텐츠를 개별 관리)
  • Multitasking in Background 지원 : UIBackgroundMode로 fetch 방식, Slient notification을 통한 업데이트 방식 지원
  • 게임 관련 framework 지원 : SpriteKit, GameController.framework, Game Center 개선
  • MapKit 업데이트
  • UIActivityViewContorller를 사용하여 이미지, 문서, URL 등의 데이터 들을 AirDrop으로 공유 가능
  • 앱에서 다른 앱으로 음원 파일을 공유하는 inter-app Audio 지원 : Audio Unit framework
  • 인터넷 연결 없이 기기들 사이에 직접 통신을 지원 : MultipeerConnectivity framework
  • Javascript 객체를 생성해서 Javascript 코드에 삽입 가능 : JavascriptCore framework
  • media file에 closed-caption을 추가 가능 : MediaAccessibility framework
  • Safari 읽기 목록에 지정 URL을 추가 가능 : DafariService framework
  • StoreKit으로 새로운 영수증 시스템 이용 가능
  • PassKit에 새로운 API 추가 : pass 만료일, iBeacon 감지, 사용자에세 표시되지 않는 데이터 정의,
  • openGL es 3.0 지원
  • message에 파일 첨부 가능 : MFMessageComposeViewController 개선
  • MPVolumeView 클래스를 사용하여 무선 스트리밍 루트 (AirPlay, Bluetooth 등)를 선택 가능
  • 기타 framework 개선
  • Deprecated : MAC address 관련 API (UIDevice의 identifierForVender로 대체), 기타 properties
2013.09.19Xcode5
17 iOS 6.1



18 iOS 6





참고 :  https://goo.gl/g29Csg

View Controller


    View controller는 앱의 UI를 꾸미는 view들을 관리한다. 개발할 기능과 시각적 요소를 제공하기 위해서 view controller를 상속받아 클래스를 구현한다. view controller는 관리하고 있는 view들과 엮여 있으며 event를 처리하기 위한 Responder chain에 관여한다. view controller는 UIResponder 객체로서, 해당 view controller의 root view와 super view 사이의 Responder chain에 위치한다. view controller의 view가 event를 처리하지 않는다면 해당 event를 super view로 넘길 수 있다. 그리고 다른 view controller를 container view controller에 표시할 수 있다.


Responder Chain




Storyboard와 Nib file


    Storyboard를 사용하면 view controller의 view들을 정의할 수 있고, 각 view controller의 관계를 segue를 통하여 정의할 수 있다. Nib 파일을 사용하면 각 view controller와 연관된 view들을 정의할 수 있다. storyboard처럼 각 view controller간의 관계를 정의할 수 없다. storyboard나 nib이 아닌 코드로 custom view를 정의할 경우, view controller의 view들은 loadView() 메소드에서 정의합니다. view controller의 root view 또한 loadView()에서 생성한다.



View controller와 View


    view controller는 자신이 가지고 있는 view들의 유일한 소유자이다. 이 소유권은 view controller가 해제될 때까지 유지된다. nib 파일이나 storyboard에 view를 정의했을 경우, view controller에서 view를 불러올 때 복사본이 생성되어 소유하게 된다. 즉, 다른 view controller에서도 사용 가능하여 재사용성이 높아집니다. 하지만 view controller 내부에 정의된 view의 경우에는 해당 view controller만 소유할 수 있다. root view는 view controller에 정의된 전체 영역에 맞게 자동으로 맞춰진다. root view에 올라가는 각 subview들은 autolayout과 같은 기능을 사용하여 개발자가 직접 사이즈와 위치를 정의할 수 있다.



addSubView와 addChildViewController (Container View Controller)





참고 : Apple documents - UIViewController

addSubview & addChildViewController


    addSubview는 view를 view hierarcky에 추가한다. addChildViewController는 Container View Controller에 child view controller를 추가한다. 전자의 경우, 하나의 view controller에서 event를 관리한다. 후자의 경우, 각각의 view controller들이 자신이 소유하고 있는 view의 event를 따로 관리하게 된다. 그리고 각 child view controller를 소유하고 있는 view controller를 container view controller라고 한다.


    우리가 가장 흔하게 볼 수 있는 container view controller의 예가 tab bar controller / navigation controller 등이 있다. 각 tab별로 view controller를 추가한다. 각 view controller는 해당 tab이 눌리면 화면 상에 추가되어 사용자 event를 각자 처리하게 된다. 이와는 별개로 사용자의 event를 받기만할 뿐, 따로 처리하는 로직을 분리하고 싶지 않으면 해당 view를 addSubview로 추가한다.




Container View Controller


    UIViewController를 상속한 클래스는 container view controller로 동작할 수 있다. container view controller는 자신이 소유하고 있는 child view controller의 내용물 (view, event 등)을 표현하는 로직을 관리한다. child view controller의 view는 contain view controller의 view와 연계되어 표시된다. 해당 container view controller는 child view controller들과 연계될 수 있도록 public interface로 선언해야 한다. container view controller의 interface들을 public으로 선언함으로써 child view controller들이 container view controller 구현부의 동작에 상관없이 각자의 역할을 수행한다.





    위 그림처럼 child view controller를 추가하면 된다. child view controller의 view가 view hierarcky에 추가되기 전에 container view controller에 추가해야한다. 이 과정이 선행되야 contain view controller는 자신이 관리하는 view와 child view controller에게 event를 전달할 수 있다. 마찬가지로 child view controller의 view가 제거된 후에는 child view controller에서 자기자신을 container view controller에서 제거해야 한다. 제거를 위한 메소드들은 child view controller가 아니라, container view controller에 의해서만 호출해야 Containment 동작에 예외 케이스를 줄일 수 있다.


    


    Autorelease pool은 객체가 즉시 해제되는 가능성을 피하고자 할 때, 객체에 대한 소유권을 포기하도록 하는 메카니즘이다. autorelease pool은 '@autoreleasepool'이라는 키워드로 사용한다. 블록안 에서 autorelease 메시지를 받은 객체들은 '@autoreleasepool'로 선언한 블록의 끝에서 release 메시지를 받는다. 일반적으로 autorelease 메시지는 객체를 할당한 구역 밖에서 객체를 해제하고자 할때, 컴파일러에게 이를 알리고자 사용하는 메시지이다. 하지만 autorelease 메시지는 객체가 언제 해제되는지 불명확해 진다. autorelease pool은 이런 autorelease 객체가 해제되는 시점을 명시적으로 보여준다. 즉 autorelease pool안에서 생성된 autorelease 객체들은 autorelease pool에서 벗어나는 시점에 해제된다. 아래는 non-ARC 환경과 ARC 환경에서 autorelease pool이 가지는 매커니즘에 대한 예시이다.





    그럼, autorelease pool은 언제 사용이 될까? 우선 기본적으로 우리가 사용하는 모든 autorelease 메시지에는 autorelease pool이 연관되어 있다. macOS/iOS 앱을 개발하면 기본적으로 Foundation framework를 사용한다. Foundation framework는 autorelease pool로 감싸져 있다. autorelease 메시지를 받은 객체들은 이 autorelease pool이 해제될때, 같이 해제된다. 이처럼 framework 내부에서 사용되는 autorelease 객체를 관리하기 위해 사용된다.


    

향후 함수형 프로그래밍에 대한 이해는 이 포스팅에 작성합니다.




  • 함수형 프로그래밍에서 고차함수나 재귀를 자주 쓰는 이유 : 함수형 프로그래밍은 외부의 영향을 받지 않는 순수함수 사용을 지향한다. 이유는 순수함수 여야만 분산 프로그래밍 시스템에서 데이터의 신뢰성을 보장 하는 함수형 프로그래밍의 가치를 살릴 수 있기 때문이다. 그래서 반복문을 사용할 때, for, while 같은 loop문을 사용하는 것 보단 외부에서 가져온 변수를 스택에 저장하고 이를 참조하는 재귀함수를 쓴다. 이는 스택 영역에 복사된 데이터를 참조하기 때문에 외부 변수나 State에 의해 데이터 신뢰성이 파괴 되는 행위를 방지할 수 있다.

  • 중간 변수를 캐시하는 방법 : 재귀를 사용하여 연속으로 함수를 호출하는 상황에서 중간과정에서 계산한 값을 사용해야할 때가 있다. 중간에 계산된 값은 재귀를 호출하는 구문에서 변수를 지정하여 스택에 저장한 다음, 역호출할 때 사용할 수 있도록 한다.

  • 복합형 데이터 : 여러 값을 동시에 참조하거나 사용할 때가 있다. 이 때는 튜플이나 enum을 이용한 패턴 매칭을 사용하자.
    • 튜플 : 함수를 이용한 복합 데이터 구조가 단일 구조일 때 사용한다. 데이터 쌍으로 전달할 수도 있고, 각 데이터에 임의의 이름을 지정할 수도 있다.
    • enum : 함수를 이용한 복합 데이터 구조가 2개 이상일 때 사용한다. 데이터 구조 타입별로 enum case를 구현한다. switch-case를 사용한 패턴 매칭으로 데이터를 추출하여 사용한다.

  • 의미 있는 상수의 사용 : 변수는 말 그대로 변화하는 값이다. 변화하는 값은 로직의 변화를 유발하거나 데이터의 신뢰성을 저해한다. 그러므로 변수의 사용을 최소화하고, 사용가능 하고 유의미한 상수를 사용하도록 한다.






'Programming' 카테고리의 다른 글

[Programming] 함수형 프로그래밍에 대하여  (0) 2017.07.04

    iOS에서 64비트를 사용하면서, 각 데이터 사이즈의 변화가 생겼다. 특히 NSInteger, NSUIntger 등등의 'NS'라는 접두어가 붙는 primitive type의 사이즞 각 아키텍처 별로 다르다. 예를 들어 NSInteger의 경우, 32비트에서 int 타입으로 4 바이트를 가진다. 반면 64비트에서는 long 타입으로 처리되어 8바이트가 된다. print (NSLog) 문을 통하여 출력을 할때, 데이터의 사이즈가 전달되는데, 이렇게 데이터의 사이즈가 아키텍처별로 다르기 때문에 컴파일을 하다보면 워닝을 발견할 수 있다. 이와 같은 워닝을 방지하기 위해 위의 데이터 포맷이 필요하다.


    %zd, %tu, %tx는 32/64 비트 아키택처에 맞추어 데이터 사이즈를 전달한다. 단, %zd는 signed/ %tu는 unsigned/ %tx는 hexa를 표현하는데, 사용된다. 이에 관한 apple의 도큐먼트 링크를 남긴다. 해당 링크를 확인해보면 앞에서 언급한 3가지 데이터 포맷 외에도 여러가지 데이터 포맷을 확인할 수 있다.



Document : https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html

    Observable은 Rx에서 중요한 요소이다. Sequence하고도 불리지만 대부분 Obserable이라고 불린다. Observable 3가지 타입의 이벤트를 수용한다. 각 event는 onNext, onComplete, onError이다. 각 event는 아래와 같이 정의된다.


onNext

아래의 그림에서 각 원으로 표시되는 event로, 각 element마다 발생하는 event이다.


onCompleted

아래의 그림에서 수직으로 그어진 선이다. observable의 정상적인 종료를 의미한다.

onError

아래의 그림에서 빨간 'X'이다. observable의 비정상적인 종료를 의미한다. error 객체를 반환한다.




    observable은 of, just, from 등의 operator들에 의해 생성된다. 생성된 observable이 각 event에 맞게 수행할 handler를 구현하기 위해서 subscribing이 선행되야한다. subscribe은 아래의 코드처럼 실행한다.





    observable을 명시적으로 해제하기 위해선 dispose()를 호출해야 한다. 일반적으론 dispose bag을 사용한다. dispose bag은 각 observable의 해제를 위한 disposable을 소유하고 있다. dispose bag이 해데되는 시점에 각 observable의 disposable을 통해 자동으로 해제된다. 중요한건 dispose bag에 disposable을 넣는 것을 잊을 경우, 컴파일러에서 이를 알려준다. 일반적으로 observable 해제의 자동화를 위해, 아래와 같은 패턴으로 observable의 disposable을 dispose bag에 할당한다.



앱사이즈에 대하여

앱사이즈에 대해 말하기에 앞서, 각 용어에 대해 먼저 정의하겠습니다.

 앱스토어 등록을 위한 파일 포맷

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



- App Thinning (iOS9 이상 지원) : Slicing, Bit code, On-Demmend Resource 등 (이하 항목은 App Thinning의 적용 여부에 따라 분류됩니다.)

- Slicing : 각 architecture용 바이너리와 기기에 맞는 리소스만 묶어 설치하는 기술입니다.

- Bit Code : Bit Code를 포함하여 스토어에 올리면 애플이 중간형태의 바이너리로 최적화 작업을 진행합니다. 

- On-Demmand Resources : 초기 실행에 필요 없는 파일을 제거하는 기술입니다. 제거된 파일은 키워드로 분류하여, 추후 앱이 실행되는 동안 스토어를 통해 백그라운드에서 다운로드 합니다.

 

앱 설치를 위한 파일 포맷

  • Universal .ipa : 기기에 다운로드 받는 .ipa 파일입니다. 스토어에서 사용하고 기기에는 필요없는 .dysm과 On-Demmand Resource용 assets 패키지가 제거된 .ipa입니다. Bit code로 recompile한 파일입니다. iOS8 이하에서 설치되며, 기종에 상관없이 모든 iOS 기기를 위한 데이터를 포함합니다.
  • Thinned .ipa : 기기에 다운로드 받는 .ipa 파일입니다. 스토어에서 사용하고 기기에는 필요없는 .dysm과 On-Demmand Resource용 assets 패키지가 제거된 .ipa입니다. Bit code로 recompile한 파일입니다. iOS9 이상에서 설치되며, 앱이 설치될 기기에 특화된 데이터만을 포함합니다.


  • Universal app bundle : Universal .ipa에서 압축 해제한 후, 최종적으로 기기에 설치되는 app bundle 입니다.
  • Thinned app bundle : Thinned .ipa에서 압축 해제한 후, 최종적으로 기기에 설치되는 app bundle 입니다.



앱 사이즈 줄이는 방법

Code

  • 긴 문자열, 테이블, 기타 리소스 파일들은 code가 아닌 외부 파일로 저장합니다. 외부 파일은 바이너리로 쓰이는 code보다 더 효율적인 압축 알고리즘을 지원합니다.
  • Optimization Level을 Fastest, Smallest [-Os]로 설정합니다.
  • PNG Compression을 사용합니다.
  • 앱 실행에 있어 필수인 파일들만 Documents 디렉토리에 저장합니다. 이외의 파일은 Caches 혹은 tmp 디렉토리에 저장하여 backup 프로세스를 우회합니다.

Assets

  • .ipa 파일을 검사해서 앱 실행을 위해 사용하지 않는 파일 (readme, 헤더 파일, 기타 등)들이 App bundle에 포함 되어있는지 검사합니다.
  • Asset Catalogs를 사용합니다. 이는 App Slicing 정책에 기반하여, 각 기기에 필요한 리소스 파일들만 정확히 분류하여 설치합니다.
  • 32-bit PNG 파일보단 8-bit PNG 파일을 사용합니다. 크게 4배까지 사이즈를 줄일 수 있습니다.
  • 32-bit 이미지에 한해, 포토샵의 Save For Web 옵션을 사용합니다. 이를 사용하면 이미지 외의 메타데이터(만든 앱, 만든 날짜, 작성자 등) 들을 삭제하여 PNG, JPG 등의 사이즈를 줄일 수 있습니다
  • AAC나 MP3 포맷을 이용하여 오디오 파일의 사이즈를 줄입니다.

Architecture

  •  On-Demmand Resources를 사용합니다. 자주 사용하지 않는 리소스들은 묶어 On-Demmand Resources를 통해 전달 받도록 구현합니다.
  • Background Downloads를 사용합니다.



출처 : https://developer.apple.com/library/content/qa/qa1795/_index.html

    코드의 재사용성을 높이는 방법 중에 하나가 활용도가 높은 코드를 Library와 Framework로 구현하여 사용성을 제고하는 것이다. iOS 플랫폼에서도 Library와 Framework를 제공한다. 하지만 기존 우리가 알던 Library와 Framework의 의미와 조금 다르다. Library는 실행가능한 정적인 코드의 집합을 뜻하고 Framework는 동적인 App 번들을 뜻한다. 그럼 Library와 Framework의 특징에 대해 명확하게 알아보자.




Library (Static Library)

    Library(.a) 는 앱에 링크된 Object file(.o) 들의 모임이다. iOS8에서 Framework가 나오기 전까지 유일하게 사용되던 옵션이었다. 프로그램과 링크되어 있다. 즉, 빌드 과정에서 Library의 내부 모듈들이 target 앱에 전부 링크된다. 단, Library는 실행가능한 코드만을 포함할 수 있다. 그리고 이 코드를 Client에서 사용하기 위해선 API에 대해 서술된 Header file이 필요하다. 




Framework (Dynamic Bundle)

    Library(.a) 는 오로지 실행 가능한 코드만 가질 수 있었다. 하지만 Framework(.framwork) 는 번들이다. 번들이라 함은 파일들이 포괄적으로 담길 수 있다는 말이다. Framework는 Library와 더불어 API의 헤더 파일, Documentation, View, Control, UI, Assets, configuration file 등 다양한 파일을 담을 수 있다. 이외에 Framework만 가지는 특징은 아래와 같다.


  • Inversion of Control - Library는 오로지 Client에서 호출만 가능하지만 Framework는 Client와 상호간 호출이 가능하다. 예를 들어 Framework 내부에서 Client의 이벤트 핸들러를 역으로 호출하는 구현이 가능하다.
  • Framework에 이미지, UI, 코드 등을 하나의 Framework에 담을 수 있다. 
  • App과 Extension에서 모두 사용하는 코드의 경우, Framework로 구현하여 재사용성을 높일 수 있다.
  • API를 구현할 때, 필요한 Header file을 포함하므로 import 과정이 Library에 비해 비교적 쉽다.




http://www.knowstack.com/framework-vs-library-cocoa-ios/

'Programming > Mac & iOS' 카테고리의 다른 글

[RxSwift] Obseravbles  (0) 2017.05.13
[iOS] ipa와 번들에 대하여  (0) 2017.02.04
[iOS] Library & Framework in iOS  (0) 2017.01.31
[iOS] WKWebView (instead of UIWebView)  (0) 2017.01.19
[iOS] APNS JWT (JSON Web Token)  (0) 2016.12.19
[iOS] What's new in iOS 10  (0) 2016.06.27

    기존 UIWebView는 무겁고 복잡하고 메모리 누수가 있다. 심지어 니트로 자바스크립트 엔진을 장착한 모바일 사파리에 비해 느리다. WWDC 2014에서 새로 소개된 WKWebView는 AppKit의 WebView와 UIKit의 UIWebView를 대체하고, 양 플랫폼의 동일한 API를 제공하는 새로운 Webview이다. 60fps 스크롤링, 빌트인-제스처, App-WebPage 간 커뮤니케이션을 제공한다. 




   UIWebView와 WKWebView의 큰 차이점은 2가지가 있다. 먼저 UIWebView는 UIKit에 구현되어 있어, 따로 import가 필요하지 않다. 그래서 Interface builder에서 사용할 수 있다. 그 다음, WKWebView는 javascript 최적화를 위해 별도의 프로세스를 운용한다. 그래서 UIWebView보다 빠르고 효율적이다. 단, iOS 8에서 local file을 로드하는데, 오류를 가지고 있다. iOS 9에서 수정된 사항이다.



그외 자세한 차이점은 아래의 URL에서 확인 가능하다.





WKWebKit framework


WKBackForwardList - 웹뷰에서 방문했던 웹 페이지 리스트

WKBackFowardListItem - 웹뷰 back-forward 리스트에 각 웹 페이지


WKFrameInfo - 웹 페이지에서 frame에 관한 정보를 포함


WKNavigation - 웹 페이지 로딩 과정을 추적하는 정보를 포함

WKNavigationAction - 웹 페이지 navigation을 유발하는 Action에 관한 정보를 포함

WKNavigationRespoonse - navigation 응답 값을 포함


WKPreferences - 웹뷰의 설정값을 캡슐화


WKProcessPool - 웹 컨텐츠 프로세스들의 pool


WKUserController - 자바스크립트로 메시지를 보내거나 웹뷰에 user script를 삽입

WKScriptMessage - 웹 페이지로 보낼 메시지의 정보를 포함

WKUserScript - 웹 페이지에 삽입할 스크립트


WKWebViewConfiguration - 웹 뷰를 초기화할 property 들의 collection


WKWindowFeatures - 새로운 웹 뷰를 요청할 때, 윈도우에 포함할 값들




Protocols


WKNavigationDelegate - main/sub frame load 정책과 main frame navigation 과정을 추적하는 메소드를 제공


WKScriptMessageHandler - 웹페이지에 동작하는 자바스크립트 메시지를 받는 메소드 제공


WKUIDelegate - 웹 페이지 상에서 native UI를 표현하는 메소드를 제공





Javascript - Native communication


Message Handlers


    Web과 앱간 통신은 message handler를 통하여 한다. Javascript에서 Native로 message를 던지기 위해서 아래와 같이 구현한다. 아래의 {NAME}에 따라 Native에서 message를 처리할 handler를 지정할 수 있다. 




    Native에서 message를 처리하기 위해선 WKScriptMessageHandler protocol을 구현한 다음 addScriptMessageHandler()를 통하여 message handler를 추가하면 된다. 추가하는 코드는 아래와 같다. NotificationScriptHandler는 WKScriptMessageHandler를 통하여 구현됬다. 구현된 객체를 addScriptMessageHandler()를 통하여 name과 함께 추가하면 된다. 추가할 때, 사용한 name을 기준으로 Javascript에서 message를 처리할 handler를 지정해 줄 수 있다.






Injecting Behavior with User Script


    WKWebView에서 지원하는 기능 중에 강력한 기능 중 하나는 사용자가 script를 Native에서 작성하여 WebView에서 실행시키는 것이다. Script를 string으로 정의한 후에 WKUserScript 객체를 생성한다. 실행되는 시점은 the start/end of document load 중에 선택하여 지정해 줄 수 있다. 아래의 코드처럼 사용하면 된다.


'Programming > Mac & iOS' 카테고리의 다른 글

[iOS] ipa와 번들에 대하여  (0) 2017.02.04
[iOS] Library & Framework in iOS  (0) 2017.01.31
[iOS] WKWebView (instead of UIWebView)  (0) 2017.01.19
[iOS] APNS JWT (JSON Web Token)  (0) 2016.12.19
[iOS] What's new in iOS 10  (0) 2016.06.27
[iOS] Alcatraz : Xcode 패키지 매니저  (0) 2016.05.25

+ Recent posts