3D Touch 적용하기 (1) – Home screen quick action API

들어가며..

최근 새로이 출시한 iPhone6s / 6s Plus 에는 MacBook Pro로 이미 선보인 바 있는 3D Touch 기술이 적용되었다.
iPhone에 추가된 3D Touch의 경우 크게 4가지 기능이 있는데 아래와 같다.

  1. Home screen quick action API
  2. UIKit peek and pop API
  3. Web view peek and pop API
  4. UITouch fouce properties

그 중 Home screen quick action API 적용하는 방법을 간략하게 알아보도록 한다.

Home screen quick action API는 다시 2 종류로 나뉘는데 아래와 같다.

  1. Static quick actions
  2. Dynamic quick actions

이 둘의 차이점은 미리 정의되어 있느냐 상황에 따라 정의가 되느냐의 차이로 Static quick actions의 경우 info.plist에 정의가 되며, Dynamic quick actions는 코드로 정의가 가능하다. 사실상 차이점은 크진 않으나 혼용하여 사용할 경우 Static이 우선한다는 것이다.

공통의 제약조건이 하나 있는데 quick actions는 4개까지만 적용이 가능하다는 것이다. 5번째 actions부터는 무시된다.

Static quick actions

앞서 설명한 것과 같이 info.plist에 정의가 된다.

스크린샷 2015-10-26 오후 2.04.19

UIApplicationShortCutItems라는 키를 가지는 배열로 선언이 되며 각 item은 Dictionary 형태를 가진다.
각 Dictionary는 UIApplicationShortcutItemTitle / UIApplicationShortcutItemSubtitle / UIApplicationShortcutItemIconFile / UIApplicationShortcutType / UIApplicationShortcutItemUserInfo 값을 가진다. 차례대로 제목 / 부제목 / 아이콘파일명 / 형태 / 그 외 정보이다.
Title과 Type은 꼭 정의되어야 할 항목이며 그 외 항목들은 필요시 구성하면 된다.

이렇게 정의된 actions들을 코드 레벨에서는 UIApplicationDelegate의 application:performActionForShorcutItem shortcutItem:completionHandler: 메소드에서 정의된다.

static quick actions를 테스트하기 위해서 touchExample이란 프로젝트를 생성하고 action을 선택했을 경우 특정 view controller를 modal 하고 타입에 따라 background color를 변경하는 예제를 만들어보았다. action 정의는 info.plist에서 이미 해뒀기 때문에 이벤트 수신 시 어떻게 handling 할지만 정의하면 된다. 쉽다.


func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void) {
self.handleShortCutItem(shortcutItem)
}
func handleShortCutItem(shortcutItem: UIApplicationShortcutItem) {
guard let rootViewCntrlr = self.window?.rootViewController else {
return
}
if rootViewCntrlr.presentedViewController != nil {
let viewCntrlr = rootViewCntrlr.presentedViewController
viewCntrlr?.dismissViewControllerAnimated(false, completion: nil)
}
let storyboard = UIStoryboard(name: "Main", bundle: nil)
guard let presentNavigation = storyboard.instantiateViewControllerWithIdentifier("PRESENT_NAVIGATION_SCREEN") as? UINavigationController else {
return
}
guard let viewCntrlr = presentNavigation.topViewController as? PresentedViewController else {
return
}
viewCntrlr.shortCutItem = shortcutItem
rootViewCntrlr.presentViewController(presentNavigation, animated: true, completion: nil)
}

view raw

gistfile1.txt

hosted with ❤ by GitHub

Dynamic quick actions

Dynamic quick actions는 dynamic의 의미하는 대로 앱의 상황에 따라 action 설정을 다르게 보일 때 정의하는 방법이다. 사실 static quick actions를 dynamic quick actions로 정의해도 상관은 없는 것 같지만 혼용하여 사용하는 경우에는 static quick actions가 dynamic quick actions보다 우선하므로 우선순위를 생각해야 할 경우에는 주의해야 한다.

Icon을 지정할 경우에는 UIApplicationShortcutIcon() 을 통해 지정하고 UIApplicationShortcutItem을 통해 type / title 등을 지정하여 UIApplication()에 shortcutItems로 등록한다. 아래 코드를 참조하자. 이 역시도 쉽다.. 췟..


let firstShortCutIcon = UIApplicationShortcutIcon(templateImageName: "ShortCut01")
let firstFunctionShortCutItem = UIApplicationShortcutItem(type: "com.y8k.touchExample.function01", localizedTitle: "Member Func. 1", localizedSubtitle: "Dynamic short cut item", icon: firstShortCutIcon, userInfo: nil)
let secondShortCutIcon = UIApplicationShortcutIcon(templateImageName: "ShortCut02")
let secondFunctionShortCutItem = UIApplicationShortcutItem(type: "com.y8k.touchExample.function02", localizedTitle: "Member Func. 2", localizedSubtitle: "Dynamic short cut item", icon: secondShortCutIcon, userInfo: nil)
UIApplication.sharedApplication().shortcutItems = [firstFunctionShortCutItem, secondFunctionShortCutItem]

view raw

gistfile1.txt

hosted with ❤ by GitHub

결론

Home screen quick action의 경우 코드의 복잡도보다는 앱 설계 시 혹은 기존 코드 수정 시에 많은 고민이 생길 것 같다.
당연하겠지만 어떤 기능을 quick action에 정의할지도 고민거리겠지만 앱 전체 로직에서도 quick action 때문에 고려해야 할 부분이 많이 생길 것이다. (탭바 컨트롤러 기반이면 되려 쉽게 해결될 수도 있겠지만..)IMG_0144

전체 코드는 여기에…

0 Shares:
답글 남기기

이메일 주소는 공개되지 않습니다.

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.

You May Also Like