69
65

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2015-09-26

Home Screen Quick Action

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

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

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
UIApplicationShortcutIconTypePlay
UIApplicationShortcutIconTypePause
UIApplicationShortcutIconTypeAdd
UIApplicationShortcutIconTypeLocation
UIApplicationShortcutIconTypeSearch
UIApplicationShortcutIconTypeShare

アクションの定義例

<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 呼び出し (アプリ起動していなかった場合)
  2. performActionForShortcutItem 呼び出す(ここでアクションに従った処理)
  3. 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
}

69
65
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
69
65

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?