kitoko552.memo

kitoko552のメモ

Quick Actions (3D Touch Shortcuts)を実装する

iPhone6sから3D touchが導入されました。

f:id:kitoko552:20151013103020p:plain

ホーム画面のアプリアイコンを3D touchすることで、目的の操作画面でアプリを起動する操作をQuick Actions(または3D Touch Shortcuts)と言います。

f:id:kitoko552:20151016230251j:plain:w400

この記事では、このQuick Actionsの実装方法や注意事項などを簡潔に紹介していきます。

Quick Actions

Quick Actionsの実装方法には以下の2パターンあります。

  • plistにあらかじめ登録して実装する方法(Static Quick Actions)
  • コード上で動的に実装する方法(Dynamic Quick Actions)

それぞれの特徴を簡単に書くと以下のようになります。

Static Quick Actions
  • コード量が少なくて済む
  • ユーザーがアプリをインストールした直後から反映される
Dynamic Quick Actions
  • ユーザーやアプリの状態に応じてアクション(ショートカット)を自由にカスタマイズできる
  • 初期インストール直後は反映されない(一度起動しないといけない)

つまり、基本的には動的にアクションをカスタマイズさせたい場合はDynamic、そうでない場合はStaticで実装するといいでしょう。
併用もできますが、下の注意点にも書いてある通り、併用する場合はアクションの順番が変えられない点と、plistとコードの両方を使うと管理しづらい点の2点の理由で、個人的には動的に変えたいアクションがひとつでもあるなら全てDynamicで実装するのがいいと思います。

注意点

実装する際に知った注意点を紹介します。

  • アクションは4つまで
  • StaticとDynamicを併用して実装する場合、StaticのアクションのあとにDynamicのアクションが追加される(順番は変えられない)
  • Dynamicの場合は、アプリインストール直後は反映されない
  • アクションの順番は、ホームにおけるアプリアイコンの位置によって決まる(画面上にある場合は上から順、下にある場合は下から順)

イコン画

イコン画像はデフォルトで用意されているものを使うことも、カスタムアイコンをAsset catalogに追加して使うこともできます。
デフォルトで用意されているアイコンは以下の7種類です(以下画像 iOS - 3D Touch の Home Screen Quick Actions に対応する - Qiita より引用)。

f:id:kitoko552:20151013111615p:plain:w400

ざっくりと実装方法を紹介します。

Static Quick Actionsの実装方法

Static Quick Actionsは以下のようにinfo.plistに各アクションの情報をそれぞれ登録して実装します(以下画像 iOS Keys より引用)。

f:id:kitoko552:20151013114124p:plain

Key name Description
UIApplicationShortcutItemIconFile 自作アイコンを使用したい場合のasset catalogに追加した画像の名前
UIApplicationShortcutItemIconType デフォルトのアイコンを使用する場合のアイコンのタイプ
UIApplicationShortcutItemTitle アクションのタイトル
UIApplicationShortcutItemSubtitle アクションのサブタイトル
UIApplicationShortcutItemType アクションの識別子のようなもの
UIApplicationShortcutItemUserInfo 追加の情報

簡単に書きましたが、詳細は iOS Keys に書いてあります。

Dynamic Quick Actionsの実装方法

Dynamic Quick Actionsは、plistを一切使わずに実装します。
dynamicなので、設定したいときにアクションを設定することができます。
例えば、ユーザーがログイン/ログアウトする際にアクションを設定するといったことも可能です。
アクションは、UIApplicationShortcutItemクラスを用いて設定します。
簡潔に説明すると、UIApplicationShortcutItemのインスタンスをUIApplication.sharedApplication().shortcutItemsに代入することで設定することができます。

let first = UIApplicationShorcutItem(type: type, localizedTitle: localizedTitle, localizedSubtitle: localizedSubtitile, icon: icon, userInfo: userInfo)
let second = ...
UIApplication.sharedApplication().shortcutItems = [first, second]

UIApplication.sharedApplication().shortcutItemsに代入した順番でアクションが設定されます。

UIApplicationShorcutItemのイニシャライザの各引数は、上記に書いてあるStaticのものと同じです。
アイコンに関しては、UIApplicationShortcutIconクラスのインスタンスを使います。
イニシャライザが二つあるので、デフォルトのものを使う場合は上、カスタムアイコンを使う場合は下のイニシャライザを使います。

// デフォルトのものを使う場合
public convenience init(type: UIApplicationShortcutIconType)
// カスタムアイコンを使う場合
public convenience init(templateImageName: String)

他にもいろいろありますが、具体的なコードを書くと長くなってしまうので、UIApplicationShortcutItemの公式ドキュメント( UIApplicationShortcutItem Class Reference )を参照するといいでしょう。

アクション経由でのアプリ起動の分岐処理

アクション経由でアプリが起動すると、AppDelegateの下のメソッドが呼ばれます。

func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void) {
    // shortcutItem.typeを参照して分岐処理
}

このメソッドでshortcutItemのtypeを参照して、処理を分岐させます。
こちらは、Appleの公式サンプル( ApplicationShortcuts: Using UIApplicationShortcutItem )がわかりやすいです。
これはStatic/Dynamic共通の処理です。
ここで分岐処理を書かなければ、ただアプリが普通に起動するだけとなります。

結局

以下のリンクを一通り読めばわかります。