Notification是智能手機應用編程中非常常用的一種傳遞信息的機制,而且可以非常好的節省資源,不用消耗資源來不停地檢查信息狀態(Pooling),在iOS下應用分為兩種不同的Notification種類,本地和遠程。本地的Notification由iOS下NotificationManager統一管理,只需要將封裝好的本地Notification對象加入到系統Notification管理機制隊列中,系統會在指定的時間激發將本地Notification,應用只需設計好處理Notification的方法就完成了整個Notification流程了。
本地Notification所使用的對象是UILocalNotification,UILocalNotification的屬性涵蓋了所有處理Notification需要的內容。UILocalNotification的屬性有fireDate、timeZone、repeatInterval、repeatCalendar、alertBody、 alertAction、hasAction、alertLaunchImage、applicationIconBadgeNumber、 soundName和userInfo。
1.首先要明白模擬器和真機的區別:模擬器不會有音頻提示,另外就是沒有檢測允許接受通知,所以我補充一下幾點:
1.添加監測通知:
if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)]){ [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil]]; }
#import "ViewController.h" #import "DetailViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UIButton *schedule; @property (weak, nonatomic) IBOutlet UIButton *unSchedule; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } // 調度通知 - (IBAction)schedule:(UIButton *)sender { // 1.創建通知 UILocalNotification *ln = [[UILocalNotification alloc]init]; if (ln) { // 設置時區 ln.timeZone = [NSTimeZone defaultTimeZone]; // 通知第一次發出的時間 ln.fireDate = [[NSDate date]dateByAddingTimeInterval:5]; // 2.設置通知屬性 ln.soundName = @"click.wav"; // 音效文件名 // 通知的具體內容 ln.alertBody = @"重大新聞:小韓哥的博客又更新了,趕快進來看看吧!...."; // 鎖屏界面顯示的小標題,完整標題:(“滑動來”+小標題) ln.alertAction = @"查看新聞吧"; // 設置app圖標數字 ln.applicationIconBadgeNumber = 10; // 設置app的額外信息 ln.userInfo = @{ @"icon":@"text.png", @"title":@"重大新聞", @"time":@"2016-02-28", @"body":@"重大新聞:小韓哥的博客又更新了,趕快進來看看吧!" }; // 設置重啟圖片 ln.alertLaunchImage = @"101339g76j7j9t2zgzdvkj.jpg"; // 設置重復發出通知的時間間隔 // ln.repeatInterval = NSCalendarUnitMinute; // 3.調度通知(啟動任務,在規定的時間發出通知) [[UIApplication sharedApplication]scheduleLocalNotification:ln]; // 直接發出通知沒意義 // [[UIApplication sharedApplication]presentLocalNotificationNow:ln]; } } - (IBAction)noSchedule:(UIButton *)sender { // [[UIApplication sharedApplication]cancelAllLocalNotifications]; // 已經發出且過期的通知會從數組裡自動移除 NSArray *notes = [UIApplication sharedApplication].scheduledLocalNotifications; NSLog(@"%@",notes); } - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(UILocalNotification *)note { DetailViewController *detailVC = segue.destinationViewController; detailVC.userInfo = note.userInfo; } @end
2.通知詳情頁面設置基本屬性:
.h #import@interface DetailViewController : UIViewController @property (nonatomic, strong) NSDictionary *userInfo; @end .m #import "DetailViewController.h" @interface DetailViewController () @property (weak, nonatomic) IBOutlet UILabel *userInfoContent; @end @implementation DetailViewController - (void)viewDidLoad { [super viewDidLoad]; self.userInfoContent.text = self.userInfo[@"body"]; } - (void)setUserInfo:(NSDictionary *)userInfo { _userInfo = userInfo; } @end
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //注冊本地通知 if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)]){ [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil]]; } // NSLog(@"-----didFinishLaunchingWithOptions---"); UILabel *label = [[UILabel alloc]init]; label.frame = CGRectMake(0, 64, 320, 100); label.backgroundColor = [UIColor redColor]; label.font = [UIFont systemFontOfSize:11]; label.numberOfLines = 0; label.textColor = [UIColor whiteColor]; label.text = [launchOptions description]; [[[self.window.rootViewController.childViewControllers firstObject] view]addSubview:label]; UILocalNotification *note = launchOptions[UIApplicationLaunchOptionsURLKey]; if (note) { label.text = @"點擊本地通知啟動的程序"; }else{ label.text = @"直接點擊app圖標啟動的程序"; } self.label = label; return YES; } /** * 當用戶點擊本地通知進入app的時候調用(app當時並沒有被關閉) * 若app已關閉不會被調用此方法 */ - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { self.label.text = @"點擊通知再次回到前台"; ViewController *homeVC = [self.window.rootViewController.childViewControllers firstObject]; // [homeVC performSegueWithIdentifier:@"toHome" sender:notification]; [homeVC performSegueWithIdentifier:@"toHome" sender:notification]; }三種情況展示:(重要)
1.程序運行在後台