iOS 10 通知 + 推送 初级篇(二)

UserNotifications.framework框架的主要 类文件:
{
UNCalendarNotificationTrigger
UNLocationNotificationTrigger
UNTimeIntervalNotificationTrigger
UNMutableNotificationContent
UNNotification
UNNotification Action
UNNotification Attachment
UNNotification Category
UNNotification Content
UNNotification Request
UNNotification Response
UNNotification ServiceExtension
UNNotification Settings
UNNotification Sound
UNNotification Trigger
UNPushNotificationTrigger
UNTextInputNotification Action
UNTextInputNotification Response
UNUserNotificationCenter
};

开发步骤:在AppDelegate.m中注册通知:
1、在项目中添加:UserNotifications.framework框架
2、导入头文件:#import <UserNotifications/UserNotifications.h>
3、然后遵循代理:
@interface AppDelegate () <UNUserNotificationCenterDelegate>
4、在- didFinishLaunchingWithOptions做如下操作:

//第一步注册创建通知
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//使用UNUserNotificationCenter来管理通知
// 1、请求用户授权:
UNUserNotificationCenter* center = [UNUserNotificationCenter   currentNotificationCenter];
//处理通知:设置UNUserNotificationCenterDelegate:
//注意:UNUserNotificationCenter的delegate必须在application:willFinishLaunchingWithOptions: or application:didFinishLaunchingWithOptions:方法中实现;

center.delegate = self;

//请求授权选项:
// UNAuthorizationOption Badge= 1 (1 << 0), ( bædʒ校徽)
// UNAuthorizationOption Sound= 2 (1 << 1),
// UNAuthorizationOption Alert= 4 (1 << 2),
// UNAuthorizationOption CarPlay = 8 (1 << 3),

//2、iOS 10使用以下方法注册,才能得到授权,注册通知以后,会自动注册deviceToken,如果获取不到deviceToken,Xcode8下要注意开启Capability->Push Notification。(request  rɪˈkwɛst 要求  authorization ˌɔθərəˈzeɪʃ(ə)n 授权)

//请求获取通知权限(角标,声音,弹框)
[center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert + UNAuthorizationOptionSound + UNAuthorizationOptionBadge)completionHandler:^(BOOL granted, NSError * _Nullable error) {
// Enable or disable features based on authorization.
}];

//或者你也可以以用 “  |  ”     ( kəmˈpliʃ(ə)n  完成   ˈhandlə,处理者)
[center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (granted) {
    //获取用户是否同意开启通知
    NSLog(@"request authorization successed!");
    }
}];
// 3、补充:获取当前的通知设置,UNNotificationSettings是只读对象,不能直接修改,只能通过以下方法获取
[center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {

// UNAuthorizationStatus NotDetermined :没有做出选择
// UNAuthorizationStatus Denied :用户未授权
// UNAuthorizationStatus Authorized:用户已授权
//进行判断做出相应的处理
if (settings.authorizationStatus == UNAuthorizationStatusNotDetermined)
    {
        NSLog(@"未选择");
    }else if (settings.authorizationStatus ==     UNAuthorizationStatusDenied){
        NSLog(@"未授权");
    }else if (settings.authorizationStatus ==    UNAuthorizationStatusAuthorized){
        NSLog(@"已授权");
    }
}];

return YES;
}

5、实现代理方法:
pragma mark: - UNUserNotificationCenterDelegate
//在展示通知前进行处理,即有机会在展示通知前再修改通知内容。

-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler{

//1.处理通知
//2.处理完成后条用completionHandler,用于指示在前台显示通知的形式
completionHandler(UNNotificationPresentationOptionAlert);

}

//第二步:新建通知内容对象
6、然后在ViewController.h里面声明并实现方法
+(void)registerNotification:(NSInteger )alerTime;
最后在ViewController.m里面实现方法即可也要
导入头文件:#import <UserNotifications/UserNotifications.h>
代码如下:

- (void)viewDidLoad {
[super viewDidLoad];

//另外创建了一个方法单独处理:该方法有一个参数作为:alertTime
[ViewController registerNotification:3]; //写了一个类方法

}

//推送本地通知://使用UNNotification本地通知  
+ (void)registerNotification:(NSInteger )alerTime{
//  UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];//①
//需创建一个包含待通知内容的UNMutableNotificationContent对象,注意不是UNNotificationContent ,此对象为不可变对象。

UNMutableNotificationContent* content = [[UNMutableNotificationContent alloc] init];
content.title = @"iOS10通知";
content.subtitle = @"新通知学习笔记";
content.body = @"新通知变化很大,之前本地通知和远程推送是两个类,现在合成一个了。这是一条测试通知,";
content.badge = @1;
UNNotificationSound *sound = [UNNotificationSound soundNamed:@"caodi.m4a"];
content.sound = sound;

//这是系统自带的通知声音
//UNNotificationSound *sound = [UNNotificationSound defaultSound];
//或者也可以这样创建:
//content.title = [NSString localizedUserNotificationStringForKey:@"Hello!" arguments:nil];
//content.body= [NSString localizedUserNotificationStringForKey:@"Hello_message_body" arguments:nil];

//第三步:通知触发机制,设置触发时间(重复提醒,时间间隔要大于60s)
//在alertTime时间后推送本地推送

UNTimeIntervalNotificationTrigger* trigger = [UNTimeIntervalNotificationTrigger
triggerWithTimeInterval:alerTime repeats:NO];

//补充:
//UserNotifications提供了三种触发器:
//UNTimeIntervalNotificationTrigger:一定时间后触发
//UNCalendarNotificationTrigger:在某月某日某时触发
//UNLocationNotificationTrigger:在用户进入或是离开某个区域时触发

//第四步:创建UNNotificationRequest通知请求对象//创建一个发送请求
NSString *requestIdentifier = @"RequestIdentifier";
UNNotificationRequest* request = [UNNotificationRequest requestWithIdentifier: requestIdentifier content:content trigger:trigger];
//而@"RequestIdentifier"请求的标识符可以用来管理通知:
-移除还未展示的通知
[center removePendingNotificationRequestsWithIdentifiers: @[@"RequestIdentifier"]];
[center removeAllPendingNotificationRequests]; //- (void)cancelAllLocalNotifications;

-移除已经展示过的通知
[center removeDeliveredNotificationsWithIdentifiers:@[@"RequestIdentifier"]];
[center removeAllDeliveredNotifications];

-获取未展示的通知
[center getPendingNotificationRequestsWithCompletionHandler:^(NSArray * _Nonnull requests) {
NSLog(@"%@",requests);
}];

-获取展示过的通知
[center getDeliveredNotificationsWithCompletionHandler:^(NSArray * _Nonnull notifications) {
NSLog(@"%@",notifications);
}];

//第五步:将通知请求添加到通知中心(UNUserNotificationCenter):
[[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
NSLog(@"Error:%@",error);
}];

//或者也可以在添加推送成功后的处理!注意这里的center如果在①处创建,则可以这样
[center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) 
{
        UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"本地通知" message:@"成功添加推送" preferredStyle:UIAlertControllerStyleAlert];
        UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];
        [alert addAction:cancelAction];
        [[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:alert animated:YES completion:nil];
}];
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,340评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,762评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,329评论 0 329
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,678评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,583评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,995评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,493评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,145评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,293评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,250评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,267评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,973评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,556评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,648评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,873评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,257评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,809评论 2 339

推荐阅读更多精彩内容