# iOS9新特性之实现3D Touch就是So easy（更新Swift版）

语言：zh-CN
原文：[iOS9新特性之实现3D Touch就是So easy（更新Swift版）](<https://allluckly.cn/3d%20touch/3D-Touch>)
中文：[中文 HTML](<https://allluckly.cn/3d%20touch/3D-Touch>)
English: [English HTML](<https://allluckly.cn/en/journal/2015-10-19-ios-9-3d-touch-quick-actions-with-a-swift-update/>)
发布于: 2015-10-19T00:00:00+08:00
内容更新于: 2015-10-19T00:00:00+08:00
署名：[Bison](<https://allluckly.cn/about/>)

围绕 iOS 9 的主屏快捷操作，说明在 Info.plist 中配置图标、标题与类型，再由 AppDelegate 分发点击事件，并给出 Objective-C 与 Swift 两种写法。

原文署名 Bison，保留原发布时的内容。

**阅读前** 这是 2015–2017 年间的技术记录，本次整理未重新运行验证示例。原文面向 iOS 9 与 iPhone 6s 时代的 3D Touch 主屏快捷操作。

> "努力、努力、再努力，今天的付出，乃明天的收获" Bison

10月19号，周末，起床去吃早餐，吃完回来顺便去沃尔玛逛逛，把晚上的菜给买了，逛着逛着就来到了卖苹果手机的柜台，可能职业病吧，😄，随手玩了下最新出来的`iPhone6s`，看下它新出来的功能`3D Touch`，简单的使用了下挺难按出来的😓，貌似要找找手感，现在主流的`app` 已经支持此功能了，于是想实现下次功能的想法在脑海里挥之不去，最大的遗憾是只能在`iPhone6s`以上机型上使用，貌似其他手机可以通过越狱实现这一有趣的功能。题外话有点多了。。。。  
 下面我们进入正题：  
 在网上找了下资料，貌似很少的，只找到一篇简单介绍的  
 地址：http://www.jianshu.com/p/74fe6cbc542b

当然根据这篇文章的资料，很难做出这个有趣的功能，至少我是这么认为。  
 于是发挥出我那无敌于世的搜索功能，终于还是让我找到了突破点。  
 首先我们需要在`Info.plist`文件中加上一项

```css
<key>UIApplicationShortcutItems</key>
    <array>
        <dict>
            <key>UIApplicationShortcutItemIconType</key>
            <string>UIApplicationShortcutIconTypeShare</string>
            <key>UIApplicationShortcutItemTitle</key>
            <string>Share</string>
            <key>UIApplicationShortcutItemType</key>
            <string>-11.UITouchText.share</string>
        </dict>
    </array>
```

在此讲解下其中都是些神马意思  
 `UIApplicationShortcutItemIconType`触发`3D Touch`时显示的图标类型  
 `UIApplicationShortcutIconTypeShare`显示分享的图标  
 当然肯定还可以选择其他的一些图标，在此不一一列举，因为我也才上手，不怕您笑话咱。😄  
 `UIApplicationShortcutItemTitle`显示名字的  
 `UIApplicationShortcutItemType`相当于项目中的`Bundle Identifier`唯一的，  
 通过这个标示我们可以判断点相应的那一项触发相应的操作  
 可以多设置几个  
 到此`Info.plist`文件中我们已经设置完了，接下来我们应该咋整呢？  
 什么？问你们，你们居然不知道？？？  
 好吧，还是由我带领大家继续讲下一步该如何如何。。。  
 首先在我们`AppDelegate.m`中添加如下方法

### OC版

```css
- (void)application:(UIApplication *)application 
performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem
completionHandler:(void(^)(BOOL succeeded))completionHandler{

}
```

### Swift版

```css
func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void) {

}
```

关于这个方法是干嘛的？在此大家应该都清楚了吧？  
 对没错，就是用来处理我们这个`3D Touch`触发事件的  
 我的`Demo`是这么写的，具体如下：

### OC版

```css
- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void(^)(BOOL succeeded))completionHandler{
    //判断先前我们设置的唯一标识
    if([shortcutItem.type isEqualToString:@"-11.UITouchText.share"]){
        NSArray *arr = @[@"hello 3D Touch"];
        UIActivityViewController *vc = [[UIActivityViewController alloc]initWithActivityItems:arr applicationActivities:nil];
//设置当前的VC 为rootVC
        [self.window.rootViewController presentViewController:vc animated:YES completion:^{
            
        }];
    }
}
```

### Swift版

```css
func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void) {
        
        switch shortcutItem.type {
        case "-11.UITouchText.share":
let items = ["hello 3D Touch"]
                let activityVC = UIActivityViewController(
                activityItems: items,
                applicationActivities: nil)
                self.window?.rootViewController?.presentViewController(activityVC, animated: true, completion: { () -> Void in
                
            })
        default:
            break
        }
    }
```

相信在场很多同僚都和我一样屌丝，还来不及去买`iPhone6s`导致我们无法去测试是否成功，下面我来带你们去解决该问题，虽然无法让你自己看到运行后的效果，但是判断下是否成功还是可以做到的，方法如下

### OC版

```css
if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
        NSLog(@"你的手机支持3D Touch!");
    }
    else {
        NSLog(@"你的手机暂不支持3D Touch!");
    }
```

### Swift版

```css
if traitCollection.forceTouchCapability == UIForceTouchCapability.Available {

           NSLog(@"你的手机支持3D Touch!");
        }
        else {
            NSLog(@"你的手机暂不支持3D Touch!");
        }
```

效果图给大家鉴赏一下哦！😄  
 ![2](<https://allluckly.cn/images/blog/3dtouch.jpg>)

好文推荐：[Bison教你3分钟集成支付宝好友分享](<http://www.jianshu.com/p/05a3087cd796>)  
 技术交流群：511040024

版权归©Bison所有 未经允许不得转载。

