iOS开发-实现3DTouch按压App快捷选项shortcutItems及跳转功能

iOS开发-实现3DTouch按压App快捷选项shortcutItems及跳转功能

App的应用图标通过3D Touch按压App图标,会显示快捷选项,点击选项可快速进入到App的特定页面。

这里用到了UIApplicationShortcutItem与UIMutableApplicationShortcutItem

一、效果图

这里暂时着了一张图代替了。

二、UIApplicationShortcutItem与UIMutableApplicationShortcutItem

UIApplicationShortcutItem

objectivec 复制代码
@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<NSString *, id <NSSecureCoding>> *)userInfo NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithType:(NSString *)type localizedTitle:(NSString *)localizedTitle;
...

UIMutableApplicationShortcutItem

objectivec 复制代码
@interface UIMutableApplicationShortcutItem : UIApplicationShortcutItem

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

// Properties controlling how the item should be displayed on the home screen.
@property (nonatomic, copy) NSString *localizedTitle;
@property (nullable, nonatomic, copy) NSString *localizedSubtitle;
@property (nullable, nonatomic, copy) 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) NSDictionary<NSString *, id <NSSecureCoding>> *userInfo;

// used with UISceneActivationConditions to customize what scene should be activated for a shortcut
@property (nullable, nonatomic, copy) id targetContentIdentifier;

@end

三、shortcutItems及跳转功能

通过配置需要当3DTouch按压显示的快捷ShortcutItem及跳转代码如下

objectivec 复制代码
#import "SD3DTouchManager.h"
#import "SDSessionManager.h"

static SD3DTouchManager *shareInstance = nil;

@implementation SD3DTouchManager

+ (instancetype)sharedInstance {
    static dispatch_once_t onceToken = 0;
    dispatch_once(&onceToken, ^{
        shareInstance = [[SD3DTouchManager alloc] init];
    });
    return shareInstance;
}

- (void)creat3DShortcutItem {
    if (IS_IOS9_OR_LATER) {
        UIApplicationShortcutIcon *sendIcon = [UIApplicationShortcutIcon iconWithTemplateImageName:@"ic_bar_search"];
        
        UIApplicationShortcutItem *sendItem = [[UIApplicationShortcutItem alloc]initWithType:SD_3D_WE_SEND localizedTitle:@"找代送" localizedSubtitle:nil icon:sendIcon userInfo:nil];
        
        UIApplicationShortcutIcon *buyIcon = [UIApplicationShortcutIcon iconWithTemplateImageName:@"ic_note_comment"];
        
        UIApplicationShortcutItem *buyItem = [[UIApplicationShortcutItem alloc]initWithType:SD_3D_WE_BUY localizedTitle:@"找代买" localizedSubtitle:nil icon:buyIcon userInfo:nil];
        
        UIApplicationShortcutIcon *rechargeIcon = [UIApplicationShortcutIcon iconWithTemplateImageName:@"ic_note_tag"];
        
        UIApplicationShortcutItem *rechargeItem = [[UIApplicationShortcutItem alloc]initWithType:SD_3D_RECHARGE localizedTitle:@"一键充值" localizedSubtitle:nil icon:rechargeIcon userInfo:nil];
        
        UIApplicationShortcutIcon *profileIcon = [UIApplicationShortcutIcon iconWithTemplateImageName:@"ic_mine"];
        
        UIApplicationShortcutItem *profileItem = [[UIApplicationShortcutItem alloc]initWithType:SD_3D_RECHARGE localizedTitle:@"我的信息" localizedSubtitle:nil icon:profileIcon userInfo:nil];
        
        [UIApplication sharedApplication].shortcutItems = @[sendItem,buyItem,rechargeItem,profileItem];
    }
}

- (BOOL)application3DShortcutOptions:(NSDictionary *)launchOptions {
    BOOL luanched = YES;
    if (IS_IOS9_OR_LATER) {
        
        UIApplicationShortcutItem *shortcutItem = [launchOptions valueForKey:UIApplicationLaunchOptionsShortcutItemKey];
        
        if (shortcutItem) {
            //判断设置的快捷选项标签唯一标识,根据不同标识执行不同操作
            [self apply3DTouch:shortcutItem];
            luanched = NO;
        }
    }
    
    return luanched;
}

- (void)apply3DTouch:(UIApplicationShortcutItem *)shortcutItem {
    if ([SDSessionManager shareInstance].isLogin) {
        UIViewController *controller = [UIApplication sharedApplication].keyWindow.rootViewController;
        
        UINavigationController *navigationController;
        if ([controller isKindOfClass:[UINavigationController class]]) {
            navigationController = (UINavigationController *)controller;
        } else {
            navigationController = controller.navigationController;
        }
        
        if ([shortcutItem.type isEqualToString:SD_3D_WE_SEND]) {
            DLog(@"3D 进入代送页面");
            
        } else if ([shortcutItem.type isEqualToString:SD_3D_WE_BUY]) {
            DLog(@"3D 进入代买页面");
            
        } else if ([shortcutItem.type isEqualToString:SD_3D_RECHARGE]) {
            DLog(@"3D 进入充值页面");
            
        } else if ([shortcutItem.type isEqualToString:SD_3D_MIME_INFO]) {
            DLog(@"3D 进入我的信息页面");
            
        }
    }
}

@end

在AppDelegate的didFinishLaunchingWithOptions初始化

objectivec 复制代码
//设置3D touch
    [[SD3DTouchManager sharedInstance] creat3DShortcutItem];

实现跳转performActionForShortcutItem

objectivec 复制代码
#pragma mark - 3D Touch
//如果APP没被杀死,还存在后台,点开Touch会调用该代理方法
- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler {
    if (shortcutItem) {
        //判断设置的快捷选项标签唯一标识,根据不同标识执行不同操作
        [[SD3DTouchManager sharedInstance] apply3DTouch:shortcutItem];
    }
    
    if (completionHandler) {
        completionHandler(YES);
    }
}

四、小结

iOS开发-实现3DTouch按压App快捷选项shortcutItems及跳转功能

App的应用图标通过3D Touch按压App图标,会显示快捷选项,点击选项可快速进入到App的特定页面。

学习记录,每天不停进步。

相关推荐
甘晴void39 分钟前
我给 Magpie 做了个 macOS 桌宠:106 段动画,请求一多就亮灯
macos·electron·开源·deepseek·桌面宠物·magpie
donecoding1 小时前
Apple 芯片 Mac 的终端为什么还在跑 Intel?从 tmux 查起
macos
言乐64 小时前
通过 3D 动画直观演示球形瓶内可滑动半圆机构在倾倒时防粘盖、回正时刮膏体的运动学过程
python·3d·django·virtualenv·pygame
DevLoom_6 小时前
macOS 27 升级后 Time Capsule 无法备份?AFP 协议废弃后的完整解决方案与备份迁移教程
macos·时间机器·macos27·macos 27备份·macos实用技巧
andyweike7 小时前
Swift
开发语言·ios·swift
金海星科技7 小时前
船舶交通管理中心的人工智能值守:从“听、说、读、写“看人机协同
人工智能·macos·xcode
茶底世界之下7 小时前
白杯偏蓝,色温调到哪里该停?Awaking 两版正式导出
ios
苏州福兰克7 小时前
没有3D内容,裸眼3D显示器还能用吗?
3d·计算机外设
慧都CAD开发笔记10 小时前
汽车零部件检测软件如何用统一接口直读多种 CAD:3D InterOp 的三类数据接入
3d·汽车
苏州福兰克10 小时前
长期看裸眼3D显示器容易视觉疲劳吗?
3d·计算机外设