前言
最近需要實(shí)現(xiàn)本地通知提醒功能,研究了下本地推送
通知實(shí)現(xiàn)
1.注冊(cè)通知
+ (void)registerLocalNotification:(NSInteger)alertTime string:(NSString *)string key:(NSString *)key{
UILocalNotification *notification = [[UILocalNotification alloc] init];
// 設(shè)置觸發(fā)通知的時(shí)間
//需要使用時(shí)間戳
NSDate *fireDate = [NSDate dateWithTimeIntervalSince1970:alertTime];
NSLog(@"fireDate=%@",fireDate);
notification.fireDate = fireDate;
// 時(shí)區(qū)
notification.timeZone = [NSTimeZone defaultTimeZone];
// 設(shè)置重復(fù)的間隔
notification.repeatInterval = 0;//0表示不重復(fù)
// 通知內(nèi)容
notification.alertBody = string;
notification.applicationIconBadgeNumber = 1;
// 通知被觸發(fā)時(shí)播放的聲音
notification.soundName = UILocalNotificationDefaultSoundName;
// 通知參數(shù)
NSDictionary *userDict = [NSDictionary dictionaryWithObject:string forKey:key];
notification.userInfo = userDict;
// ios8后隶糕,需要添加這個(gè)注冊(cè)识藤,才能得到授權(quán)
if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) {
UIUserNotificationType type = UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound;
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:type
categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
// 通知重復(fù)提示的單位,可以是天在验、周彩倚、月
// notification.repeatInterval = NSCalendarUnitDay;
} else {
// 通知重復(fù)提示的單位,可以是天卷要、周渣聚、月
// notification.repeatInterval = NSDayCalendarUnit; //ios7使用
}
// 執(zhí)行通知注冊(cè)
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
}
2.取消通知
+ (void)cancelLocalNotificationWithKey:(NSString *)key {
// 獲取所有本地通知數(shù)組
NSArray *localNotifications = [UIApplication sharedApplication].scheduledLocalNotifications;
for (UILocalNotification *notification in localNotifications) {
NSDictionary *userInfo = notification.userInfo;
if (userInfo) {
// 根據(jù)設(shè)置通知參數(shù)時(shí)指定的key來獲取通知參數(shù)
NSString *info = userInfo[key];
// 如果找到需要取消的通知独榴,則取消
if (info != nil) {
[[UIApplication sharedApplication] cancelLocalNotification:notification];
break;
}
}
}
}
3.在AppDelegate可以收到本地通知的回調(diào),當(dāng)然前提是你在程序內(nèi)部
// 本地通知回調(diào)函數(shù)饵逐,當(dāng)應(yīng)用程序在前臺(tái)時(shí)調(diào)用
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
NSLog(@"noti:%@",notification);
[[NSNotificationCenter defaultCenter]postNotificationName:@"RefreshList" object:nil];
// 更新顯示的徽章個(gè)數(shù)
NSInteger badge = [UIApplication sharedApplication].applicationIconBadgeNumber;
badge--;
badge = badge >= 0 ? badge : 0;
[UIApplication sharedApplication].applicationIconBadgeNumber = badge;
}
注意
1.iOS系統(tǒng)沒有自定義時(shí)間間隔的通知括眠,如果要實(shí)現(xiàn)類似功能需要注冊(cè)多個(gè)通知
2.如果重復(fù)次數(shù)為0的話,通知了一次這個(gè)通知就會(huì)從系統(tǒng)消除
3.如果你的通知沒有消除倍权,即使卸載了程序掷豺,這依然會(huì)殘留,在下次裝入的時(shí)候會(huì)繼續(xù)運(yùn)行薄声,如果想要移除本地通知可以調(diào)用UIApplication的cancelLocalNotification:或cancelAllLocalNotifications移除指定通知或所有通知
4.在使用通知之前必須注冊(cè)通知類型当船,如果用戶不允許應(yīng)用程序發(fā)送通知,則以后就無法發(fā)送通知默辨,除非用戶手動(dòng)到iOS設(shè)置中打開通知
5.通知的聲音是由iOS系統(tǒng)播放的德频,格式必須是Linear PCM、MA4(IMA/ADPCM)缩幸、μLaw壹置、aLaw中的一種,并且播放時(shí)間必須在30s內(nèi)表谊,否則將被系統(tǒng)聲音替換钞护,同時(shí)自定義聲音文件必須放到main boundle中
6.本地通知的數(shù)量是有限制的,最近的本地通知最多只能有64個(gè)爆办,超過這個(gè)數(shù)量將被系統(tǒng)忽略