1.註冊本地通知
/** 註冊本地通知 */
- (void)registerUserNotification {
// 判讀系統版本是否是“iOS 8.0”以上
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0 ||
[UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)]) {
// 定義用戶通知類型(Remote.遠程 - Badge.標記 Alert.提示 Sound.聲音)
UIUserNotificationType types = UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound;
// 定義用戶通知設置
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
// 註冊用戶通知 - 根據用戶通知設置
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
}
}
2.創建一個本地通知
NSInteger time = _textField.text.integerValue;
UILocalNotification *localNotification = [[UILocalNotification alloc] init];
if (localNotification) {
// 使用本地時區
localNotification.timeZone = [NSTimeZone defaultTimeZone];
//設置觸發通知時間
localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:time];
//通知參數
localNotification.userInfo = @{@"type":[NSString stringWithFormat:@"test:%ld",(long)time],@"time":@(time)};;
//通知聲音
localNotification.soundName = UILocalNotificationDefaultSoundName;
//通知內容
localNotification.alertBody = @"test";
localNotification.repeatInterval = 0;//不重複
//註冊通知
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
}
3.收到本地通知
- 如果應用在前臺,會在- (void)application:(UIApplication )application didReceiveLocalNotification:(UILocalNotification )notification 中收到通知。
- 如果應用是關閉或者在後臺,會在狀態欄收到通知。
通過點擊狀態欄通知打開應用,在- (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions 中,通過
UILocalNotification *localNotification = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
可以獲取本地通知信息。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
[self registerUserNotification];
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
//本地通知處理
UILocalNotification *localNotification = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
if ([localNotification isKindOfClass:[UILocalNotification class]]) {
//---1
NSLog(@"通知內容1%@",localNotification);
// [[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
}
[self p_showBtnAction];
return YES;
}
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
if ([UIApplication sharedApplication].applicationState == UIApplicationStateInactive) {
//-----2
NSLog(@"收到本地通知");
}else if ([UIApplication sharedApplication].applicationState == UIApplicationStateActive){
//----3
AudioServicesPlaySystemSound(1007);
}
NSString * msg = [[NSString alloc] initWithFormat:@"%@-%lu-%@",notification.userInfo,(unsigned long)notification.repeatInterval,notification.repeatCalendar ];
UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:@"通知" message:msg delegate:nil cancelButtonTitle:@"確定" otherButtonTitles:nil, nil];
[alertView show];
NSLog(@"收到通知:%@",notification);
NSLog(@"=============");
[self p_showBtnAction];
}
在1 的地方可以處理本地通知,進行頁面跳轉等操作;
如果不在1的地方處理,可以調用[[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; 這樣didReceiveLocalNotification會被調用。
在2的地方表示點擊了狀態欄的通知消息,可在此進行操作。
在3的地方添加聲音提示,應用在前臺時收到本地通知會被調用。
需要注意的地方
for (UILocalNotification* noti in [UIApplication sharedApplication].scheduledLocalNotifications) {
NSLog(@"通知:%@",noti);
}
可遍歷所有本地通知。如果 localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:0];立即通知的,通知不會加入到 [UIApplication sharedApplication].scheduledLocalNotifications數組中。
- 走到didReceiveLocalNotification的通知,會自動從[UIApplication sharedApplication].scheduledLocalNotifications數組中刪除。 4.