這兩天在做一個(gè)日程提醒功能官扣,用UILocalNotification做日程的提醒功能翅敌,相關(guān)知識(shí)如下:
一、本地通知的定義和使用:
本地通知是UILocalNotification的實(shí)例惕蹄,主要有三類屬性:
scheduled time蚯涮,時(shí)間周期治专,用來指定iOS系統(tǒng)發(fā)送通知的日期和時(shí)間;
notification type遭顶,通知類型张峰,包括警告信息、動(dòng)作按鈕的標(biāo)題液肌、應(yīng)用圖標(biāo)上的badge(數(shù)字標(biāo)記)和播放的聲音挟炬;
自定義數(shù)據(jù),本地通知可以包含一個(gè)dictionary類型的本地?cái)?shù)據(jù)嗦哆。
對(duì)本地通知的數(shù)量限制谤祖,iOS最多允許最近本地通知數(shù)量是64個(gè),超過限制的本地通知將被iOS忽略老速。
代碼如下:
```
UILocalNotification *localNotification = [[UILocalNotification alloc] init];
if (localNotification == nil) {
return;
}
//設(shè)置本地通知的觸發(fā)時(shí)間(如果要立即觸發(fā)粥喜,無需設(shè)置),這里設(shè)置為20妙后
localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:20];
//設(shè)置本地通知的時(shí)區(qū)
localNotification.timeZone = [NSTimeZone defaultTimeZone];
//設(shè)置通知的內(nèi)容
localNotification.alertBody = affair.title;
//設(shè)置通知?jiǎng)幼靼粹o的標(biāo)題
localNotification.alertAction = @"查看”;
//設(shè)置提醒的聲音橘券,可以自己添加聲音文件额湘,這里設(shè)置為默認(rèn)提示聲
localNotification.soundName = UILocalNotificationDefaultSoundName;
//設(shè)置通知的相關(guān)信息,這個(gè)很重要旁舰,可以添加一些標(biāo)記性內(nèi)容锋华,方便以后區(qū)分和獲取通知的信息
NSDictionary *infoDic = [NSDictionary dictionaryWithObjectsAndKeys:LOCAL_NOTIFY_SCHEDULE_ID,@"id",[NSNumber numberWithInteger:time],@"time",[NSNumber numberWithInt:affair.aid],@"affair.aid", nil];
localNotification.userInfo = infoDic;
//在規(guī)定的日期觸發(fā)通知
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
//立即觸發(fā)一個(gè)通知
//? ? [[UIApplication sharedApplication] presentLocalNotificationNow:localNotification];
[localNotification release];
```
二、取消本地通知:
代碼如下
```
//取消某一個(gè)通知
NSArray *notificaitons = [[UIApplication sharedApplication] scheduledLocalNotifications];
//獲取當(dāng)前所有的本地通知
if (!notificaitons || notificaitons.count <= 0) {
return;
}
for (UILocalNotification *notify in notificaitons) {
if ([[notify.userInfo objectForKey:@"id"] isEqualToString:LOCAL_NOTIFY_SCHEDULE_ID]) {
//取消一個(gè)特定的通知
[[UIApplication sharedApplication] cancelLocalNotification:notify];
break;
}
}
//取消所有的本地通知
[[UIApplication sharedApplication] cancelAllLocalNotifications];
```
三箭窜、本地通知的響應(yīng):
如果已經(jīng)注冊(cè)了本地通知毯焕,當(dāng)客戶端響應(yīng)通知時(shí):
a、應(yīng)用程序在后臺(tái)的時(shí)候磺樱,本地通知會(huì)給設(shè)備送達(dá)一個(gè)和遠(yuǎn)程通知一樣的提醒纳猫,提醒的樣式由用戶在手機(jī)設(shè)置中設(shè)置
b、應(yīng)用程序正在運(yùn)行中竹捉,則設(shè)備不會(huì)收到提醒芜辕,但是會(huì)走應(yīng)用程序delegate中的方法:
代碼如下
```
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
}
```
,如果你想實(shí)現(xiàn)程序在后臺(tái)時(shí)候的那種提醒效果,可以在上面這個(gè)方法中添加相關(guān)代碼块差,示例代碼:
代碼如下
```
if ([[notification.userInfo objectForKey:@"id"] isEqualToString:@"affair.schedule"]) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"test" message:notification.alertBody delegate:nil cancelButtonTitle:@"關(guān)閉" otherButtonTitles:notification.alertAction, nil nil];
[alert show];
}
```
需要注意的是侵续,在情況a中,如果用戶點(diǎn)擊提醒進(jìn)入應(yīng)用程序憾儒,也會(huì)執(zhí)行收到本地通知的回調(diào)方法询兴,這種情況下如果你添加了上面那段代碼,則會(huì)出現(xiàn)連續(xù)出現(xiàn)兩次提示起趾,為了解決這個(gè)問題诗舰,修改代碼如下:
代碼如下
```
if ([[notification.userInfo objectForKey:@"id"] isEqualToString:@"affair.schedule"]) {
//判斷應(yīng)用程序當(dāng)前的運(yùn)行狀態(tài),如果是激活狀態(tài)训裆,則進(jìn)行提醒眶根,否則不提醒
if (application.applicationState == UIApplicationStateActive) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"test" message:notification.alertBody delegate:nil cancelButtonTitle:@"關(guān)閉" otherButtonTitles:notification.alertAction, nil nil];
[alert show];
}
}
```