https://beankhan.tistory.com/26


개념

기획

위젯의 존재 목적

위젯은 지금 중요한 정보에 대해 빨리 접근할 수 있도록 제공한다.

예를 들어, 사용자는 현재 주가를 확인하거나, 날씨를 확인하거나, 오늘의 일정을 보거나, 할 일을 완료했다고 체크하기위해 Today view를 연다.

(개발을 시작하기전에) Today extension이 당신이 제공하려는 기능에 적절한지 확실히 해야한다.

최고의 위젯은 사용자에게 빠른 업데이트를 제공하거나 매우 간단한 작업을 하는 것이다.

만약 개발하고싶은 App extension이 복잡한 단계의 일을 해야하거나 컨텐츠 업로드/다운로드 같은 오래걸리는 작업을 하게된다면, Today extension은 옳은 선택이 아니다.


제약 사항 (리젝 사유)

  • 습관적으로 보고 닫을 수 있을 수준의 정보만 제공할 것.
  • 간단히 확인하거나 체크할 수 있을 정도로 심플한 기능을 제공할 것
  • 키보드는 허락되지 않으므로 입력/수정같은 기능은 꿈도 꾸지 말 것(앱에서 제공해야함)
  • 메모리 관리를 잘 할 것. 그렇지 않으면 시스템이 앱을 종료시킬 수 있음.(==위젯이 갱신되지 않을 수 있는 상태)
  • 스크롤하게 하지 말 것
  • 홈화면과 비슷해보이면 안된다.
  • 멀티앱 위젯 경험을 주면 안된다.

 

참고 사이트

 http://minieetea.com/2015/01/archives/2732

 

 


개발

기본 개념

iOS8 부터 지원되는 기능으로 안드로이드의 Widget 과 비슷한 기능이다. (실제로 Widget 이라고 부르기도 한다.)

Extension 앱은 아래와 같은 특징을 가진다.

  • 앱이 아니다.
  • 애플 framework 코드를 통해서만 접근된다.
  • App to app IPC (Inter-Process Communication)가 아니다.
  • 빌드될 때 추가적인 타겟을 통해 따로 빌드되며 설치될때는 앱과 같이 설치, 삭제될때도 앱과 함께 삭제된다. (바이너리 자체도 앱과 독립적이다)
  • 실행시에도 앱과는 완전히 다른 독립 프로세스(process)로 실행되기 때문에  완전히 다른 주소공간(Isolated address space)를 가지게 된다.


한마디로 익스텐션은 애플 프레임웍을 통해서 호출되는 기능들의 집합이라고 표현할 수 있다.

익스텐션의 기능들은 애플프레임웍를 사용해서만 실행 가능하며 호스트앱(다른 앱)이 다이렉트로  익스텐션을 호출하지 못한다.

실행이 애플 프레임웍에의해 된다는 사실을 제외하면, 앱과 거의 동일한 형태를 가진다.

즉, 유저 인터페이스도 가질 수 있고, 이를위한 ViewController, 리소스 등을 모두 사용가능하다.

 

데이터 공유

앱과 익스텐션 간 데티러르 공유하기 위하여 앱 그룹이라는 새로운 컨셉이 도입되었다.

앱과 익스텐션은 동일한 앱 그룹에 속하며 동일 앱 그룹 내에서는 저장소와 일반적인 데이터들을 공유할 수 있게 허용된다.
 

앱과 익스텐션은 독립적인 프로세스로 실행되기 때문에  두 개 모두 동시에 실행 중일 수 있다. ( ex. 앱에서 백그라운드 작업이 진행되고있는 상황에서 익스텐션 기능을 실행하는 경우 )

따라서 공유되는 데이터를 읽고쓰는 경우 동기화(synchronization) 가 필수적이다.


CoreData 또는 sqlite를 이용하면 이미 기본적인 동기화 기능이 제공되며
좀 더 커스터마이즈 하고싶은경우, 일반적인 inter-process (앱-익스텐션간) 동기화 방법을 제공하는 NSFileCoordination 을 이용하여 동기화를 하면된다.

 

 

참고 사이트

https://developer.apple.com/library/ios/documentation/General/Conceptual/ExtensibilityPG/NotificationCenter.html

http://www.letmecompile.com/extensions-for-macos-10-10-ios-8/

 

 

설치 방법

http://tapito.tistory.com/450

 

App Group 의 위치

위 개념대로 Extension 을 위해서는 App Group이 있어야한다.

App Group은  ~/Library/Developer/CoreSimulator/Devices/DFE32C7F-97F6-4CCC-9421-490834C8ED7D/data/Containers/Shared 에 위치한다. (시뮬레이터 기준)

즉, Application 과 완전히 독립된 공간을 가진다.

App Group 위치

 



Application 위치