iOS 10 UserNotifications Kit

#define XCODE_VERSION_GREATER_THAN_OR_EQUAL_TO_8__has_include()

#define SYSTEM_VERSION_EQUAL_TO(v)([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)

#define SYSTEM_VERSION_GREATER_THAN(v)([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

#define SYSTEM_VERSION_LESS_THAN(v)([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)

#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v)([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)

//

#import"ViewController.h"

/// 1. import UserNotifications

///推送通知从UIKit独立出来,成为一个独立的框架。必须导入

///Notification become independent from UIKit

#if XCODE_VERSION_GREATER_THAN_OR_EQUAL_TO_8

@importUserNotifications;

#endif

staticNSString*constCYLInviteCategoryIdentifier =@"com.elonchan.localNotification";

@interfaceViewController()

@end

@implementationViewController

- (void)triggerNotification:(id)sender {

if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"10.0")) {

// create actions

#if XCODE_VERSION_GREATER_THAN_OR_EQUAL_TO_8

UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];

// create actions

UNNotificationAction *acceptAction = [UNNotificationAction actionWithIdentifier:@"com.elonchan.yes"

title:@"Accept"

options:UNNotificationActionOptionForeground];

UNNotificationAction *declineAction = [UNNotificationAction actionWithIdentifier:@"com.elonchan.no"

title:@"Decline"

options:UNNotificationActionOptionDestructive];

UNNotificationAction *snoozeAction = [UNNotificationAction actionWithIdentifier:@"com.elonchan.snooze"

title:@"Snooze"

options:UNNotificationActionOptionDestructive];

NSArray *notificationActions =@[acceptAction, declineAction, snoozeAction];

// create a category

UNNotificationCategory *inviteCategory = [UNNotificationCategory categoryWithIdentifier:CYLInviteCategoryIdentifier

actions:notificationActions

minimalActions:notificationActions

intentIdentifiers:@[]

options:UNNotificationCategoryOptionCustomDismissAction];

NSSet *categories = [NSSet setWithObject:inviteCategory];

// registration

[center setNotificationCategories:categories];

#endif

}elseif(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) {

// create actions

UIMutableUserNotificationAction*acceptAction = [[UIMutableUserNotificationActionalloc]init];

acceptAction.identifier=@"com.elonchan.yes";

acceptAction.title=@"Accept";

acceptAction.activationMode=UIUserNotificationActivationModeBackground;

acceptAction.destructive=NO;

acceptAction.authenticationRequired=NO;//If YES requies passcode, but does not unlock the device

UIMutableUserNotificationAction*declineAction = [[UIMutableUserNotificationActionalloc]init];

declineAction.identifier=@"com.elonchan.no";

acceptAction.title=@"Decline";

acceptAction.activationMode=UIUserNotificationActivationModeBackground;

declineAction.destructive=YES;

acceptAction.authenticationRequired=NO;

UIMutableUserNotificationAction*snoozeAction = [[UIMutableUserNotificationActionalloc]init];

snoozeAction.identifier=@"com.elonchan.snooze";

acceptAction.title=@"Snooze";

snoozeAction.activationMode=UIUserNotificationActivationModeBackground;

snoozeAction.destructive=YES;

snoozeAction.authenticationRequired=NO;

// create a category

UIMutableUserNotificationCategory*inviteCategory = [[UIMutableUserNotificationCategoryalloc]init];

inviteCategory.identifier=CYLInviteCategoryIdentifier;

NSArray*notificationActions =@[acceptAction, declineAction, snoozeAction];

[inviteCategorysetActions:notificationActionsforContext:UIUserNotificationActionContextDefault];

[inviteCategorysetActions:notificationActionsforContext:UIUserNotificationActionContextMinimal];

// registration

NSSet*categories = [NSSetsetWithObject:inviteCategory];

UIUserNotificationTypetypes =UIUserNotificationTypeBadge|UIUserNotificationTypeSound|UIUserNotificationTypeAlert;

UIUserNotificationSettings*settings = [UIUserNotificationSettingssettingsForTypes:typescategories:categories];

[[UIApplicationsharedApplication]registerUserNotificationSettings:settings];

}

/// 2. request authorization for localNotification

[selfregisterNotificationSettingsCompletionHandler:^(BOOLgranted,NSError*_Nullableerror) {

if(!error) {

NSLog(@"request authorization succeeded!");

[selfshowAlert];

}

}];

if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"10.0")) {

#if XCODE_VERSION_GREATER_THAN_OR_EQUAL_TO_8

// //Deliver the notification at 08:30 everyday

// NSDateComponents *dateComponents = [[NSDateComponents alloc] init];

// dateComponents.hour = 8;

// dateComponents.minute = 30;

// UNCalendarNotificationTrigger *trigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:dateComponents repeats:YES];

UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];

content.title = [NSString localizedUserNotificationStringForKey:@"Elon said:"arguments:nil];

content.body = [NSString localizedUserNotificationStringForKey:@"Hello Tom!Get up, let's play with Jerry!"

arguments:nil];

content.sound = [UNNotificationSound defaultSound];

content.categoryIdentifier =@"com.elonchan.localNotification";

/// 4. update application icon badge number

content.badge =@([[UIApplication sharedApplication] applicationIconBadgeNumber] +1);

content.launchImageName =@"any string is ok,such as微博@iOS程序犭袁";

// Deliver the notification in five seconds.

UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger

triggerWithTimeInterval:5.frepeats:YES];

UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"FiveSecond"

content:content trigger:trigger];

UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];

/// 3. schedule localNotification,The delegate must be set before the application returns from applicationDidFinishLaunching:.

// center.delegate = self;

[center addNotificationRequest:request withCompletionHandler:^(NSError *_Nullableerror) {

if(!error) {

NSLog(@"add NotificationRequest succeeded!");

}

}];

#endif

}else{

/// 3. schedule localNotification

UILocalNotification*localNotification = [[UILocalNotificationalloc]init];

localNotification.fireDate= [NSDatedateWithTimeIntervalSinceNow:5.f];

localNotification.alertTitle=@"Elon said:";

localNotification.alertBody=@"Hello Tom!Get up, let's play with Jerry!";

localNotification.alertAction=@"play with Jerry";

//Identifies the image used as the launch image when the user taps (or slides) the action button (or slider).

localNotification.alertLaunchImage=@"LaunchImage.png";

localNotification.userInfo=@{@"CategoryIdentifier":CYLInviteCategoryIdentifier};

localNotification.timeZone= [NSTimeZonedefaultTimeZone];

//repeat evey minute,0 means don't repeat

localNotification.repeatInterval=NSCalendarUnitMinute;

/// 4. update application icon badge number

localNotification.applicationIconBadgeNumber= [[UIApplicationsharedApplication]applicationIconBadgeNumber] +1;

[[UIApplicationsharedApplication]scheduleLocalNotification:localNotification];

[selfshowAlert];

}

}

- (void)registerNotificationSettingsCompletionHandler:(void(^)(BOOLgranted,NSError*__nullableerror))completionHandler; {

/// 2. request authorization for localNotification

if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"10.0")) {

#if XCODE_VERSION_GREATER_THAN_OR_EQUAL_TO_8

UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];

[center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert)

completionHandler:completionHandler];

#endif

}elseif(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")){

UIUserNotificationSettings*userNotificationSettings = [UIUserNotificationSettingssettingsForTypes:(UIUserNotificationTypeAlert|UIUserNotificationTypeSound|UIUserNotificationTypeBadge)

categories:nil];

UIApplication*application = [UIApplicationsharedApplication];

[applicationregisterUserNotificationSettings:userNotificationSettings];

//FIXME:

// !completionHandler ?: completionHandler(granted, error);

}

}

- (void)stopNotification:(id)sender {

if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"10.0")) {

#if XCODE_VERSION_GREATER_THAN_OR_EQUAL_TO_8

UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];

// remove all local notification:

[center removeAllPendingNotificationRequests];

// or you can remove specifical local notification:

//[center removePendingNotificationRequestsWithIdentifiers:@[ CYLInviteCategoryIdentifier ]];

#endif

}else{

// remove all local notification:

[[UIApplicationsharedApplication]cancelAllLocalNotifications];

// or you can remove specifical local notification:

//NSString *specificalIDToCancel = CYLInviteCategoryIdentifier;

//UILocalNotification *notificationToCancel = nil;

//for(UILocalNotification *aNotif in [[UIApplication sharedApplication] scheduledLocalNotifications]) {

//if([[aNotif.userInfo objectForKey:@"CategoryIdentifier"] isEqualToString:specificalIDToCancel]) {

//notificationToCancel = aNotif;

//break;

//}

//}

//if(notificationToCancel) {

//[[UIApplication sharedApplication] cancelLocalNotification:notificationToCancel];

//}

}

}

- (void)addLabel:(NSString*)title backgroundColor:(UIColor*)backgroundColor {

UILabel*label = [[UILabelalloc]init];

label.numberOfLines=0;

label.backgroundColor= backgroundColor;

label.text= title;

label.textColor= [UIColorblackColor];

[labelsizeToFit];

label.center=CGPointMake([UIScreenmainScreen].bounds.size.width*0.5,arc4random_uniform([UIScreenmainScreen].bounds.size.height));

[self.viewaddSubview:label];

}

//TODO:

//- (void)handleActionWithIdentifier:(NSString *)identifier

//forLocalNotification:(UILocalNotification *)localNotification {

//

//}

- (void)showAlert {

UIAlertView*alert = [[UIAlertViewalloc]initWithTitle:nil

message:@"please enter background now"

delegate:self

cancelButtonTitle:nil

otherButtonTitles:nil];

[alertshow];

intdelayInSeconds =1;

dispatch_time_twhen =dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds *NSEC_PER_SEC));

dispatch_after(when,dispatch_get_main_queue(), ^{

[alertdismissWithClickedButtonIndex:0animated:YES];

});

}

- (void)viewDidLoad {

[superviewDidLoad];

UIButton*triggerButton = [selfbuttonWithY:([UIScreenmainScreen].bounds.size.width*.5-50)title:@"Click me to trigger localNotification"backgroundColor:[UIColorcolorWithRed:(51) /255.fgreen:(171) /255.fblue:(160) /255.falpha:1.f]];

[triggerButtonaddTarget:selfaction:@selector(triggerNotification:)forControlEvents:UIControlEventTouchUpInside];

[self.viewaddSubview:triggerButton];

if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"10.0")) {

UIButton*stopButton = [selfbuttonWithY:([UIScreenmainScreen].bounds.size.width*.5+50)title:@"Click me to stop localNotification"backgroundColor:[UIColorredColor]];

[stopButtonaddTarget:selfaction:@selector(stopNotification:)forControlEvents:UIControlEventTouchUpInside];

[self.viewaddSubview:stopButton];

}

}

- (UIButton*)buttonWithY:(CGFloat)Y title:(NSString*)title backgroundColor:(UIColor*)color {

UIButton*button = [UIButtonbuttonWithType:UIButtonTypeCustom];

button.backgroundColor= color;

button.frame= ({

CGRectframe = button.frame;

frame.size.width= [UIScreenmainScreen].bounds.size.width-10;

frame.size.height=40;

frame;

});

button.center=CGPointMake([UIScreenmainScreen].bounds.size.width*.5, Y);

[buttonsetTitle:titleforState:UIControlStateNormal];

button.layer.shadowColor= [UIColorgrayColor].CGColor;

button.layer.cornerRadius=6.0;

button.titleLabel.font= [UIFontboldSystemFontOfSize:15];

button.titleLabel.textAlignment=NSTextAlignmentCenter;

[buttonsetTitleColor:[UIColorblackColor]forState:UIControlStateHighlighted];

returnbutton;

}

@end

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

推荐阅读更多精彩内容