iDev/3D Touch

다이나믹 Shortcut Item 만들기

KraZYeom 2015. 11. 1. 14:11
반응형


iPhone 6s가 출시되면서 iOS 9에는 3D Touch와 관련된 기능이 많이 추가 되었다. 그중 하나가 Home Screen Quick Actions 기능이다. 퀵 액션, 단축 버튼과 같은 기능을 한다. 홈 스크린에서 아이콘을 꾹! 힘있게 누르면 퀵 엑션을 지원하는 앱은 바로 가기 리스트가 나타나고 없는 앱들은 탭틱 진동이 살짝 일어난다. 6s 미만의 아이폰에서는 지원하지 않는다.


앱에 3D Touch 관련 기능을 추가할 때 가장 쉬운것이 퀵 액션이다. 코드 몇 줄만 작성을 하면 기존에 앱에 코드 구조를 바꿀 필요가 없이 퀵 액션을 추가할 수 있다.


퀵 액션은 코드 상에서는 Shortcut Item이라고 부른다. 숏컷 아이템은 크게 두 가지로 나뉜다. 

  1. Static Shortcut Item
  2. Dynamic Shortcut Item

스태틱 숏컷 아이템은 plist에서 설정을 하고 변경할 수 없다. 하지만 앱에 정의 되어 있기 때문에 최소한 한번을 실행하지 않고 설치만 했을 때에도 퀵 액션을 만들 수 있다.


반면에 다이나믹 숏컷 아이템은 앱이 실행되고나서 UIApplication.sharedApplication().shortcutItems에 할당 하기 때문에 최소한 한 번 은 실행을 해줘야 다음에 나타나게 된다. 앱을 업데이트 하거나 재설치 할 때도 마찬가질수 도 있다. 하지만 고정되지 않고 원하는대로 아이템을 변경할 수 있다. 


애플의 기본앱인 사진기 앱과 전화 앱을 비교해 보면 그 차이를 알 수 있다. 사진기 앱은 기능이 딱 4개로 정해져 있다. 하지만 전화 앱은 Favorites에 설정한 상단 4명을 보여줄 수 있다. 퀵 액션에 보여주고 싶으면 리스트의 순서를 바꾸면 된다. 


원래 하고 싶었던 것은 앱을 실행 하지 않고 퀵 액션만 부르면 랜덤값으로 계속해서 변경을 해서 보여주고 싶었다. 하지만 그 방법은 없는 것으로 보인다. 최소한 한 번 이상의 앱이 실행되어야 계속 해서 랜덤값으로 할당 해 줄수 있다.


가장 간단하게 Dynamic ShortItem을 만드는 방법을 알아보도록 하자. 


앱상 어디에서 구현해도 상관은 없지만 최소한 한 번은 호출 되어야 보이기 때문에 func application(application:, didFinishLaunchingWithOptions:) 에 구현을 하면 되긴한다. 하지만 앱이 첫 번째로 실행 되었을 때만 호출이 되고 그 다음에는 호출 되지 않으므로 지속적인 변경을 위해서는 applicationDidBecomeActive(application:)에 넣으면 다음에 앱이 열였을 때도 이 메소드가 호출이 되어서 다시 숏컷 아이템을 재 할당할 수 있다.


UIApplicationShortcutItem을 만들고, UIApplication.sharedApplication().shortcutItems 에 넣으면 끝이다. 정말 간단하지 않는가? 


글로벌 변수로 스트링 값을 가진 배열을 하나 만들었다.

var randString : [String] = ["김밥", "라면", "만두", "김치찌개", "로브스터", "냉면", "비냉", "떡볶이"]


그리고 앱이 실행되면 ShortItem에 할당할 아이템을 아래와 같이 구현한다.

func applicationDidBecomeActive(application: UIApplication) {
  // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
  print("applicationDidBecomeActive")

  let count = UInt32(randString.count);
  
  // 1.
  let item1 = UIApplicationShortcutItem.init(type: "type1", localizedTitle: randString[Int(arc4random_uniform(count))], localizedSubtitle: "test", icon: UIApplicationShortcutIcon(type: UIApplicationShortcutIconType.Compose), userInfo: nil)
  
  let item2 = UIApplicationShortcutItem.init(type: "type2", localizedTitle: randString[Int(arc4random_uniform(count))], localizedSubtitle: "test", icon: UIApplicationShortcutIcon(type: UIApplicationShortcutIconType.Compose), userInfo: nil)
  
  let item3 = UIApplicationShortcutItem.init(type: "type3", localizedTitle: randString[Int(arc4random_uniform(count))], localizedSubtitle: "test", icon: UIApplicationShortcutIcon(type: UIApplicationShortcutIconType.Compose), userInfo: nil)
  
  let item4 = UIApplicationShortcutItem.init(type: "type4", localizedTitle: randString[Int(arc4random_uniform(count))], localizedSubtitle: "test", icon: UIApplicationShortcutIcon(type: UIApplicationShortcutIconType.Compose), userInfo: nil)
  
  let shortcutItems : Array = [item1, item2, item3, item4]
  
  // 2.
  UIApplication.sharedApplication().shortcutItems = shortcutItems

}
  1. shortcutItems에 넣을 UIApplicationShortcutItem을 하나 만든다. type은 퀵 액션으로 호출 되었을 때 구분을 위한 것이다. localizedTitle은 텍스트로 들어갈 값이고 localizedSubtitle은 밑에 추가 설명글이다. 옵셔널이다. icon은 시스템에 내장된 아이콘을 사용해도 되고, 아니면 커스텀 아이콘을 사용해도 된다. userInfo에는 추가적으로 들어갈 정보이다. 옵셔널이다.

  2. 최대 4개의 퀵 액션을 지원하므로 4개의 아이템을 배열에 넣고 shortcutItems에 할당한다.

이렇게 하고 빌드&런을 하면 아이콘을 꾹 누르면 퀵 액션이 보여진다. 그리고 실행했다가 다시 누르면 아이템들이 변경되는 것을 확인 할 수 있다. 


하지만 숏컷을 눌러서 이제 그 type에 맞는 액션을 호출 하게 하려면 AppDelegate에서 func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void)를 구현해줘야 한다. 


func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void) {
  
  switch shortcutItem.type {
  case "type1":
    print("type1")

  case "type2":
    print("type2")
  
  case "type3":
    print("type3")
  
  case "type4":
    print("type4")
    
  default:
    print("test")
  }
}

앞에 UIApplicationShortcutItem.init에서 type으로 설정한 것이 shortcutItem.type이다. 이것으로 구분하여 각각에 퀵 액션에 대한 것을 구현 할 수 있다.


리스트 순서와 아이콘의 위치는 3D Touch Human Interface Guide Line을 참조하도록 하자.


홈 화면에서 아이콘이 상하좌우 위치에 따라서 퀵 액션(ShortCut)의 순서(order)와 아이콘의 위치가 다르게 나온다. 아이콘에서 가까운쪽이 순위가 높은거고, 아이콘의 위치는 아이콘에 가까운곳에 숏컷 아이콘이 오게 된다.


이상 아주 간단하게 퀵 액션 만드는 방법을 살펴 보았다.




반응형