日常收录

iOS-3DTouch学习一:添加主屏快速操作(Add Home

2018-09-14  本文已影响289人  yuyangkk

1 概述

3D Touch,是在iOS9.0之后推出的一项快速访问应用功能的一项技术。在支持3D Touch的设备(iPhone 6s及以后的机型)上,用户使用比触摸和保持所需的更多压力按下应用程序的图标,以唤起主屏幕快速操作,从而可以使用主屏幕快速操作来访问应用中常用的功能。
注意:如果应用程序未做任何3D Touch 快速操作项目,上架到App Store后貌似会自动添加一个分享的操作。
官方开发文档

2 应用场景

我们使用3D Touch主要有两个应用场景:

  1. 在屏幕快速访问App内某些功能,如扫码、拍照等功能。本篇主要讲述在主屏幕上添加3D Touch操作的实现。简易OC版本Demo地址官方swift版本地址
  2. 在应用内实现实现一些功能,如预览等功能。传送门

3 定义主屏幕3D Touch操作

3D Touch快速操作,可以使用两种定义方式:

3.1 构建时静态定义(Define Static Quick Actions)

如果3D Touch操作对于你的应用是不变的,那么你可以定义为静态快速操作,具体步骤就是在info.plist文件中添加keyUIApplicationShortcutItems,类型为Array。每个item都是一个UIApplicationShortcutItem

UIApplicationShortcutItems 官方说法翻译:
UIApplicationShortcutItems(Array - iOS)指定应用程序的静态主屏幕快速操作。该键包含一系列字典。每个字典都包含有关单个快速操作及其使用方式的详细信息。
我们可以将应用程序的静态快速操作指定为字典数组。当用户在支持3D Touch的设备上按主屏幕图标时,主屏幕上显示的应用程序快速操作数量由系统决定。
我们在Info.plist文件中定义的静态快速操作将显示在主屏幕上,其顺序与文件中显示的顺序相同。系统首先使用静态快速操作填充主屏幕快速操作集,并且仅当有可用的其他插槽时,它还会显示已定义的动态快速操作。

以下代码和屏幕截图显示了Xcode属性列表编辑器中两个静态快速操作的示例定义:

<key>UIApplicationShortcutItems</key>
<array>
    <dict>
        <key>UIApplicationShortcutItemType</key>
        <string>SearchAction</string>
        <key>UIApplicationShortcutItemIconType</key>
        <string>UIApplicationShortcutIconTypeSearch</string>
        <key>UIApplicationShortcutItemTitle</key>
        <string>Search</string>
        <key>UIApplicationShortcutItemSubtitle</key>
        <string>Search for an item</string>
        <key>UIApplicationShortcutItemUserInfo</key>
            <dict>
              <key>key1</key>
              <string>value1</string>
             </dict>
    </dict>
    <dict>
        <key>UIApplicationShortcutItemType</key>
        <string>ShareAction</string>
        <key>UIApplicationShortcutItemIconType</key>
        <string>UIApplicationShortcutIconTypeShare</string>
        <key>UIApplicationShortcutItemTitle</key>
        <string>Share</string>
        <key>UIApplicationShortcutItemSubtitle</key>
        <string>Share an item</string>
        <key>UIApplicationShortcutItemUserInfo</key>
            <dict>
              <key>key2</key>
              <string>value2</string>
        </dict>
    </dict>
</array>
image.png.png

其中各个关键字释义如下:
UIApplicationShortcutItemType: 快捷可选项的标志类型的字符串(必填)
UIApplicationShortcutItemTitle: 快捷可选项的标题(必填)
UIApplicationShortcutItemSubtitle: 快捷可选项的子标题(可选)
UIApplicationShortcutItemIconType: 快捷可选项的图标(可选)
UIApplicationShortcutItemIconFile: 快捷可选项的自定义图标(可选)
UIApplicationShortcutItemUserInfo: 快捷可选项的附加信息,比如通过点击某个快速操作,进行传值(可选)

注意:UIApplicationShortcutItemType键对应的类型值会在用户点击了其中一个ShortcutItem时返回,也就是我们可以使用这个字符串来确定当前用户点击的是什么类型的ShortcutItem,而UIApplicationShortcutItemUserInfo我们可以获取点击快速操作传递过来的值。

3.2 运行时动态定义(Define Static Quick Actions)

iOS9.0之后,UIApplication添加了一个分类,分类中有一个属性shortcutItems,我们可以通过设置这个属性,对3D Touch所对应的操作进行配置。具体的时机,可以是程序由前台退到后台时,也可以在程序启动时,自己把握。可操作个数无需控制,系统会自己处理显示的数据,不过我们也不应该添加的太多,毕竟多了不显示也是没用。

  @class UIApplicationShortcutItem;
  @interface UIApplication (UIShortcutItems)
  // Register shortcuts to display on the home screen, or retrieve currently registered shortcuts.
  @property (nullable, nonatomic, copy) NSArray<UIApplicationShortcutItem   *> *shortcutItems NS_AVAILABLE_IOS(9_0) __TVOS_PROHIBITED;
@end

说到动态添加,就不得不说一下UIApplicationShortcutItem这个类了,这个类为我们提供了代码创建的方式,我们看一下这个类的官方定义:

NS_CLASS_AVAILABLE_IOS(9_0) __TVOS_PROHIBITED
@interface UIApplicationShortcutItem : NSObject <NSCopying, NSMutableCopying>

- (instancetype)init NS_UNAVAILABLE;
- (instancetype)initWithType:(NSString *)type localizedTitle:(NSString *)localizedTitle localizedSubtitle:(nullable NSString *)localizedSubtitle icon:(nullable UIApplicationShortcutIcon *)icon userInfo:(nullable NSDictionary *)userInfo NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithType:(NSString *)type localizedTitle:(NSString *)localizedTitle;

// An application-specific string that identifies the type of action to perform.
@property (nonatomic, copy, readonly) NSString *type;

// Properties controlling how the item should be displayed on the home screen.
@property (nonatomic, copy, readonly) NSString *localizedTitle;
@property (nullable, nonatomic, copy, readonly) NSString *localizedSubtitle;
@property (nullable, nonatomic, copy, readonly) UIApplicationShortcutIcon *icon;

// Application-specific information needed to perform the action.
// Will throw an exception if the NSDictionary is not plist-encodable.
@property (nullable, nonatomic, copy, readonly) NSDictionary<NSString *, id <NSSecureCoding>> *userInfo;

@end

其中对于实例方法initWithType:localizedTitle:localizedSubtitle:icon:userInfo:各个参数释义如下:
type: 快捷可选项的标志类型的字符串(必填)
localizedTitle: 快捷可选项的标题(必填)
localizedSubtitle: 快捷可选项的子标题(可选)
icon: 快捷可选项的图标(可选)
userInfo: 快捷可选项的附加信息,比如通过点击某个快速操作,进行传值(可选)

注意:经过测试,如果同时使用静态方式和动态方式两种定义方式,则最终会合并,并且静态方式定义的快速操作靠近程序图标。

3.3 点击快速操作时的数据传递

至此,我们学习了定义3D Touch中的快速操作,下面我们说一下当我们进行3D Touch操作时的数据传递。我们需要依赖初始化UIApplicationShortcutItem实例对象时,传入的userInfo字典。
通过UIApplicationShortcutItem类中的定义,我们可以看到,该类有个userInfo的属性,该属性中存放值要全部遵循<NSSecureCoding>协议,幸运的是字符串是遵循该协议的。

注意:通过静态方式定义的快速操作,可以通过将其包含在应用程序的Info.plist文件中的UIApplicationShortcutItemUserInfo键中来传递userInfo数据。

下面我们举个栗子,添加一个分享操作:

UIApplicationShortcutItem *shareItem = [[UIApplicationShortcutItem alloc] initWithType:@"com.yuyangkk.share" localizedTitle:@"分享" localizedSubtitle:@"分享副标题" icon:[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeShare] userInfo:@{@"Name":@"Hello world"}];
[UIApplication sharedApplication].shortcutItems = @[shareItem];

运行App,得到的效果是:


Simulator Screen Shot - iPhone X - 2018-09-13 at 22.21.18.png
3.4 响应快速操作事件

当用户触发主屏幕快速操作时,应用会通过以下两种方式之一得到通知:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    // 如果launchOptions包含相应的启动选项键,则主屏幕快速操作负责启动应用程序。 应用完成初始化后,我们可以存储快速操作以进行处理。
    if (launchOptions[UIApplicationLaunchOptionsShortcutItemKey]) {
        // do something
        UIApplicationShortcutItem *item = launchOptions[UIApplicationLaunchOptionsShortcutItemKey];
        UIAlertController *alert = [UIAlertController alertControllerWithTitle:item.localizedTitle message:[NSString stringWithFormat:@"传递过来的值是:%@",item.userInfo] preferredStyle:UIAlertControllerStyleAlert];
        UIAlertAction *action = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];
        [alert addAction:action];
        [application.keyWindow.rootViewController presentViewController:alert animated:YES completion:nil];
    }
    return YES;
}
- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler{
    // 程序已经加载到内存中,点击3D Touch中的一个快速操作,会调用该代理方法,我们也可以存储快速操作,以便处理
    // do something
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:shortcutItem.localizedTitle message:[NSString stringWithFormat:@"传递过来的值是:%@",shortcutItem.userInfo] preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction *action = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];
    [alert addAction:action];
    [application.keyWindow.rootViewController presentViewController:alert animated:YES completion:nil];
}

简单的使用,到此就结束了,深入的还需要各位小伙伴去挖掘,如果觉得对你有帮助,不要吝啬你的小💗💗哦。

上一篇 下一篇

猜你喜欢

热点阅读