Xcode7GMから使える3DTouchのショートカット概要まとめ


## はじめに
Xcode7 GM版からUIApplicationShortcutItemが使えるようになりました。

![スクリーンショット_2015-09-15_23_51_54.png](https://qiita-image-store.s3.amazonaws.com/0/75257/85c632cd-3f7e-eeb8-abd4-92c42a814285.png "スクリーンショット_2015-09-15_23_51_54.png")
こんなやつのことです。（引用：[Apple公式サイト](http://www.apple.com/jp/iphone-6s/3d-touch/)）

iPhone6s/6sPlusでは3DTouchという感圧タッチができるようになっています。
その仕組みを使ったショートカットです。

## Quick Actionとは
このショートカット機能のことをAppleはQuick Actionと呼んでいます。
リファレンスにはこう書いてあります。

[UIApplicationShortcutItem Class Reference](https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIApplicationShortcutItem_class/index.html)
> On a device that supports 3D Touch, a user invokes the quick action by pressing your app's icon on the Home screen and then selecting the quick action’s title. Your app delegate receives and handles the quick action.

3D Touchをサポートしてる端末だと、ホーム画面でアプリアイコンをプレスするとQuick Actionが起動するよ。Quick Actionのタイトルが選択されたらAppDelegateでハンドリングできるよ。

概要はこんなところですね。
絵を見れば一発で想像出来ると思います。

## Quick Actionは2種類
リファレンス（[UIApplicationShortcutItem Class Reference](https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIApplicationShortcutItem_class/index.html)）の
Dynamic vs. Static Quick Actions項目についてです。

### 動的クイックアクション（Dynamic Quick Action）
> Define Home screen dynamic quick actions using this class. Your code creates dynamic quick actions, and registers them with your app object, at runtime.

Dynamicの場合はコード上でItemを登録していきます。
つまりインストールだけしてアプリを起動しなければ
Quick Actionは出現しないということではないかと思います。
at runtime、実行時にオブジェクトが登録されると書いてあります。

### 静的クイックアクション（Static Quick Action）
> Define Home screen static quick actions in the UIApplicationShortcutItems array in your Xcode project’s Info.plist file, as described in the iOS Keys chapter in Information Property List Key Reference. The system registers your static quick actions when your app is installed.

Staticの場合はInfo.plistに記述します。
つまりインストールした時からQuick Actionが使えると書いてあります。
Info.plistの記述に関しては[コレ](https://developer.apple.com/library/prerelease/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/iPhoneOSKeys.html#//apple_ref/doc/uid/TP40009252-SW36)を見てねとも書いてありますね。

## AppDelegateでQuick Actionをハンドリング
選択されたQuick Actionをハンドリングするには
UIApplicationDelegate Protocolでメソッドを実装します。

```swift:UIApplicationDelegate(Swift)
optional func application(_ application: UIApplication,
performActionForShortcutItem shortcutItem: UIApplicationShortcutItem,
    completionHandler completionHandler: (Bool) -> Void)
```

```objc:UIApplicationDelegate(obj-c)
- (void)application:(UIApplication *)application
performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem
  completionHandler:(void (^)(BOOL succeeded))completionHandler
```

このメソッドを実装することで
Quick Action（UIApplicationShortcutItem）をハンドリングして
アプリの機能へ遷移させるなど出来るようです。
[UIApplicationDelegate Protocol Reference](https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIApplicationDelegate_Protocol/index.html#//apple_ref/occ/intfm/UIApplicationDelegate/application:performActionForShortcutItem:completionHandler:)

## Simulatorは3DTouchに非対応
残念ながらiPhone6s/6sPlusのSimulatorでも3DTouchが出来ないようです。
> With Xcode 7.0 you must develop on a device that supports 3D Touch. Simulator in Xcode 7.0 does not support 3D Touch.

[Adopting 3D Touch on iPhone](https://developer.apple.com/library/prerelease/ios/documentation/UserExperience/Conceptual/Adopting3DTouchOniPhone/)

端末を買えってことなんですよね。買いますよ。買いますとも。

## おわりに
ある程度実装ができたらコードを載せようと思っていましたが、
端末が発売されるまで確認が出来ないみたいなので、とりあえず概要だけ投稿しました。

翻訳間違ってるぞ、認識間違ってるぞなどありましたらコメントください。

## 関連リファレンス一覧
[UIApplicationShortcutItem Class Reference](https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIApplicationShortcutItem_class/index.html)

[Information Property List Key Reference(UIApplicationShortcutItems)](https://developer.apple.com/library/prerelease/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/iPhoneOSKeys.html#//apple_ref/doc/uid/TP40009252-SW36)

[UIApplicationDelegate Protocol Reference](https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIApplicationDelegate_Protocol/index.html#//apple_ref/occ/intfm/UIApplicationDelegate/application:performActionForShortcutItem:completionHandler:)

[Adopting 3D Touch on iPhone](https://developer.apple.com/library/prerelease/ios/documentation/UserExperience/Conceptual/Adopting3DTouchOniPhone/)

[ApplicationShortcuts: Using UIApplicationShortcutItem](https://developer.apple.com/library/prerelease/ios/samplecode/ApplicationShortcuts/Introduction/Intro.html)