3D - Touch(一) 桌面

桌面3D - Touch

快捷静态操作(Quick actions)

需要在 info.plist中配置

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
<key>UIApplicationShortcutItems</key>
<array>
<dict>
<key>UIApplicationShortcutItemIconType</key>
<string>UIApplicationShortcutIconTypeShare</string>
<key>UIApplicationShortcutItemTitle</key>
<string>弹一弹</string>
<key>UIApplicationShortcutItemType</key>
<string>com.yuwubao.search</string>
</dict>
<dict>
<key>UIApplicationShortcutItemIconType</key>
<string>UIApplicationShortcutIconTypeShare</string>
<key>UIApplicationShortcutItemTitle</key>
<string>摇一摇</string>
<key>UIApplicationShortcutItemType</key>
<string>com.yuwubao.search</string>
</dict>
<dict>
<key>UIApplicationShortcutItemIconType</key>
<string>UIApplicationShortcutIconTypeShare</string>
<key>UIApplicationShortcutItemTitle</key>
<string>扫一扫</string>
<key>UIApplicationShortcutItemType</key>
<string>com.yuwubao.search</string>
</dict>
</array>

关于几个必须要填写的项:

  1. UIApplicationShortcutItemTitle: 表示要显示的标题。展示在你的quick action菜单中的action标题。如果标题一行无法显示并且你没有指定子标题那么它将显示两行。可以使用本地化(localised)。
  2. UIApplicationShortcutItemType: 作为UIApplicationShortcutItem的一部分发送给你的应用。可以依据不同的shortcut类型用于执行你的actions。命名规则为: com.公司名.app名.图标作用名

关于选填的项:

  1. UIApplicationShortcutItemIconType: 定义内置图标类型的字符串,可选类型列表可以查询这里
  2. UIApplicationShortcutItemSubtitle: 用户展示你的actions的子标题的字符串。它将显示在你的quick actions标题的下方。可以本地化。
  3. UIApplicationShortcutItemIconFile:一个指定Assets Catalog或者Bundle中的字符串。如果指定了此键,则系统会忽略UIApplicationShortcutItemIconType
  4. UIApplicationShortcutItemUserInfo:一个字典,包含你想要解析的其他信息。

第二步

在入口类文件(appDelegate)中

1
2
3
4
5
6
7
8
9
10
11
12
13
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

//检测版本
if UIDevice.current.systemVersion >= "9.0" {
let shortcutItem = launchOptions?[UIApplicationLaunchOptionsKey.shortcutItem] as? UIApplicationShortcutItem
if let shortcutItem = shortcutItem{
self.quickActionWithShortcutItem(shortcutItem: shortcutItem)
}

}

return true
}

还要实现另一个方法

1
2
3
4
5
//MARK: - 3D-Touch
func application(_ application: UIApplication, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) {
self.quickActionWithShortcutItem(shortcutItem: shortcutItem)
completionHandler(true)
}

由于代码的冗余 需要定义一个私有的方法 可以根据
localizedTitle 或者 type 来区别点击的是哪个。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private  func quickActionWithShortcutItem(shortcutItem: UIApplicationShortcutItem){
let nav = self.window?.rootViewController as? UINavigationController
if shortcutItem.localizedTitle == "弹一弹"{

}else if shortcutItem.localizedTitle == "摇一摇"{

let detailVC = UIStoryboard.init(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "detail") as! DetailViewController
nav!.pushViewController(detailVC, animated: true)

}else{

nav!.pushViewController(ThirdViewController(), animated: true)
}
}

到这里完全设置好了桌面图标的3D - Touch。 由于最近系统升级到了iOS10 桌面icon的3D - Touch 新增了widget。接下来就来时适配iOS10。

Extention

(更多信息移步到这里)(喵神博客)

Extensions不是独立的应用程序。Extensions必须依赖于一个host app,叫作宿主APP,同时他们的生命周期相互独立,并且可以互相触发事件。一个宿主APP可以包含多个Extensions。本篇文章主要是 Today Extention。创建方法 File->New->Target

QQ20160923-0@2x.png

工程中会多出这些文件

QQ20160923-1@2x.png

在MainInterface.storyboard中我们可以定制UI。

QQ20160923-3@2x.png

当我们想纯代码构建UI时,在上图显示的Info.plist中NSExtension需要将NSExtensionMainStoryboard删掉,解除与storyboard的关联

例子中用的storyboard构建UI。 当我们需要与APP通信时。需要用到 URL Shchemes。

首先给label添加手势

1
2
widgetLabel.addGestureRecognizer(UITapGestureRecognizer.init(target: self
, action: #selector(TodayViewController.widgetLabelAction)))
1
2
3
@objc private  func widgetLabelAction() -> Void {
extensionContext?.open(NSURL(string: "simple://finished") as! URL, completionHandler: nil)
}

设置URL Schemes

QQ20160923-4@2x.png

运行程序

IMG_0609.PNG

我们也可以在widget中添加自己的APP显示信息了