以iOS8.0和iOS10.0兩個(gè)版本來創(chuàng)建一個(gè)本地推送:
- (void)localPush{
// iOS8.0下本地推送的創(chuàng)建方式
if ([UIDevice currentDevice].systemVersion.floatValue < 10.0) {
UILocalNotification *localNotification = [[UILocalNotification alloc] init];
localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:5.0];
localNotification.alertBody = @"這是一條本地推送乎芳,這是推送主體肩袍!";
localNotification.soundName = UILocalNotificationDefaultSoundName;
localNotification.applicationIconBadgeNumber += 1;
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
// iOS10.0
}else {
// 給推送一個(gè)標(biāo)識符
NSString *identifier = @"localPush.identifier";
// 推送內(nèi)容
UNMutableNotificationContent *content = [UNMutableNotificationContent new];
content.body = @"這是iOS10的本地推送疚鲤,這是推送主體誊涯!";
content.badge = @1;
// 推送觸發(fā)器
// UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:60 repeats:YES];
NSDateComponents *components = [NSDateComponents new]; components.second = 5.0f;
UNCalendarNotificationTrigger *trigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:components repeats:YES];
// 推送請求
UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:identifier content:content trigger:trigger];
// 把推送請求添加到推送中心
[[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
NSLog(@"%@", [error localizedDescription]);
}];
}}
推送創(chuàng)建完畢后迹蛤,那么我們便要考慮收到推送后會執(zhí)行什么樣的操作奇颠,這里主要介紹處理接收到推送的地方败去。首先我們要先注冊推送通知。8.0和10.0注冊推送還是很不一樣的烈拒。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 8.0系統(tǒng)注冊推送
if ([[UIDevice currentDevice].systemVersion floatValue] < 10.0) {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge|UIUserNotificationTypeAlert|UIUserNotificationTypeSound categories:nil];
[application registerUserNotificationSettings:settings];
// iOS10.0注冊推送
}else{
[UNUserNotificationCenter currentNotificationCenter].delegate = self;
[[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:UNAuthorizationOptionBadge|UNAuthorizationOptionSound|UNAuthorizationOptionAlert completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (error != nil) {
NSLog(@"%@", [error localizedDescription]);
}
}];
[[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
NSLog(@"%@", settings);
}];
}
// 如果是點(diǎn)擊推送進(jìn)入的App圆裕,那么lauchOptions會有一個(gè)UIApplicationLaunchOptionsLocalNotificationKey字段,如果這個(gè)字段不為空荆几,代表是點(diǎn)擊推送進(jìn)入吓妆,并且可以獲得推送的內(nèi)容。注意這個(gè)key在iOS10以后也有值吨铸,不要和userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:這個(gè)方法重復(fù)了行拢。所以要判斷一下版本是否小于10.0。
if (([[UIDevice currentDevice].systemVersion floatValue] < 10.0) && launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]) {
// ......在點(diǎn)擊推送進(jìn)入App后會執(zhí)行的代碼诞吱。
}
return YES;
}
iOS10以后舟奠,如果程序被銷毀后(即程序退出后),收到推送房维,點(diǎn)擊推送進(jìn)入app沼瘫,會調(diào)用該方法;在該方法里可以執(zhí)行需要執(zhí)行的代碼咙俩,注意兩點(diǎn):
一.要調(diào)用一下completionHandler()
耿戚;
二.要在
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
中設(shè)置一下代理:
[UNUserNotificationCenter currentNotificationCenter].delegate = self
;
否則該代理方法不會執(zhí)行。
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler{
//......程序退出時(shí)收到推送執(zhí)行的操作
completionHandler();
}
iOS8.0以后暴浦,如果程序在前臺溅话,收到推送會調(diào)用該方法:
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{
//......程序在前臺時(shí)收到推送執(zhí)行的操作
}
iOS10.0以后晓锻,如果程序在前臺歌焦,收到推送會調(diào)用該方法:
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler{
//......程序在前臺時(shí)收到推送執(zhí)行的操作
completionHandler(UNNotificationPresentationOptionSound | UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionAlert);
}