しょぼしょぼプログラマ雑記

自分のための備忘録。 開発記録など掲載してます。 質問・ご意見・ご感想等はTwitter ( https://twitter.com/yun_hokuto ) までお気軽にどうぞ。

3D Touch(Force Touch)でアプリにショートカットを作る

iPhone6sが発売になりましたね

もうみなさん手に入れられましたでしょうか?

かく言う自分も先日、iPhone5からようやくiPhone6sに変更しました

そしてiPhone6sの目玉である「3D Touch(Force Touche)」は革新的でした

Appleは常に新しいユーザー体験をさせてくれるので好きです

そこで、今回は自分のアプリにショートカットを作成する方法を記載したいと思います


ショートカットの作り方

まずは「動的に」ショートカットを作成する方法です

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    // ショートカットを作成
    UIApplicationShortcutIcon *iconCustom = [UIApplicationShortcutIcon iconWithTemplateImageName:@"CircleR"];
    UIApplicationShortcutItem *item1 = [[UIApplicationShortcutItem alloc] initWithType:@"ITEM_1"
                                                                        localizedTitle:@"item1"
                                                                     localizedSubtitle:@"あいうえおかきくけこさしす"
                                                                                  icon:iconCustom
                                                                              userInfo:nil];

    UIApplicationShortcutItem *item2 = [[UIApplicationShortcutItem alloc] initWithType:@"ITEM_2" localizedTitle:@"item2"];
    NSArray *shortcutItems = @[item1, item2];

    // ショートカットを登録(静的ショートカットと共存)
    [[UIApplication sharedApplication] setShortcutItems:shortcutItems];
    
    return YES;
}

続いて、「静的に」ショートカットを作成する方法ですが、こちらは公式にも記載されている通り、info.plist に特定の項目を作成すれば完成です

<key>UIApplicationShortcutItems</key>
<array>
    <dict>
        <key>UIApplicationShortcutItemIconFile</key>
        <string></string>
        <key>UIApplicationShortcutItemTitle</key>
        <string>DefItem1</string>
        <key>UIApplicationShortcutItemType</key>
        <string>DEF_ITEM_1</string>
    </dict>
    <dict>
        <key>UIApplicationShortcutItemType</key>
        <string>DEF_ITEM_2</string>
        <key>UIApplicationShortcutItemTitle</key>
        <string>DefItem2</string>
        <key>UIApplicationShortcutItemIconFile</key>
        <string>CirlcleB</string>
    </dict>
</array>

※ UIApplicationShortcutItemIconFileにはImageSetの名称を設定
※※ UIApplicationShortcutItemIconFileが未作成or未設定の場合、アイコンなし

info.plistに設定する値等の公式ページのURLは下記のとおりです

developer.apple.com

これでショートカットが作成されます

また、ここまでで自分が把握している情報も下記に記載しておきます

  • IconFileは35x35(px)の透過PNGを使用(@2xと@3xも用意)
  • 用意するアイコンは単色(カラーにしても黒く塗りつぶされる)
  • 「写真」や「Podcast」などのサムネイルを表示するメソッドは発見できず(非公開メソッド?)
  • アイコンはデフォルトで7つ(Add、Compose、Location、Pause、Play、Search、Share)が用意されている

ショートカットからのデリゲート

続いて、ショートカットが押された際のイベントはこちらです

AppDelegate.m


-(void)application:(UIApplication *)application
performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem
 completionHandler:(void (^)(BOOL))completionHandler
{
    if([shortcutItem.type compare:@"ITEM_1"] == NSOrderedSame) {
        NSLog(@"shortcut item1 select");
    } else if([shortcutItem.type compare:@"ITEM_2"] == NSOrderedSame) {
        NSLog(@"shortcut item2 select");
    }
}

iOS9から追加された「application:performActionForShortcutItem」を使用することで、ショートカットイベントが受け取れます

あとは、自分のアプリに対してのアクションを記述していけばいいかなと思います。

ここでも、現時点で自分が理解している情報を掲載しておきます。

  • アプリがタスクにない場合、「application:didFinishLaunchingWithOptions」と「applicationDidBecomeActive」の間で呼ばれる
  • アプリがタスクにある場合、「applicationWillEnterForeground」と「applicationDidBecomeActive」の間で呼ばれる

ただ、今回はtypeで設定しましたが、本来はuserinfoの方が良いかもしれません (typeは別のものを設定する気がする・・・)

最後に、資料と参考にさせていただいた方のWebページへのリンクも記載しておきます

[Apple 公式資料] https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/Adopting3DTouchOniPhone/

[Qiita] qiita.com