iOS 9から追加された3D Touch shortcutsを実装してみる

# 3D Touch shortcutsとは

ホーム画面のアイコンをForce Touch（強めに押す）ことで、下図のようなショートカットメニューを表示することができます。<i>Home screen dynamic quick action</i> とも呼ばれるそうです。

![image](https://qiita-image-store.s3.amazonaws.com/0/8292/05b57f4d-fcfd-f391-1e4e-a583f30a0359.png)
（[Appleのサイト](http://www.apple.com/jp/iphone-6s/3d-touch/)より引用）

各項目には、それぞれタップされた際のアクションを割り当てることが可能です。

# 実装方法

3D Touch shortcuts の実装方法には、予め項目を設定しておく <b>Static Quick Actions</b> と、コード上で動的に割り当てる <b>Dynamic Quick Actions</b> の二通りの方法があります。 

## Static Quick Actions

予め `Info.plist` ファイルにメニューの項目を定義しておく方法です。

```
	<key>UIApplicationShortcutItems</key>
	<array>
		<dict>
			<key>UIApplicationShortcutItemIconType</key>
			<string>UIApplicationShortcutIconTypeSearch</string>
			<key>UIApplicationShortcutItemSubtitle</key>
			<string>shortcutSubtitle1</string>
			<key>UIApplicationShortcutItemTitle</key>
			<string>shortcutTitle1</string>
			<key>UIApplicationShortcutItemType</key>
			<string>$(PRODUCT_BUNDLE_IDENTIFIER).First</string>
            <key>UIApplicationShortcutItemUserInfo</key>
            <dict>
                <key>firstShorcutKey1</key>
                <string>firstShortcutKeyValue1</string>
            </dict>
		</dict>
		<dict>
			<key>UIApplicationShortcutItemIconType</key>
			<string>UIApplicationShortcutIconTypeShare</string>
			<key>UIApplicationShortcutItemSubtitle</key>
			<string>shortcutSubtitle2</string>
			<key>UIApplicationShortcutItemTitle</key>
			<string>shortcutTitle2</string>
			<key>UIApplicationShortcutItemType</key>
			<string>$(PRODUCT_BUNDLE_IDENTIFIER).Second</string>
            <key>UIApplicationShortcutItemUserInfo</key>
            <dict>
                <key>secondShortcutKey1</key>
                <string>secondShortcutValue1</string>
            </dict>
		</dict>
	</array>
```

各メニューに表示するタイトル、アイコンや、タップされた際にアプリ側に送信するUserInfo（Dictionary）などを設定します。

各項目の意味は[こちら](https://developer.apple.com/library/prerelease/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/iPhoneOSKeys.html#//apple_ref/doc/uid/TP40009252-SW36)にまとめられています。


## Dynamic Quick Actions

コード上で項目を追加する方法です。

```swift
// Construct the items.
let shortcut1 = UIMutableApplicationShortcutItem(type: ShortcutIdentifier.Third.type, localizedTitle: "Play", localizedSubtitle: "Will Play an item", icon: UIApplicationShortcutIcon(type: .Play), userInfo: [
        AppDelegate.applicationShortcutUserInfoIconKey: UIApplicationShortcutIconType.Play.rawValue
    ]
)

let shortcut2 = UIMutableApplicationShortcutItem(type: ShortcutIdentifier.Fourth.type, localizedTitle: "Pause", localizedSubtitle: "Will Pause an item", icon: UIApplicationShortcutIcon(type: .Pause), userInfo: [
        AppDelegate.applicationShortcutUserInfoIconKey: UIApplicationShortcutIconType.Pause.rawValue
    ]
)

// Update the application providing the initial 'dynamic' shortcut items.
application.shortcutItems = [shortcut1, shortcut2]
```

メニュー項目 `UIMutableApplicationShortcutItem` の配列を作り、UIApplication オブジェクトの `shortcutItems` プロパティにセットします。

ユーザにメニューをカスタマイズさせたい場合は、こちらの Dynamic Quick Actions を使ったほうが良さそうですね。

## 起動時に呼ばれるデリゲート

ホーム画面からショートカットメニューが選択され、アプリが起動すると `application:performActionForShortcutItem:completionHandler:` メソッドが呼ばれます。この中に必要な処理を実装します。


```
func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: Bool -> Void) {
    // Do something
    let succeeded = ...
        
    completionHandler(succeeded)
}
```

処理が完了したら、結果（Bool）を `completionHandler` に伝えてあげます。

# サンプルコード

こちらに置いておきました。

https://github.com/koogawa/3DTouchShortcutsSample

![screenshot.jpg](https://qiita-image-store.s3.amazonaws.com/0/8292/d97ddf1d-48ab-5bdb-40c3-99e7dbc961a6.jpeg)


# リンク

* [UIApplicationShortcutItem Class Reference](https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIApplicationShortcutItem_class/index.html#//apple_ref/doc/uid/TP40016501-CH1-SW8)
* [ApplicationShortcuts: Using UIApplicationShortcutItem](https://developer.apple.com/library/prerelease/ios/samplecode/ApplicationShortcuts/Introduction/Intro.html#//apple_ref/doc/uid/TP40016545) - 公式サンプルコード