1. 程式人生 > >iOS 本地通知:UILocalNotification

iOS 本地通知:UILocalNotification

在去年做過一個小App,其中使用的關鍵功能就是向用戶傳送本地通知,可惜當時沒有寫部落格的習慣,所以沒有將對應的知識記錄下來。最近又遇到了該功能的使用,這一次果斷寫個部落格做下有關UILocalNotification的筆記。

首先是新增一個本地通知到系統中,程式碼如下:

  1. // 初始化本地通知物件
  2. UILocalNotification *notification = [[UILocalNotification alloc] init];  
  3. if (notification) {  
  4.     // 設定通知的提醒時間
  5.     NSDate *currentDate   = [NSDate
     date];  
  6.     notification.timeZone = [NSTimeZone defaultTimeZone]; // 使用本地時區
  7.     notification.fireDate = [currentDate dateByAddingTimeInterval:5.0];  
  8.     // 設定重複間隔
  9.     notification.repeatInterval = kCFCalendarUnitDay;  
  10.     // 設定提醒的文字內容
  11.     notification.alertBody   = @"Wake up, man";  
  12.     notification.alertAction
     = NSLocalizedString(@"起床了", nil);  
  13.     // 通知提示音 使用預設的
  14.     notification.soundName= UILocalNotificationDefaultSoundName;  
  15.     // 設定應用程式右上角的提醒個數
  16.     notification.applicationIconBadgeNumber++;  
  17.     // 設定通知的userInfo,用來標識該通知
  18.     NSMutableDictionary *aUserInfo = [[NSMutableDictionary alloc] init];  
  19.     aUserInfo[kLocalNotificationID] = @"LocalNotificationID"
    ;  
  20.     notification.userInfo = aUserInfo;  
  21.     // 將通知新增到系統中
  22.     [[UIApplication sharedApplication] scheduleLocalNotification:notification];  
  23. }  

上面的alertBody是裝置收到本地通知時橫額或鎖屏時的主要文字內容,alertActions是鎖屏時顯示的slide to後面的文字內容。例如:


repeatInterval表示通知的重複間隔,在SDK中定義如下:

  1. @property(nonatomic) NSCalendarUnit repeatInterval;      // 0 means don't repeat

其取值主要有:
  1. NSCalendarUnitEra                = kCFCalendarUnitEra,  
  2. NSCalendarUnitYear               = kCFCalendarUnitYear,  
  3. NSCalendarUnitMonth              = kCFCalendarUnitMonth,  
  4. NSCalendarUnitDay                = kCFCalendarUnitDay,  
  5. NSCalendarUnitHour               = kCFCalendarUnitHour,  
  6. NSCalendarUnitMinute             = kCFCalendarUnitMinute,  
  7. NSCalendarUnitSecond             = kCFCalendarUnitSecond,  
  8. NSCalendarUnitWeekday            = kCFCalendarUnitWeekday,  
  9. NSCalendarUnitWeekdayOrdinal     = kCFCalendarUnitWeekdayOrdinal,  

分別表示一個世紀、一年、一個月等等,0表示不重複。具體可以檢視CFCalendar Reference

repeatInterval的下限應該是NSCalendarUnitMinute,即每分鐘重複傳送一次通知。

如果設定為NSCalendarUnitSecond,那麼訊息不會重複,每秒傳送一次通知,iOS系統當然不會容許這樣的存在了。

這裡比較不好的一點是該值不能自定義(很遺憾,NSCalendarUnit是個列舉型別),例如你不能塞個10.0給它從而希望它每十秒重複一次。所以如果你想每20分鐘傳送一次通知,一小時內傳送3次,那麼只能同時設定三個通知了。

上面的程式碼執行後,5秒鐘之後就可以收到一個本地通知。

在收到通知後,呼叫程式委託中的下列方法處理:

  1. -(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{  
  2.     NSLog(@"Application did receive local notifications");  
  3.     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Hello" message:@"welcome" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil nil];  
  4.     [alert show];  
  5. }  

注意這個方法只有在程式啟動之後才會執行,因此當程式處於後臺時,該方法不會執行。

有一點需要注意,如果我們的應用程式給系統傳送的本地通知是週期性的,那麼即使把程式刪了重灌,之前的本地通知在重灌時依然存在(沒有從系統中移除)。例如,我們在viewDidLoad方法中啟動新增本地通知的方法,多跑幾次,然後把程式在模擬器中刪除,再重新跑,並用下列方法輸出所有的本地通知:

  1. NSArray *localNotifications = [[UIApplication sharedApplication] scheduledLocalNotifications];  
  2. NSLog(@"%@", localNotifications);  

控制檯輸出:
  1. 2014-03-14 15:46:37.145 LocalNotificationDemo[4419:60b] (  
  2.     "<UIConcreteLocalNotification: 0xa32ce30>{fire date = Friday, March 14, 2014 at 3:38:16 PM China Standard Time, time zone = Asia/Chongqing (GMT+8) offset 28800, repeat interval = NSDayCalendarUnit, repeat count = UILocalNotificationInfiniteRepeatCount, next fire date = Saturday, March 15, 2014 at 3:38:16 PM China Standard Time, user info = {\n    ClockID = LocalNotificationID;\n}}",  
  3.     "<UIConcreteLocalNotification: 0xa32dfc0>{fire date = Friday, March 14, 2014 at 3:44:45 PM China Standard Time, time zone = Asia/Chongqing (GMT+8) offset 28800, repeat interval = NSDayCalendarUnit, repeat count = UILocalNotificationInfiniteRepeatCount, next fire date = Saturday, March 15, 2014 at 3:44:45 PM China Standard Time, user info = {\n    ClockID = LocalNotificationID;\n}}",  
  4.     "<UIConcreteLocalNotification: 0xa32e470>{fire date = Friday, March 14, 2014 at 3:44:55 PM China Standard Time, time zone = Asia/Chongqing (GMT+8) offset 28800, repeat interval = NSDayCalendarUnit, repeat count = UILocalNotificationInfiniteRepeatCount, next fire date = Saturday, March 15, 2014 at 3:44:55 PM China Standard Time, user info = {\n    ClockID = LocalNotificationID;\n}}",  
  5.     "<UIConcreteLocalNotification: 0xa32e950>{fire date = Friday, March 14, 2014 at 3:45:13 PM China Standard Time, time zone = Asia/Chongqing (GMT+8) offset 28800, repeat interval = NSDayCalendarUnit, repeat count = UILocalNotificationInfiniteRepeatCount, next fire date = Saturday, March 15, 2014 at 3:45:13 PM China Standard Time, user info = {\n    ClockID = LocalNotificationID;\n}}",  
  6.     "<UIConcreteLocalNotification: 0xa32edb0>{fire date = Friday, March 14, 2014 at 3:45:29 PM China Standard Time, time zone = Asia/Chongqing (GMT+8) offset 28800, repeat interval = NSDayCalendarUnit, repeat count = UILocalNotificationInfiniteRepeatCount, next fire date = Saturday, March 15, 2014 at 3:45:29 PM China Standard Time, user info = {\n    ClockID = LocalNotificationID;\n}}",  
  7.     "<UIConcreteLocalNotification: 0xa32e870>{fire date = Friday, March 14, 2014 at 3:46:28 PM China Standard Time, time zone = Asia/Chongqing (GMT+8) offset 28800, repeat interval = NSDayCalendarUnit, repeat count = UILocalNotificationInfiniteRepeatCount, next fire date = Saturday, March 15, 2014 at 3:46:28 PM China Standard Time, user info = {\n    ClockID = LocalNotificationID;\n}}"  
  8. )  

可以看到之前傳送的本地通知一直滯留在系統中。

不只是模擬器,在iOS裝置上也是這樣,博主之前的App在裝置上重灌時以前的本地通知會繼續傳送。

因此我們需要取消通知的方法,當然該物件也會在scheduledLocalNotifications陣列中移除。

取消方法分為兩種。

第一種比較暴力,直接取消所有的本地通知:

  1. [[UIApplication sharedApplication] cancelAllLocalNotifications];  

這個適合在App重灌時第一次啟動的時候,或還原程式預設設定等場合下使用。

第二種方法是針對某個特定通知的:

  1. - (void)cancelLocalNotification:(UILocalNotification *)notification NS_AVAILABLE_IOS(4_0);  

這時就需要通知有一個標識,這樣我們才能定位是哪一個通知。可以在notification的userInfo(一個字典)中指定。

例如:

  1. -(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{  
  2.     NSLog(@"Application did receive local notifications");  
  3.     // 取消某個特定的本地通知
  4.     for (UILocalNotification *noti in [[UIApplication sharedApplication] scheduledLocalNotifications]) {  
  5.         NSString *notiID = noti.userInfo[kLocalNotificationID];  
  6.         NSString *receiveNotiID = notification.userInfo[kLocalNotificationID];  
  7.         if ([notiID isEqualToString:receiveNotiID]) {  
  8.             [[UIApplication sharedApplication] cancelLocalNotification:notification];  
  9.             return;  
  10.         }  
  11.     }  
  12.     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Hello" message:@"welcome" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil nil];  
  13.     [alert show];  
  14. }  


最後建議本地通知不要發得太頻繁,不然使用者會覺得非常的煩。


參考的文章和資料:

相關推薦

iOS 本地通知UILocalNotification

在去年做過一個小App,其中使用的關鍵功能就是向用戶傳送本地通知,可惜當時沒有寫部落格的習慣,所以沒有將對應的知識記錄下來。最近又遇到了該功能的使用,這一次果斷寫個部落格做下有關UILocalNotification的筆記。 首先是新增一個本地通知到系統中,程式碼如下

iOS開發---本地通知UILocalNotification

iOS中通知機制又叫訊息機制,其包括兩類:一類是本地通知;另一類是推送通知,也叫遠端通知。 本地通知是由本地應用觸發的,它是基於時間行為的一種通知形式,例如鬧鐘定時、待辦事項提醒,又或者一個應用在一段時候後不使用通常會提示使用者使用此應用等都是本地通知。建立一

iOS 本地通知的實現

iOS本地通知 所有的邏輯都在AppDelegate中, 一個程式更新後用戶長時間沒有使用的提醒 由本地應用觸發的, 它是基於時間行為的一種通知形式, 例如鬧鐘, 提醒事項, 過了一段時間後臺程式提醒使用者使用該應用 iOS 通知機制又叫做訊息機制, 包括(本地通知, 推送

IOS 本地通知和遠端通知

本篇文章主要是整理一下有關通知的相關知識。主要介紹: 本地通知遠端通知本文參考: 本地通知 本地通知,local notification,用於基於時間行為的通知,比如有關日曆或者todo列表的小應用。另外,應用如果在後臺執行,iOS允許它在受限的時間內執行,它也會發現本

iOS本地通知或者本地推送的使用

遠端推送基本都沒啥問題,按規範來走,證書做好給伺服器,本地載入上證書基本都是可以實現的。 本地通知就需要自己建立通知,傳送通知,比遠端多了這兩步,一般的會有幾個需要注意的地方: 1,iOS8-iOS10是一套發通知方法,10以後是一套方法; 2,通知可能不顯示,可能會覆

IOS使用本地通知(UILocalNotification)刪除應用角標小紅點不刪除通知中心內容

1.本地通知需要當應用在後臺時執行,比如放在applicationDidEnterBackground方法裡; 2.需要註冊通知 - (BOOL)application:(UIApplication

iOS 推送通知:本地通知(UILocalNotification)和遠端通知(APNs)詳解

——本地推送通知 推送通知的作用? 在App退到後臺或者完全退出時,可以使用通知來告訴使用者某件事情,比如推送新的聊天訊息、新聞等 通知對應的效果: 在主螢幕的頂端會出現通知訊息 當手機鎖屏時出現在鎖屏介面,可以通過滑動開啟該App, 在通知中心中

iOS本地推送與取消本地通知UILocalNotification的使用

1.首先我們初始化一個 UISwith self.swith = [[UISwitch alloc] initWithFrame:CGRectMake(80, 80, 160, 30)]; [_swith addTarget:self action:@se

iOS開發--本地通知與遠程通知

授權 atom nbsp sel bject 面試 tar 生效 nat iOS開發--本地通知與遠程通知 作者 雷潮 關註 2016.02.01 00:18* 字數 1921 閱讀 8898評論 1喜歡 41 這裏是指推送通知跟NSNotification有區別

ios開發之本地通知

概述: 在多數移動應用中任何時候都只能有一個應用程式處於活躍狀態,如果其他應用此刻發生了一些使用者感興趣的那麼通過通知機制就可以告訴使用者此時發生的事情。ios中通知機制又叫訊息機制,其包括兩類:一類是本地通知;另一類是推送通知。也叫遠端通知。兩種通知在ios中表現一致,可

iOS 10前後兩種本地通知

引 通知大家都不陌生,其實通知分兩種,遠端通知和本地通知。 遠端通知是指伺服器發出的通知,通過蘋果的推送然後到達使用者裝置。本地通知是指不通過網路,直接安裝應用後就可以接到通知了,典型的例子是日曆、待辦、鬧鐘等應用。 不過就表現形式來說兩者基本一樣,都會出

iOS後臺下載圖片並實現本地通知(Swift)

有的時候我們需要APP進入後臺後能夠自動下載更新一些東西所以這裡就說下iOS程式的後臺下載任務,前面的部落格說過要想進行後臺任務就要在plist檔案中進行註冊,這裡註冊Required background modes選項,值是App downloads con

iOS本地推送(本地通知

在iOS8之後,以前的本地推送寫法可能會出錯,接收不到推送的資訊, 如果出現以下資訊: 1 Attempting to schedule a local notification 2 with an

UILocalNotification 本地通知無法刪除的坑

// 1.建立本地通知 UILocalNotification *localNote = [[UILocalNotification alloc] init]; // 2.設定本地通知的內容 // 2.1.設定通知發出的時間 localNote.fireDate

ios-利用本地通知跳轉到應用程式指定介面

我們如果想要點選按鈕跳轉到相應的介面的話我們可以這麼做,舉個例子,就拿UITabBarController來說事,控制器如下所示 比如說我們在前臺的時候,我們可以通過傳送通知就能實現應用程式的跳轉,我們可以傳送以下的通知,然後去拼接UNMutableNotificatio

iOS應用在前臺時彈出本地通知

在appdelegate中實現如下方法 //iOS10新增:處理前臺收到通知的代理方法 -(void)userNotificationCenter:(UNUserNotificationCenter

從零開始學習iOS開發1認識xcode

連接 啟動圖標 主動 認識 tor 音樂 滴滴打車 啟動 and 在開始之前還是不得不提一下iPhone應用開發的工具,我當然之前是沒接觸過iPhone開發,也沒使用過apple的不論什麽一種設備。所以我的概念中僅僅知道xcode是最專業的iOS開發工具。如今它是免費

iOS本地照片多選的實現

-s 問題: tail 滾動 英文 返回 library ans cal 提示:iOS8須要更改一處代碼。即設置scrollview滾動究竟部那塊代碼。大家可去掉再執行源代碼 自己寫起來還是蠻費事的!本來打算使用網上流傳非常久的ELCImagePickerControl

iOS 本地項目上傳github,github管理項目配置

one https images 建倉 灰色 項目 con ssh keys 隱藏 一、註冊github賬號 首先需要註冊一個github賬號,註冊地址:https://github.com 接著會來到這 然後會收到一封github發的郵件,進入

COCOS2D-X 3.0在MAC下創建新IOS項目

col size clas ios 版本號 ons -m 創建 版本 首先進入:CocoStudio\Source\3.0\cocos2d-x\tools\cocos2d-console\bin 運行 ./cocos new -p com.aaaa -l cpp