3D Touch开发初体验

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

真棒!大功告成!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • 3D Touch功能的开发难度并不大,但是由于该功能需要有硬件支持,并且在模拟器上无法体验,所以阻挡了一大批开发者...
    LeafRead阅读 656评论 0 3
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • 减肥似乎是每个女生都在讨论的事情,体重下降5斤,相信每个女生都不反对。有想法的人虽然很多,真正能够做得到、实现目标...
    路上的幸福_影阅读 567评论 5 6
  • 霄哥是高二的时候转来我们班级的。 穿着土气,没有QQ。脚上穿的是门口地摊买的盗版回力板鞋,两双轮换,不论冬夏。一件...
    郑关西阅读 552评论 0 1
  • 本文参与#漫步青春#征文活动,作者:姚国靖,本人承诺,文章内容为原创,且未在其他平台发布。 看到美丽的流星划过星空...
    漠视你阅读 496评论 0 0