iOS8下如何自定义收到通知时的快捷回复

本文详细介绍了如何在iOS8系统中为应用程序添加自定义通知快捷回复功能,包括注册通知、创建快捷回复方法以及编辑自定义回复流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个功能很久之前就做出来了,最近正好有空可以梳理一下。

首先,我们要知道对于iOS8的通知我们可以做些什么,目前我们可以在注册iOS8通知的时候给不同类型通知加入对应的Action方法,也就是说一些简单地操作不用打开app就可以完成。比如说社交类应用收到一条消息,可以直接利用Action回复“OK”、“收到”之类的快捷短语。  手机qq就曾经加入过两个表情作为快捷回复,不知为何后来的版本取消了。


这是注册通知的方法,利用保存好的快捷短语数组,来创建每个Action,不过通知以横幅显示的话最多只有2个快捷方法。

- (void)registerPushServiceWithSetting
{
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
    {
        NSArray *replyArr = [[NSUserDefaults standardUserDefaults] valueForKey:@"reply"];
        NSMutableArray *actionsArr = [NSMutableArray array];
        for (NSInteger i = 0; i < replyArr.count ; i ++) {
               //Action方法
                UIMutableUserNotificationAction *quickReply = [[UIMutableUserNotificationAction alloc]init];
                quickReply.identifier = [NSString stringWithFormat:@"quickReply%ld",i];
                quickReply.title = replyArr[i];
                quickReply.activationMode = UIUserNotificationActivationModeBackground;
                quickReply.authenticationRequired = NO;
                [actionsArr addObject:quickReply];
        }
        //使用category来标记某一种通知类型,比如说收到消息
        UIMutableUserNotificationCategory *category = [[UIMutableUserNotificationCategory alloc]init];
        category.identifier = @"detail-reply";
        //把Action方法加入相应的category
        [category setActions:actionsArr forContext:UIUserNotificationActionContextMinimal];
        [category setActions:actionsArr forContext:UIUserNotificationActionContextDefault];
        
        UIUserNotificationSettings *set = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound) categories:[NSSet setWithObjects:category,nil]];
        [[UIApplication sharedApplication] registerUserNotificationSettings:set];
        [[UIApplication sharedApplication] registerForRemoteNotifications];
        
    }
    else
    {
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
         (UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert)];
    }
}

接收到远程通知后点击相应的Action会调用下面的方法

- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void (^)())completionHandler
{
    //通过identifier来判断点击的是哪个按钮,然后执行对应的操作
    NSArray *arr = [[[NSUserDefaults standardUserDefaults] valueForKey:@"reply"] copy];
    for (NSInteger i = 0; i < arr.count ; i ++) {
        if ([identifier isEqualToString:[NSString stringWithFormat:@"quickReply%ld",i]]) {
            NSLog(@"quickReply %ld",i);
        }

    }
}

我们可以在项目内部编辑自定义的快捷回复,在编辑好保存的时候不要忘记调用通知的注册方法重新注册,这样我们就可以随时改变接受到通知后的快捷回复了

//
//  EditViewController.m
//  NotificationQuicklyReplyDemo
//
//  Created by yyp on 15/5/15.
//  Copyright (c) 2015年 Mingdao. All rights reserved.
//

#import "EditViewController.h"

@interface EditViewController ()<UITableViewDataSource,UITableViewDelegate>

@property (strong, nonatomic) NSMutableArray *replyArr;
@property (assign, nonatomic) BOOL isEditing;

@end

@implementation EditViewController

- (id)init
{
    self = [super initWithStyle:UITableViewStylePlain];
    if (self) {
        self.title = @"自定义通知快捷回复";
        self.tableView.delegate = self;
        self.tableView.dataSource = self;
    }
    return self;
}


- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit target:self action:@selector(editAction)];
    [self loadData];
}

- (void)editAction
{
    self.isEditing = !self.isEditing;
    if (self.isEditing) {
        [self.tableView reloadData];
        [self.tableView setEditing:self.isEditing animated:YES];
        self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(editAction)];
        self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addReplyAction)];
    } else {
        [self.tableView reloadData];
        [self.tableView setEditing:self.isEditing animated:YES];
        self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit target:self action:@selector(editAction)];
        self.navigationItem.leftBarButtonItem = nil;
        
    }

}

- (void)finishEdit
{
    [[NSUserDefaults standardUserDefaults] setObject:self.replyArr forKey:@"reply"];
    [self registerPushServiceWithSetting];
}

- (void)registerPushServiceWithSetting
{
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
    {
        NSArray *replyArr = [[NSUserDefaults standardUserDefaults] valueForKey:@"reply"];
        NSMutableArray *actionsArr = [NSMutableArray array];
        for (NSInteger i = 0; i < replyArr.count ; i ++) {
            NSDictionary *dic = replyArr[i];
            if ([dic[@"status"] isEqualToString:@"selected"]) {
                UIMutableUserNotificationAction *quickReply = [[UIMutableUserNotificationAction alloc]init];
                quickReply.identifier = [NSString stringWithFormat:@"quickReply%ld",i];
                quickReply.title = dic[@"reply"];
                quickReply.activationMode = UIUserNotificationActivationModeBackground;
                quickReply.authenticationRequired = NO;
                [actionsArr addObject:quickReply];
            }
        }
        UIMutableUserNotificationCategory *category = [[UIMutableUserNotificationCategory alloc]init];
        category.identifier = @"detail-reply";
        [category setActions:actionsArr forContext:UIUserNotificationActionContextMinimal];
        [category setActions:actionsArr forContext:UIUserNotificationActionContextDefault];
        
        UIUserNotificationSettings *set = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound) categories:[NSSet setWithObjects:category,nil]];
        [[UIApplication sharedApplication] registerUserNotificationSettings:set];
        [[UIApplication sharedApplication] registerForRemoteNotifications];
        
    }
    else
    {
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
         (UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert)];
    }
}


- (void)loadData
{
    self.replyArr = [[[NSUserDefaults standardUserDefaults] valueForKey:@"reply"] mutableCopy];
    if (self.replyArr.count == 0) {
        [self.replyArr addObject:@"OK"];
        [self.replyArr addObject:@"收到"];
    }
    [self.tableView reloadData];
}

- (void)addReplyAction
{
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"输入您自定义的回复", @"输入您自定义的回复") message:nil preferredStyle:UIAlertControllerStyleAlert];
    [alert addTextFieldWithConfigurationHandler:^(UITextField *textField) {
        
    }];
    [alert addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"确定", @"确定") style:UIAlertActionStyleDestructive
                                            handler:^(UIAlertAction *action) {
                                                UITextField *tf = alert.textFields.firstObject;
                                                if (tf.text.length > 0) {
                                                    [self.replyArr addObject:tf.text];
                                                    [self.tableView reloadData];
                                                }
                                            }]];
    [alert addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"取消", @"取消")  style:UIAlertActionStyleCancel
                                            handler:nil]];
    [self presentViewController:alert animated:YES completion:nil];

}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    return self.replyArr.count;
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
    cell.textLabel.text = self.replyArr[indexPath.row];
    return cell;
}




// Override to support conditional editing of the table view.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    return YES;
}

- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;
}


// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        [self.replyArr removeObjectAtIndex:indexPath.row];
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }
}



// Override to support rearranging the table view.
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
    NSString *str = self.replyArr[fromIndexPath.row];
    [self.replyArr removeObject:str];
    [self.replyArr insertObject:str atIndex:toIndexPath.row];
    
}


@end

完整的Demo在 点击打开链接



1. 用户与身体信息管理模块 用户信息管理: 注册登录:支持手机号 / 邮箱注册,密码加密存储,提供第三方快捷登录(模拟) 个人资料:记录基本信息(姓名、年龄、性别、身高、体重、职业) 健康目标:用户设置目标(如 “减重 5kg”“增肌”“维持健康”)及期望周期 身体状态跟踪: 体重记录:定期录入体重数据,生成体重变化曲线(折线图) 身体指标:记录 BMI(自动计算)、体脂率(可选)、基础代谢率(根据身高体重估算) 健康状况:用户可填写特殊情况(如糖尿病、过敏食物、素食偏好),系统据此调整推荐 2. 膳食记录与食物数据库模块 食物数据库: 基础信息:包含常见食物(如米饭、鸡蛋、牛肉)的名称、类别(主食 / 肉类 / 蔬菜等)、每份重量 营养成分:记录每 100g 食物的热量(kcal)、蛋白质、脂肪、碳水化合物、维生素、矿物质含量 数据库维护:管理员可添加新食物、更新营养数据,支持按名称 / 类别检索 膳食记录功能: 快速记录:用户选择食物、输入食用量(克 / 份),系统自动计算摄入的营养成分 餐次分类:按早餐 / 午餐 / 晚餐 / 加餐分类记录,支持上传餐食照片(可选) 批量操作:提供常见套餐模板(如 “三明治 + 牛奶”),一键添加到记录 历史记录:按日期查看过往膳食记录,支持编辑 / 删除错误记录 3. 营养分析模块 每日营养摄入分析: 核心指标计算:统计当日摄入的总热量、蛋白质 / 脂肪 / 碳水化合物占比(按每日推荐量对比) 微量营养素分析:检查维生素(如维生素 C、钙、铁)的摄入是否达标 平衡评估:生成 “营养平衡度” 评分(0-100 分),指出摄入过剩或不足的营养素 趋势分析: 周 / 月营养趋势:用折线图展示近 7 天 / 30 天的热量、三大营养素摄入变化 对比分析:将实际摄入与推荐量对比(如 “蛋白质摄入仅达到推荐量的 70%”) 目标达成率:针对健
1. 用户管理模块 用户注册与认证: 注册:用户填写身份信息(姓名、身份证号、手机号)、设置登录密码(需符合复杂度要求),系统生成唯一客户号 登录:支持账号(客户号 / 手机号)+ 密码登录,提供验证码登录、忘记密码(通过手机验证码重置)功能 身份验证:注册后需完成实名认证(模拟上传身份证照片,系统标记认证状态) 个人信息管理: 基本信息:查看 / 修改联系地址、紧急联系人、邮箱等非核心信息(身份证号等关键信息不可修改) 安全设置:修改登录密码、设置交易密码(用于转账等敏感操作)、开启 / 关闭登录提醒 权限控制:普通用户仅能操作本人账户;管理员可管理用户信息、查看系统统计数据 2. 账户与资金管理模块 账户管理: 账户创建:用户可开通储蓄卡账户(默认 1 个主账户,支持最多 3 个子账户,如 “日常消费账户”“储蓄账户”) 账户查询:查看各账户余额、开户日期、状态(正常 / 冻结)、交易限额 账户操作:挂失 / 解挂账户、申请注销账户(需余额为 0) 资金操作: 转账汇款:支持同行转账(输入对方账户号 / 手机号),需验证交易密码,可添加常用收款人 存款 / 取款:模拟存款(输入金额增加余额)、取款(输入金额减少余额,需不超过可用余额) 交易记录:按间、类型(转入 / 转出 / 存款 / 取款)查询明细,显示交易间、金额、对方账户(脱敏显示)、交易状态 3. 账单与支付模块 账单管理: 月度账单:自动生成每月收支明细,统计总收入、总支出、余额变动 账单查询:按月份、交易类型筛选账单,支持导出为 Excel 格式 还款提醒:若有贷款(简化版可模拟),系统在还款日 3 天前发送提醒 快捷支付: 绑定支付方式:添加银行卡(系统内账户)作为支付渠道 模拟消费:支持输入商户名称和金额,完成支付(从账户余额扣减) 支付记录:保存所有消费记录,包含商户、间、金额、支付状态 4.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值