當前位置:編程學習大全網 - 編程語言 - iOS 開發 本地通知:UILocalNotification

iOS 開發 本地通知:UILocalNotification

首先是添加壹個本地通知到系統中,代碼如下:

// 初始化本地通知對象

UILocalNotification *notification = [[UILocalNotification alloc] init];

if (notification) {

// 設置通知的提醒時間

NSDate *currentDate = [NSDate date];

notification.timeZone = [NSTimeZone defaultTimeZone]; // 使用本地時區

notification.fireDate = [currentDate dateByAddingTimeInterval:5.0];

// 設置重復間隔

notification.repeatInterval = kCFCalendarUnitDay;

// 設置提醒的文字內容

notification.alertBody = @"Wake up, man";

notification.alertAction = NSLocalizedString(@"起床了", nil);

// 通知提示音 使用默認的

notification.soundName= UILocalNotificationDefaultSoundName;

// 設置應用程序右上角的提醒個數

notification.applicationIconBadgeNumber++;

// 設定通知的userInfo,用來標識該通知

NSMutableDictionary *aUserInfo = [[NSMutableDictionary alloc] init];

aUserInfo[kLocalNotificationID] = @"LocalNotificationID";

notification.userInfo = aUserInfo;

// 將通知添加到系統中

[[UIApplication sharedApplication] scheduleLocalNotification:notification];

}

上面的alertBody是設備收到本地通知時橫額或鎖屏時的主要文字內容,alertActions是鎖屏時顯示的slide to後面的文字內容

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

其取值主要有:

NSCalendarUnitEra = kCFCalendarUnitEra,

NSCalendarUnitYear = kCFCalendarUnitYear,

NSCalendarUnitMonth = kCFCalendarUnitMonth,

NSCalendarUnitDay = kCFCalendarUnitDay,

NSCalendarUnitHour = kCFCalendarUnitHour,

NSCalendarUnitMinute = kCFCalendarUnitMinute,

NSCalendarUnitSecond = kCFCalendarUnitSecond,

NSCalendarUnitWeekday = kCFCalendarUnitWeekday,

NSCalendarUnitWeekdayOrdinal = kCFCalendarUnitWeekdayOrdinal,

分別表示壹個世紀、壹年、壹個月等等,0表示不重復。具體可以查看CFCalendar Reference

repeatInterval的下限應該是NSCalendarUnitMinute,即每分鐘重復發送壹次通知。

如果設置為NSCalendarUnitSecond,那麽消息不會重復,每秒發送壹次通知,iOS系統當然不會容許這樣的存在了。

這裏比較不好的壹點是該值不能自定義(很遺憾,NSCalendarUnit是個枚舉類型),例如妳不能塞個10.0給它從而希望它每十秒重復壹次。所以如果妳想每20分鐘發送壹次通知,壹小時內發送3次,那麽只能同時設定三個通知了。

上面的代碼運行後,5秒鐘之後就可以收到壹個本地通知。

在收到通知後,調用程序委托中的下列方法處理:

-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{

NSLog(@"Application did receive local notifications");

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Hello" message:@"welcome" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];

[alert show];

}

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

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

NSArray *localNotifications = [[UIApplication sharedApplication] scheduledLocalNotifications];

NSLog(@"%@", localNotifications);

控制臺輸出:

2014-03-14 15:46:37.145 LocalNotificationDemo[4419:60b] (

"{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}}",

"{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}}",

"{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}}",

"{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}}",

"{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}}",

"{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}}"

)

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

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

因此我們需要取消通知的方法,當然該對象也會在scheduledLocalNotifications數組中移除。

取消方法分為兩種。

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

[[UIApplication sharedApplication] cancelAllLocalNotifications];

這個適合在App重裝時第壹次啟動的時候,或還原程序默認設置等場合下使用。

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

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

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

例如:

-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{

NSLog(@"Application did receive local notifications");

// 取消某個特定的本地通知

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

NSString *notiID = noti.userInfo[kLocalNotificationID];

NSString *receiveNotiID = notification.userInfo[kLocalNotificationID];

if ([notiID isEqualToString:receiveNotiID]) {

[[UIApplication sharedApplication] cancelLocalNotification:notification];

return;

}

}

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Hello" message:@"welcome" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];

[alert show];

}

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

  • 上一篇:區塊鏈到底是什麽?能賺錢嗎
  • 下一篇:計算機設備的種類
  • copyright 2024編程學習大全網