3D Touch开发初体验

作者: 小全同学 | 来源:发表于2015-12-03 11:01 被阅读10282次

    3D Touch功能的开发难度并不大,但是由于该功能需要有硬件支持,并且在模拟器上无法体验,所以阻挡了一大批开发者的探索脚步。不过在计算机界从来没有能难倒程序员的问题,本文首先将介绍如何使用3D Touch的Home Screen Quick Actions功能,然后介绍如何在模拟器中使用3D Touch。

    3D Touch开发

    3D Touch功能概览

    3D Touch有三大模块:
    1、peek and pop

    类似于系统邮件、QQ这样的App,在消息列表页面按压某条邮件或会话,则会弹出这个邮件或会话的阅览,如果继续施加压力按压,则会弹出完整的邮件详情页面或会话对话框。如下图所示:

    用力按压消息列表,弹出会话概览 继续施加压力,弹出完整的对话框

    这种方式使用频度不高,所以在本文中不做技术介绍,本文主要介绍3D Touch的另一种使用方式:用力按压App图标,弹出App的快速入口,通过快速入口直接进入到想要的功能页面。

    2、Home Screen Quick Actions

    通过主屏幕的应用Icon,我们可以用3D Touch呼出一个菜单,进行快速定位应用功能模块相关功能的开发,。如微信、京东的App,本文也将重点介绍这项开发技术。

    微信的快速入口 京东的快速入口

    3、Force Properties

    iOS9为我们提供了一个新的交互参数:力度。我们可以检测某一交互的力度值,来做相应的交互处理。例如,我们可以通过力度来控制快进的快慢,音量增加的快慢等。

    Home Screen Quick Actions开发指南

    3D Touch快速入口标签有两种添加方式:一种是静态添加,在工程中的info.plist文件中添加相关项目。通过这种方式添加的标签,在app第一次运行前,就可以唤出这些标签;另一种是动态添加,通过代码给App添加快速入口。这种方式添加的标签,第一次运行App前是看不到这些标签的,必须先运行一次App,以后就可以唤出这些标签了。

    静态添加入口标签

    静态添加入口标签不需要写代码,只需要在info.plist文件中添加相关功能设置即可。不过因为没有语句提示,所以我们只能一个字母一个字母的去添加,这一点不是很友好。

    我们需要在info.plist中添加如下信息:

    info.plist中添加的内容

    分析一下添加的项目分别代表什么意思。

    首先是UIApplicationShortcutItems,他是一个数组类型,数组中的每一个元素表示一个入口标签。

    然后是Item0,这是数组中的一个元素,字典类型。在这个字典中配置各个标签的相关属性。

    字段名 功能 是否必须 备注
    UIApplicationShortcutItemType 这个键值设置一个快捷通道类型的字符串 必有项 我们可以监听该项的值来判断用户是从哪一个标签进入App的,该字段的值可以为空。
    UIApplicationShortcutItemTitle 这个键值设置标签的标题 必有项 我们可以监听该项的值来判断用户是从哪一个标签进入App的
    UIApplicationShortcutItemSubtitle 设置标签的副标题 可选项
    UIApplicationShortcutItemIconType 设置标签的图标样式,系统提供了29中样式的图标,但大部分只能在9.1的系统上使用,只有少数可以在9.0的系统中使用,这一部分会在后边详细介绍 可选项
    UIApplicationShortcutItemIconFile 设置自定义标签图片文件的路径 可选项
    UIApplicationShortcutItemUserInfo 设置用户信息,是一个字典类型,可以用来传值 可选项

    按照如上截图配置info.plist文件后,我们运行程序,然后按压icon,出现的是如下效果:

    静态添加的标签

    这是在UIApplicationShortcutItems中添加了一个Item的情况,只添加了一个标签,如果想添加多个静态标签,如法炮制出多个Item即可。

    动态添加入口标签

    这种方法需要我们写代码来添加,首先来认识三个类:

    类名 功能描述
    UIApplicationShortcutItem 创建标签的类
    UIMutableApplicationShortcutItem 创建可变标签的类
    UIApplicationShortcutIcon 创建标签ICON的类

    我们创建一个新工程,然后在工程中根视图的viewDidLoad方法中添加如下代码:

        // 创建标签的ICON图标。
        UIApplicationShortcutIcon *icon = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeAdd];
        // 创建一个标签,并配置相关属性。
        UIApplicationShortcutItem *item = [[UIApplicationShortcutItem alloc] initWithType:@"two" localizedTitle:@"么么哒" localizedSubtitle:@"爱你呦" icon:icon userInfo:nil];
        // 将标签添加进Application的shortcutItems中。
        [UIApplication sharedApplication].shortcutItems = @[item];
    

    上边的代码,第一步创建出标签的入口,这一步的配置与静态添加标签中的UIApplicationShortcutItemIconType目的一样。系统给我们提供了如下样式的标签:

    typedef NS_ENUM(NSInteger, UIApplicationShortcutIconType) {
        UIApplicationShortcutIconTypeCompose,
        UIApplicationShortcutIconTypePlay,
        UIApplicationShortcutIconTypePause,
        UIApplicationShortcutIconTypeAdd,
        UIApplicationShortcutIconTypeLocation,
        UIApplicationShortcutIconTypeSearch,
        UIApplicationShortcutIconTypeShare,
        UIApplicationShortcutIconTypeProhibit       NS_ENUM_AVAILABLE_IOS(9_1),
        UIApplicationShortcutIconTypeContact        NS_ENUM_AVAILABLE_IOS(9_1),
        UIApplicationShortcutIconTypeHome           NS_ENUM_AVAILABLE_IOS(9_1),
        UIApplicationShortcutIconTypeMarkLocation   NS_ENUM_AVAILABLE_IOS(9_1),
        UIApplicationShortcutIconTypeFavorite       NS_ENUM_AVAILABLE_IOS(9_1),
        UIApplicationShortcutIconTypeLove           NS_ENUM_AVAILABLE_IOS(9_1),
        UIApplicationShortcutIconTypeCloud          NS_ENUM_AVAILABLE_IOS(9_1),
        UIApplicationShortcutIconTypeInvitation     NS_ENUM_AVAILABLE_IOS(9_1),
        UIApplicationShortcutIconTypeConfirmation   NS_ENUM_AVAILABLE_IOS(9_1),
        UIApplicationShortcutIconTypeMail           NS_ENUM_AVAILABLE_IOS(9_1),
        UIApplicationShortcutIconTypeMessage        NS_ENUM_AVAILABLE_IOS(9_1),
        UIApplicationShortcutIconTypeDate           NS_ENUM_AVAILABLE_IOS(9_1),
        UIApplicationShortcutIconTypeTime           NS_ENUM_AVAILABLE_IOS(9_1),
        UIApplicationShortcutIconTypeCapturePhoto   NS_ENUM_AVAILABLE_IOS(9_1),
        UIApplicationShortcutIconTypeCaptureVideo   NS_ENUM_AVAILABLE_IOS(9_1),
        UIApplicationShortcutIconTypeTask           NS_ENUM_AVAILABLE_IOS(9_1),
        UIApplicationShortcutIconTypeTaskCompleted  NS_ENUM_AVAILABLE_IOS(9_1),
        UIApplicationShortcutIconTypeAlarm          NS_ENUM_AVAILABLE_IOS(9_1),
        UIApplicationShortcutIconTypeBookmark       NS_ENUM_AVAILABLE_IOS(9_1),
        UIApplicationShortcutIconTypeShuffle        NS_ENUM_AVAILABLE_IOS(9_1),
        UIApplicationShortcutIconTypeAudio          NS_ENUM_AVAILABLE_IOS(9_1),
        UIApplicationShortcutIconTypeUpdate         NS_ENUM_AVAILABLE_IOS(9_1)
    } NS_ENUM_AVAILABLE_IOS(9_0) __TVOS_PROHIBITED;
    

    如果系统图标不满足需求,可以使用+ (instancetype)iconWithTemplateImageName:(NSString *)templateImageName;添加自定义图片作为标签,需要注意的是:图片必须预先添加进bundle。

    第二步是创建一个标签,并进行相关配置,这一步与静态添加标签中的Item0一样,初始化中的相关设置和上边一模一样,不多啰嗦。

    第三步是将标签添加进pplication的shortcutItems中,如果想添加多个标签,可以创建多个UIApplicationShortcutItem对象,并加入数组中。

    添加完后,我们再次运行程序查看效果:

    动态添加标签后的效果

    检测App启动方式

    标签添加完成了,现在我们可以通过两种途径来启动App,一种是传统的点击icon图标启动App,另一种是通过按压icon唤起快速入口,通过快速入口进入App中指定的功能页面。我们要如何检测是从哪里进入App呢?

    iOS9在AppDelegated中提供了一个新方法:- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler,如果App是从快速入口启动的,则会执行这个方法。该方法的shortcutItem参数携带了从快速入口进入app时的标签参数。

    如果是从快速入口启动的App,我们可以判断shortcutItem.localizedTitle属性的值来判断是从哪一个标签进入的App。

    来一个需求:如果是从“点我”这个标签进来的,我们把页面背景颜色修改为黄色,如果是从“么么哒”这个标签进来的,我们讲页面背景颜色修改为红色。代码如下:

    // 程序在后台运行,或者从死亡被激活,从3d进来的页面
    - (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler {
        if ([shortcutItem.localizedTitle isEqualToString:@"点我"]) {
            self.window.rootViewController.view.backgroundColor = [UIColor yellowColor];
        } else if ([shortcutItem.localizedTitle isEqualToString:@"么么哒"]) {
            self.window.rootViewController.view.backgroundColor = [UIColor redColor];
        }
    }
    

    彩蛋:如何在模拟器中使用3D Touch功能?

    上边我们讲了这么多,还是需要在iphone6s中来验证效果。对于没有设备的同学们怎么办呢?我们可以安装一些插件,来让模拟器支持一下3D Touch中的Home Screen Quick Actions模块功能。

    首先我们需要在gitHub中下载一个插件,这个插件只能安装在Xcode7中。地址在这里:https://github.com/DeskConnect/SBShortcutMenuSimulator

    剩下的按照这个页面的指引操作就可以了。为了照顾一下懒得看英文的同学,在这里我把操作步骤列举出来。

    插件安装篇

    1、 在终端中输入命令git clone https://github.com/DeskConnect/SBShortcutMenuSimulator.git克隆该插件到本地。

    克隆插件

    2、 继续输入命令cd SBShortcutMenuSimulator进入插件所在文件夹

    3、输入命令make安装插件

    安装插件

    插件使用篇

    1、输入命令xcrun simctl spawn booted launchctl debug system/com.apple.SpringBoard --environment DYLD_INSERT_LIBRARIES=$PWD/SBShortcutMenuSimulator.dylibxcrun simctl spawn booted launchctl stop com.apple.SpringBoard启动插件

    2、输入命令来唤起某个App的Home Screen Quick Actions功能:echo 'com.apple.mobilecal' | nc 127.0.0.1 8000。其中的com.apple.mobilecal是你的bundle id。命令执行效果如下:

    命令执行效果

    我们把bundle id换为我们刚刚写的工程的ID,测试一下echo 'quanzheng.-DTouchDemo' | nc 127.0.0.1 8000

    真棒!大功告成!!

    相关文章

      网友评论

      • 广州_虾:你好~我想请问一下,上线后会自动添加一个分享的touch,我看到其他APP分享都是排在最后。。。怎么我的分享排在了第一。。。是有什么地方要设置吗。。。
      • 7d3767931b84:如果程序被杀死了, 快速入口就不好使了, 怎么破
      • 迎风尿三丈:怎么样程序在后台的时候点击3dTouch出来的按钮不进入程序?
      • L了个Y:楼主90分
      • 6f23ef709782:静态方式可以;动态的不行,每次都是 “Terminating since there is no system app. ” 控制台打印这个信息,3D Touch功能没有出来。 求解大神
      • 小如99:为什么我的图片是在左边呢?
        小如99:@小全同学 哈哈,知道啦,刚刚换了下位置就好了,感谢~ :kissing_heart:
        小全同学:@小小如 这个方向取决于app在桌面上的位置
      • xxxixxxx:详细! :+1:
      • 3ef3b64b75d7:业界良心
      • 沐雨立:请问,我做的3DTouch功能,当程序没有被杀死的时候是可以进入想要的界面,当程序是杀死状态,就只能进到主界面,进不到我想要的界面。。。怎么 回事呢?
        mian小爬:@SapientiaWind 从快捷入口不走didFinishLaunching?
        SapientiaWind:@Yancy_90 需要在didFinishLaunching处理UIApplicationShortcutItem *shortcutItem = [launchOptions valueForKey:UIApplicationLaunchOptionsShortcutItemKey];获取对应的key
        Yancy_90:@沐雨立 是需要在didFinishLaunching方法里面处理吗?
      • 0x0F:别用模拟器了,我真机都按不好 :joy:
      • SapientiaWind:不知道你们有没有遇到如果程序处于杀死状态 使用forceTouch进入会闪退?
        mian小爬:遇到了,怎么解决?
        SapientiaWind:..额,我的是launchOptions的问题,launchOptions为nil
        麦子_KB:@丨执笔写爱 遇到了,请问你怎么解决的?
      • 沐雨立:我在echo 'com.apple.mobilecal' | nc 127.0.0.1 8000这一步的时候 springBoard会意外退出怎么办啊?
        小全同学:@沐雨立 模拟器升级了,但是插件还没有新版本的,所以现在模拟器上暂时用不了了
      • 烟影很美:怎么把icon放在右侧, 求解
        烟影很美:@八月BLUE 恩恩, 谢谢, 已经发现了
        八月BLUE:@D丶Seven 屏幕每页有4列app图标,左边2列的3d菜单icon在左边,右边2列的就在右边了
      • 69662402cbe0: :dizzy_face: 模拟器上怎么都实现不了,直接就是spring停止工作 然后echo没有反应
        小全同学:@沐雨立 模拟器升级了,但是插件还没有新版本的,所以现在模拟器上暂时用不了了
        沐雨立:@麻辣鱼嘴 我也是echo 没反应
      • 814caae8520c:直观明白!
      • 我叫巴图图:软件内部怎么实现呢?
        小全同学:@我叫巴图图 检测压力屏幕的变化曲度,把电信号转化为数字信号,就能捕捉到压力了
      • DEVIL6666:牛逼
      • FighterRay27:插件赞一个
      • 南坞觉:6666666
      • koreadragon:全哥V5.mark一下

      本文标题:3D Touch开发初体验

      本文链接:https://www.haomeiwen.com/subject/facshttx.html