iOS 3D Touch: How to add quick actions

Recently Apple has provided new technology 3D Touch for iPhone 6S and 6S Plus. Which contains 3 new features for your applications.

Quick Actions

Quick Actions let users do the things they do most often, faster and in fewer steps. Many of these actions can even be done with a single press, right from the Home screen.

Quick Actions

Peek and Pop

Let your users preview all kinds of content and even act on it — without having to actually open it. Users can then press a little deeper to Pop into content in your app.

Peek and Pop

Pressure Sensitivity

Creative apps can take advantage of the pressure-sensing display of iPhone 6 sand iPhone 6s Plus in many ways. For example, they can vary line thickness or give a brush a changing style.

Pressure Sensitivity

More information you can of course found on Apple website. Guides, tutorials, examples, etc.

I would like to tell about Quick Actions, how to implement in application. Actions can be static or dynamic. Let’s start.

First of all, we need to add UIApplicationShortcutItems to Info.plist. Each child item should be a dictionary and must have at least these required keys:

UIApplicationShortcutItemType: a string which is sent to your application as a part of UIApplicationShortcutItem. It can be used in code to handle actions for different shortcut types.

UIApplicationShortcutItemTitle: a title of your action. Can be localized.

And there are optional keys:

UIApplicationShortcutItemSubtitle: a subtitle of your action. Also can be localized.

UIApplicationShortcutItemIconType: an optional string which defines built-in icon type:

enum UIApplicationShortcutIconType : Int {
case Compose
case Play
case Pause
case Add
case Location
case Search
case Share
case Prohibit
case Contact
case Home
case MarkLocation
case Favorite
case Love
case Cloud
case Invitation
case Confirmation
case Mail
case Message
case Date
case Time
case CapturePhoto
case CaptureVideo
case Task
case TaskCompleted
case Alarm
case Bookmark
case Shuffle
case Audio
case Update
}

UIApplicationShortcutItemIconFile: an optional string specifying an image from Assets Catalog or from the Bundle.

UIApplicationShortcutItemUserInfo: an optional dictionary of additional user information.

Let’s try. Please add the next data to Info.plist:

<key>UIApplicationShortcutItems</key>
<array>
<dict>
<key>UIApplicationShortcutItemIconType</key>
<string>UIApplicationShortcutIconTypeShare</string>
<key>UIApplicationShortcutItemTitle</key>
<string>SHORTCUT_TITLE_SHARE</string>
<key>UIApplicationShortcutItemType</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER).Share</string>
</dict>
<dict>
<key>UIApplicationShortcutItemIconType</key>
<string>UIApplicationShortcutIconTypeAdd</string>
<key>UIApplicationShortcutItemTitle</key>
<string>SHORTCUT_TITLE_ADD</string>
<key>UIApplicationShortcutItemType</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER).Add</string>
</dict>
</array>

Also create InfoPlist.strings:

"SHORTCUT_TITLE_SEARCH" = "Search";
"SHORTCUT_TITLE_FAVORITES" = "Favorites";

And what we got:

Let’s implement handling of shortcuts. We need to create the next enumeration:

enum ShortcutIdentifier: String {
case Share
case Add

init?(fullType: String) {
guard let last = fullType.componentsSeparatedByString(".").last else { return nil }
self.init(rawValue: last)
}

var type: String {
return NSBundle.mainBundle().bundleIdentifier! + ".\(self.rawValue)"
}
}

And method for handling UIApplicationShortcutItem. For example:

func handleShortCutItem(shortcutItem: UIApplicationShortcutItem) -> Bool {
var handled = false

// Verify that the provided `shortcutItem`'s `type` is one handled by the application.
guard ShortcutIdentifier(fullType: shortcutItem.type) != nil else { return false }
guard let shortCutType = shortcutItem.type as String? else { return false }
switch (shortCutType) {
case ShortcutIdentifier.Share.type:
// Handle shortcut 1 (static).
handled = true
break
case ShortcutIdentifier.Add.type:
// Handle shortcut 2 (static).
handled = true
break
default:
break
}
// Construct an alert using the details of the shortcut used to open the application.
let alertController = UIAlertController(title: "Shortcut Handled", message: "\"\(shortcutItem.localizedTitle)\"", preferredStyle: .Alert)
let okAction = UIAlertAction(title: "OK", style: .Default, handler: nil)
alertController.addAction(okAction)
// Display an alert indicating the shortcut selected from the home screen.
window!.rootViewController?.presentViewController(alertController, animated: true, completion: nil)

return handled
}

And finally we need call this method in the next AppDelegate situations:

func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: Bool -> Void) {
let handledShortCutItem = handleShortCutItem(shortcutItem)
completionHandler(handledShortCutItem)
}

And in applicationDidBecomeActive:

func applicationDidBecomeActive(application: UIApplication) {
guard let shortcut = launchedShortcutItem else { return }
handleShortCutItem(shortcut)
launchedShortcutItem = nil
}

That’s all. How to work with dynamic items, you can see in official Apple example, there is not present any difficulties. The full source code of this example you can download from GitHub.

Happy coding!

NOTE: If you don’t have real iPhone 6 or iPhone 6 Plus, you can test on simulator with helping this.

Like what you read? Give Maxim Bilan a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.