给app添加3Dtouch之QuickAction

head_image
特别简单!

给app添加3DTouch,quickAction

quickAction即重按app的启动按钮,弹出的快捷启动方式
通常分为两种, Static QuickAction和 Dynamic QuickAction,一般都只会用到Static QuickAction。
区别:

  • Static是写在info.list中,Dynamic是过代码动态生成的。
  • 因为Dynamic是代码动态生成的,所以app运行前是没有Dynamic QuickAction的。
  • Static的优先级是高于Dynamic的,而且QuickAction数量限制是4个,所以你如果添加了三个Static QuickAction,那就只能添加一个Dynamic QuickAction。

如何添加静态的quickAction

打开info.list编辑成如下。

源码为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<key>UIApplicationShortcutItems</key>
<array>
<dict>
<key>UIApplicationShortcutItemIconFile</key>
<string>search-icon</string>
<key>UIApplicationShortcutItemType</key>
<string>Search</string>
<key>UIApplicationShortcutItemTitle</key>
<string>查找</string>
<key>UIApplicationShortcutItemSubtitle</key>
<string></string>
<key>UIApplicationShortcutItemUserInfo</key>
<dict/>
</dict>
<dict>
<key>UIApplicationShortcutItemIconType</key>
<string>UIApplicationShortcutIconTypeAdd</string>
<key>UIApplicationShortcutItemSubtitle</key>
<string></string>
<key>UIApplicationShortcutItemTitle</key>
<string>添加</string>
<key>UIApplicationShortcutItemType</key>
<string>New</string>
<key>UIApplicationShortcutItemUserInfo</key>
<dict>
<key>password</key>
<string>123456</string>
<key>username</key>
<string>username</string>
</dict>
</dict>
</array>

安装测试,即可看到如图的效果,注意我这里用了一张search-icon的图片,你本地要是没有就会导致查找的icon为空

下面对这些选项做一下介绍

  1. UIApplicationShortcutItemIconType:
    非必需选项,使用系统自带的icon,比如如:UIApplicationShortcutIconTypeSearch,UIApplicationShortcutIconTypeAdd
  2. UIApplicationShortcutItemIconFile:
    非必需选项,使用自定义的icon,值为Images.xcassets中的图片文件名
  3. UIApplicationShortcutItemTitle:
    必填,这个不用多说,即为标题
  4. UIApplicationShortcutItemSubtitle:
    非必需选项,副标题
  5. UIApplicationShortcutItemType:
    必填,用于区分不同的action,进入app后,根据它做不同的操作
  6. UIApplicationShortcutItemUserInfo:
    非必需选项,用来加入传入的参数,

处理QuickAction

在AppDelegate中有一代理方法

1
2
3
4
5
func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void) {
//这里即为处理action的地点
//完成后调用completionHandler方法,我这里自定义一个handleAction方法,返回值为是否处理成功。
completionHandler(hanleAction(shortcutItem))
}

通过定义一个enum非常简单的实现handleAction方法

1
2
3
enum ShortCut: String{
case New, Search
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private func handleAction(shortcutItem: UIApplicationShortcutItem) -> Bool{
var result = false
let type = shortcutItem.type
if let shortCut = ShortCut.init(rawValue: type){
switch shortCut{
case .New:
print("call new")
result = true
case .Search:
print("call search")
result = true
}
}
return result
}

除了这种处理方式,还可以这样通过application(didFinishLaunchingWithOptions:)做处理
但是这种方式只会在第一次启动时执行,而且当两种方式同时存在的时候就会和上面的处理方式重复,因为这一种处理方式会在上一种之前执行,所以当你在这里处理完quickAction后return false,这样就不会重复第一种执行方式了。

1
2
3
4
5
6
7
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
if let shortcutItem = launchOptions?[UIApplicationLaunchOptionsShortcutItemKey] as? UIApplicationShortcutItem {
handleAction(shortcutItem)
return false
}
return true
}

添加动态的quickAction

添加Dynamic quickAction特别简单,代码几行就可以完成了

1
2
3
4
5
6
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
let shortCutItem1 = UIApplicationShortcutItem(type: "test3", localizedTitle: "dynamic 1", localizedSubtitle: "", icon: UIApplicationShortcutIcon(templateImageName: "qr"), userInfo: nil)
let shortCutItem2 = UIApplicationShortcutItem(type: "test4", localizedTitle: "dynamic 2", localizedSubtitle: "", icon: UIApplicationShortcutIcon(templateImageName: "qr"), userInfo: nil)
application.shortcutItems = [shortCutItem1, shortCutItem2]
return true
}

参数和static一样,效果图如下:

看添加3Dtouch的quickAction还是挺简单的。