3D Touch の Home Screen Quick Actions に対応する


# Home Screen Quick Action

iPhone6s から 3D Touch を作った機能がアプリで実装できるようになりました。
いくつかありますが今回 Home Screen Quick Action(以降 Quick action) の対応に必要なものをまとめました。

Quick Action : アプリアイコンを強く押し込んだ時に表示されるメニューから操作できるアクションのこと。

![12036756_10206472319819628_3518951874925869771_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/27210/5c756ed7-8145-01c9-e910-833435acd742.jpeg "12036756_10206472319819628_3518951874925869771_n.jpg")

追加できるアクションはInfo.plistに記述する方法(静的アクション)とコードで追加する方法(動的アクション)があります。

## 静的アクションの定義

UIApplicationShortcutItems を Info.plist に追加します。
ひとつのアクションが UIApplicationShortcutItem に相当します。各アクションの詳細を設定するキーは以下のとおりです。

### 追加するキーと意味

|Key name|意味|
|:--|:--|
|UIApplicationShortcutItemType (必須)|アクション種別を表す文字列。|
|UIApplicationShortcutItemTitle (必須)|Home Screen 上に表示されるタイトル。多言語化は InfoPlist.strings で行う。|
|UIApplicationShortcutItemSubtitle|Home Screen 上に表示されるサブタイトル。|
|UIApplicationShortcutItemIconType|アイコンの種別。システムで用意されているアイコン画像がある。指定できる種別は下記参照。|
|UIApplicationShortcutItemIconFile|自分で用意したアイコン画像の名前。画像サイズは 35 x 35 ポイント。この値を指定した場合 UIApplicationShortcutItemIconType の値は無視される。|
|UIApplicationShortcutItemUserInfo| 起動時に渡されるデータを保持したディクショナリ。 |
#### システムで用意されたアイコン画像
|Key name|アイコン|
|:--|:--|
|UIApplicationShortcutIconTypeCompose|![](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplicationShortcutIcon_Class/Art/UIApplicationShortcutIconCompose@3x_2x.png)|
| UIApplicationShortcutIconTypePlay |![](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplicationShortcutIcon_Class/Art/UIApplicationShortcutIconPlay@3x_2x.png)|
| UIApplicationShortcutIconTypePause |![](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplicationShortcutIcon_Class/Art/UIApplicationShortcutIconPause@3x_2x.png)|
| UIApplicationShortcutIconTypeAdd |![](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplicationShortcutIcon_Class/Art/UIApplicationShortcutIconAdd@3x_2x.png)|
| UIApplicationShortcutIconTypeLocation |![](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplicationShortcutIcon_Class/Art/UIApplicationShortcutIconLocation@3x_2x.png)|
| UIApplicationShortcutIconTypeSearch |![](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplicationShortcutIcon_Class/Art/UIApplicationShortcutIconSearch@3x_2x.png)|
| UIApplicationShortcutIconTypeShare |![](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplicationShortcutIcon_Class/Art/UIApplicationShortcutIconShare@3x_2x.png)|


### アクションの定義例
```
<key>UIApplicationShortcutItems</key>
    <array>
        <dict>
            <key>UIApplicationShortcutItemIconType </key>
            <string> UIApplicationShortcutIconTypePlay </string>
            <key>UIApplicationShortcutItemTitle</key>
            <string>Play</string>
            <key>UIApplicationShortcutItemType</key>
            <string>com.sample.myapp.play</string>
            <key>UIApplicationShortcutItemUserInfo</key>
            <dict>
                <key>key1</key>
                <string>value1</string>
            </dict>
        </dict>
        <dict>
            <key>UIApplicationShortcutItemIconType</key>
            <string>UIApplicationShortcutIconTypeCompose</string>
            <key>UIApplicationShortcutItemTitle</key>
            <string>New Post</string>
            <key>UIApplicationShortcutItemType</key>
            <string>com.sample.myapp.post</string>
            <key>UIApplicationShortcutItemUserInfo</key>
            <dict>
                <key>key1</key>
                <string>value1</string>
            </dict>
        </dict>
    </array>
```

これで Quick Action が表示されるようになります。

## 動的アクション

UIMutableApplicationShortcutItem を生成して shortcutItems に array で渡します。生成時に指定する引数の内容は静的アクションとほぼ同じです。

```
            let shortcut = UIMutableApplicationShortcutItem(type: ShortcutIdentifier.WebView.type, localizedTitle: "ブラウザをひらく", localizedSubtitle: "", icon: UIApplicationShortcutIcon(type: .Play), userInfo: nil)
            UIApplication.sharedApplication().shortcutItems = [shortcut]

```

## Quick Action で起動された時に呼び出される関数

起動時は AppDelegate の下記関数が呼び出されますので shortcutItem に入っている値によって処理を分ければOKです。

```
application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void)
```


## もうちょっと詳しく

ここまでのメモで Quick Action の追加の仕方は分かったのですが、いざアクションを実行された時のハンドリングの仕方が分からなかったのでさらに調べてみました。

1. didFinishLaunchingWithOptions 呼び出し (アプリ起動していなかった場合)
1. performActionForShortcutItem 呼び出す(ここでアクションに従った処理)
1. applicationDidBecomeActive 呼び出し

の順で呼ばれるようです。


### アクション実行

上記の関数が呼ばれるだけなのでその中で処理を行います。処理を行ったかどうかを completionHandler に渡してあげる必要があります。分かりやすく処理を行う部分を関数化します。

```
@available(iOS 9.0, *)
func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void) {
	let handled = handleShortCutItem(shortcutItem)
 	completionHandler(handled)
}
```

実際に処理を行う関数はこちら。この例では shortcutImem に従って ViewController を表示しています。

```実際に処理を行う関数
func handleShortCutItem(shortcutItem: UIApplicationShortcutItem) -> Bool {
   var handled = false

   // ここで処理
   guard ShortcutIdentifier(fullType: shortcutItem.type) != nil else { return false }

   switch (shortCutType) {
   case ShortcutIdentifier.WebView.type:
       let storyBoard = UIStoryboard(name: "Main", bundle:nil)
       let vc = storyBoard.instantiateViewControllerWithIdentifier("WebView")                 
       window!.rootViewController?.presentViewController(vc, animated: true, completion: nil)
       handled = true
       break
   case ShortcutIdentifier.Blog.type:
       let storyBoard = UIStoryboard(name: "Main", bundle:nil)
       let vc = storyBoard.instantiateViewControllerWithIdentifier("BlogView")                 
       window!.rootViewController?.presentViewController(vc, animated: true, completion: nil)
       handled = true
       break
   default:
       break
   }
        
   return handled
}

```