iOS 本地通知

概述

本地通知就是APP发送推送通知给手机系统,不需要经过服务器,可以做到精准推送。应用场景还是比较多的,比如事务、闹钟、提醒等功能。
在不同的iOS系统中可用的本地通知框架不一样,总之是,系统越高,功能越好用,但是低版本iOS手机咱得做合理的兼容处理。先讲iOS8之后的使用方法

一、iOS8之后的系统使用本地通知

用到的几个类都是UIKit框架中的,所以不需要导入什么,一般在AppDelegate里面实现。

注册本地通知

本地通知注册很简单,看代码

// 权限类型:弹窗、声音、角标设置的权限
UIUserNotificationType types = UIUserNotificationTypeAlert | UIUserNotificationTypeSound | UIUserNotificationTypeBadge;
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
// 请求获取通知权限
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];

程序执行完这几行代码,就会弹出通知权限提醒窗
弹窗选择“允许”或“拒绝”都会走下面的方法,

 -(void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings{
    if (notificationSettings.types == 0) {
        // 通知权限授权失败
    } else {
        // 通知权限授权成功
    }
}

这样就注册完事了。当然还可以在注册的时候加些戏
App在后台或者杀死时,弹出的消息,可以通过“下拉”或者“查看”操作来看到通知详情,其实这里还可以有定义的操作按钮,如下图



这些功能得写在注册通知之前,下面看代码

if ([[UIApplication sharedApplication] currentUserNotificationSettings].types > 0) {
    return;
}
UIUserNotificationType types = UIUserNotificationTypeAlert | UIUserNotificationTypeSound | UIUserNotificationTypeBadge;
// 设置通知弹窗的种类,种类可以有多种,不同的种类可以通过identifier区分
UIMutableUserNotificationCategory *category = [[UIMutableUserNotificationCategory alloc] init];
category.identifier = @"noti_category";

// 每种弹窗可以定义它的操作按钮,每个按钮通过identifier区分
UIMutableUserNotificationAction *action1 = [[UIMutableUserNotificationAction alloc] init];
action1.identifier = @"001";
action1.title = @"确认";
action1.activationMode = UIUserNotificationActivationModeForeground;// 此Action要打开App
action1.authenticationRequired = YES;// 执行此Action是否需要验证身份(就是手机的密码或者指纹)
action1.destructive = NO;//
action1.behavior = UIUserNotificationActionBehaviorTextInput;// 点击后可以先弹出文本输入框
UIMutableUserNotificationAction *action2 = [[UIMutableUserNotificationAction alloc] init];
action2.identifier = @"002";
action2.title = @"取消";
action2.activationMode = UIUserNotificationActivationModeBackground;// 此操作可App在后台时进行
action2.authenticationRequired = YES;
action2.destructive = YES;// YES - 表示带有摧毁性的操作需要,字体会被标红

[category setActions:@[action1,action2] forContext:(UIUserNotificationActionContextDefault)];
NSSet *set = [NSSet setWithObject:category];
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:set];
// 注册通知
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];

因为action1的behavior属性为UIUserNotificationActionBehaviorTextInput,所以点击确认会先弹出输入框,输入完成点击键盘上的发送后,整个操作算结束,如下图:

紧接着会走下面的这个代理方法

- (void)application:(UIApplication *)application handleActionWithIdentifier:(nullable NSString *)identifier forLocalNotification:(UILocalNotification *)notification withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void (^)(void))completionHandler{
    identifier
    // 这里的identifier就是之前定义的action的identifier
}

点击取消其实也是走上面的代理方法,action是通过identifier来区分的。不同的操作需要做的处理可以在这个方法里面实现。

发送本地通知
UILocalNotification *localNoti = [[UILocalNotification alloc] init];
// 设置发送时间
localNoti.timeZone = [NSTimeZone localTimeZone];// 时区
localNoti.fireDate = [NSDate dateWithTimeIntervalSinceNow:5.0];// 时间
localNoti.repeatCalendar = [NSCalendar currentCalendar];// 日历
localNoti.repeatInterval = 3;// 重复发送次数
localNoti.alertTitle = @"我是一条通知";// 标题
localNoti.soundName = UILocalNotificationDefaultSoundName;// 声音的名字
localNoti.applicationIconBadgeNumber = 10;// 角标
localNoti.userInfo = @{
    @"chatID":@"1234567890",
    @"number":@"10"
};
localNoti.alertBody = @"窗前明月光地上霜";// 内容
localNoti.category = @"noti_category";// 种类标识
[[UIApplication sharedApplication] scheduleLocalNotification:localNoti];

如果App在前台发送本地通知,iOS10以下的系统是不会弹出弹窗的,此情况会直接走代理方法:

-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{
    NSLog(@"点击了本地通知");
}

如果App在后台或者杀死的时候,会弹出消息弹窗。点击消息打开App,也会走上面的代理方法。
iOS8之后的系统先说到这里,下面说说iOS10之后的系统怎么发送本地通知

二、iOS10之后的系统发送本地通知

iOS10之后增加了新的通知框架,之前的被废弃了,所以要注意三点:

  • 使用前引入头文件#import <UserNotifications/UserNotifications.h>
  • 使用的地方要做版本判断,兼容低版本
  • 如果要用到通知框架的代理方法,需要遵循代理
注册本地通知
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
center.delegate = self;
UNAuthorizationOptions option = UNAuthorizationOptionAlert | UNAuthorizationOptionBadge | UNAuthorizationOptionSound;
[center requestAuthorizationWithOptions:option completionHandler:^(BOOL granted, NSError * _Nullable error) {
    if (granted) {// 授权成功
        
    }else{//
        
    }
}];

注册通知授权成功会走上面的block回调。这点是与之前的框架不同的地方,显然这种方式方便些。

发送本地通知
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
content.title = @"test";
content.subtitle = @"春晓";
content.body = @"离离原上草,一岁一枯荣,野火烧不尽,春风吹又生";
content.sound = [UNNotificationSound defaultSound];
content.badge = [NSNumber numberWithInt:10];
content.categoryIdentifier = @"ios10_category";
content.userInfo = @{
    @"key1":@"value1",
    @"key2":@"value2"
};
// 发送时机
UNTimeIntervalNotificationTrigger *timeTrigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:0.1 repeats:NO];
UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"001" content:content trigger:timeTrigger];
[center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
    NSLog(@"发送通知");
}];

发送以后,会回调下面代理方法

-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler{
    // 发送本地通知之后会走到这里,根据completionHandler中的参数来展示提醒类型,或弹窗、或声音、或震动
    completionHandler(UNNotificationPresentationOptionAlert);
}

代理方法中,根据completionHandler()中的参数来制定提醒类型,参数介绍如下:

typedef NS_OPTIONS(NSUInteger, UNNotificationPresentationOptions) {
    UNNotificationPresentationOptionBadge   = (1 << 0),// 角标
    UNNotificationPresentationOptionSound   = (1 << 1),// 声音
    UNNotificationPresentationOptionAlert   = (1 << 2),// 弹框
} 

使用UNNotificationPresentationOptionAlert就可以实现弹窗,而且iOS10之后版本推送消息可以在App前台显示弹窗的。

处理本地通知

点击通知栏的通知,会走下面的代理方法,方法的参数"response"带了通知的相关信息

-(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler{
    NSLog(@"");
}

当然,也可以给通知弹窗添加一些操作功能,和上面比较类似,直接贴代码

UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
center.delegate = self;
// 添加操作选项
UNNotificationAction *action1 = [UNNotificationAction actionWithIdentifier:@"action1_sure" title:@"查看" options:(UNNotificationActionOptionAuthenticationRequired)];
UNNotificationAction *action2 = [UNNotificationAction actionWithIdentifier:@"action2_cancel" title:@"确定" options:(UNNotificationActionOptionForeground)];
UNNotificationAction *action3 = [UNNotificationAction actionWithIdentifier:@"action3_cancel" title:@"取消" options:(UNNotificationActionOptionDestructive)];
UNTextInputNotificationAction *action4 = [UNTextInputNotificationAction actionWithIdentifier:@"action4_input" title:@"编辑" options:(UNNotificationActionOptionForeground) textInputButtonTitle:@"发送" textInputPlaceholder:@"请输入消息"];
UNNotificationCategory *category = [UNNotificationCategory categoryWithIdentifier:@"ios10_category" actions:@[action1,action2,action3,action4] intentIdentifiers:@[] options:UNNotificationCategoryOptionNone];
NSSet *set = [NSSet setWithObjects:category, nil];
[center setNotificationCategories:set];
UNAuthorizationOptions option = UNAuthorizationOptionAlert | UNAuthorizationOptionBadge | UNAuthorizationOptionSound;
[center requestAuthorizationWithOptions:option completionHandler:^(BOOL granted, NSError * _Nullable error) {
    if (granted) {// 授权成功
        
    }else{//
        
    }
}];

效果是这样的:


其他的操作流程和上面一样,over~

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

推荐阅读更多精彩内容

  • 前言 首先我们要明白通知和推送是不一样的。 通知是iOS操作系统层面上的功能,说白了就是iPhone上的通知条,通...
    進无尽阅读 1,387评论 0 0
  • 我们知道,在iOS系统中,当用户正在前台操作一个app时,app可以有很多种方式告诉用户一些信息。然而,任何时候都...
    workforu阅读 2,788评论 15 62
  • 以前一直迷惑,本地推送到底有什么用,后来仔细想了想,确实有用(废话,不然苹果爸爸干嘛开发这个?手动鄙视自己!) 本...
    So_365阅读 1,240评论 8 5
  • iOS 本地通知和远程推送 推送通知的应用,可以推送最新的消息给用户,获得更多的关注。推送分为本地推送和远程推送两...
    李小六_阅读 1,262评论 0 6
  • 六项精进日打卡 姓名:陈小青 时间:2018年6月7号 公司:【温粥人万松店】 小组:382期温州...
    霸气小主青儿阅读 141评论 0 0