本地通知是由本地應用觸發(fā)的,它是基于時間行為的一種通知形式,例如鬧鐘定時、待辦事項提醒,又或者一個應用在一段時候后不使用通常會提示用戶使用此應用等都是本地通知。創(chuàng)建一個本地通知通常分為以下幾個步驟:
1 創(chuàng)建UILocalNotification。
2 設置處理通知的時間fireDate。
3 配置通知的內(nèi)容:通知主體、通知聲音、圖標數(shù)字等。
4 配置通知傳遞的自定義數(shù)據(jù)參數(shù)userInfo(這一步可選)。
5 調(diào)用通知,可以使用scheduleLocalNotification:按計劃調(diào)度一個通知,也可以使用presentLocalNotificationNow立即調(diào)用通知。
? ? ? ? 下面就以一個程序更新后用戶長期沒有使用的提醒為例對本地通知做一個簡單的了解。在這個過程中并沒有牽扯太多的界面操作,所有的邏輯都在AppDelegate中:進入應用后如果沒有注冊通知,需要首先注冊通知請求用戶允許通知;一旦調(diào)用完注冊方法,無論用戶是否選擇允許通知此刻都會調(diào)用應用程序的- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings代理方法,在這個方法中根據(jù)用戶的選擇:如果是允許通知則會按照前面的步驟創(chuàng)建通知并在一定時間后執(zhí)行。
AppDelegate.m ? ?中
//
//? AppDelegate.m
//? LocalNotification
//
//? Created by Kenshin Cui on 14/03/28.
//? Copyright (c) 2014年 Kenshin Cui. All rights reserved.
//
#import "AppDelegate.h"
#import "KCMainViewController.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
#pragma mark - 應用代理方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
_window=[[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
_window.backgroundColor =[UIColor colorWithRed:249/255.0 green:249/255.0 blue:249/255.0 alpha:1];
//設置全局導航條風格和顏色
[[UINavigationBar appearance] setBarTintColor:[UIColor colorWithRed:23/255.0 green:180/255.0 blue:237/255.0 alpha:1]];
[[UINavigationBar appearance] setBarStyle:UIBarStyleBlack];
KCMainViewController *mainController=[[KCMainViewController alloc]init];
_window.rootViewController=mainController;
[_window makeKeyAndVisible];
//如果已經(jīng)獲得發(fā)送通知的授權則創(chuàng)建本地通知,否則請求授權(注意:如果不請求授權在設置中是沒有對應的通知設置項的,也就是說如果從來沒有發(fā)送過請求,即使通過設置也打不開消息允許設置)
if ([[UIApplication sharedApplication]currentUserNotificationSettings].types!=UIUserNotificationTypeNone) {
[self addLocalNotification];
}else{
[[UIApplication sharedApplication]registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound? categories:nil]];
}
return YES;
}
#pragma mark 調(diào)用過用戶注冊通知方法之后執(zhí)行(也就是調(diào)用完registerUserNotificationSettings:方法之后執(zhí)行)
-(void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings{
if (notificationSettings.types!=UIUserNotificationTypeNone) {
[self addLocalNotification];
}
}
#pragma mark 進入前臺后設置消息信息
-(void)applicationWillEnterForeground:(UIApplication *)application{
[[UIApplication sharedApplication]setApplicationIconBadgeNumber:0];//進入前臺取消應用消息圖標
}
#pragma mark - 私有方法
#pragma mark 添加本地通知
-(void)addLocalNotification{
//定義本地通知對象
UILocalNotification *notification=[[UILocalNotification alloc]init];
//設置調(diào)用時間
notification.fireDate=[NSDate dateWithTimeIntervalSinceNow:10.0];//通知觸發(fā)的時間,10s以后
notification.repeatInterval=2;//通知重復次數(shù)
//notification.repeatCalendar=[NSCalendar currentCalendar];//當前日歷,使用前最好設置時區(qū)等信息以便能夠自動同步時間
//設置通知屬性
notification.alertBody=@"最近添加了諸多有趣的特性,是否立即體驗?"; //通知主體
notification.applicationIconBadgeNumber=1;//應用程序圖標右上角顯示的消息數(shù)
notification.alertAction=@"打開應用"; //待機界面的滑動動作提示
notification.alertLaunchImage=@"Default";//通過點擊通知打開應用時的啟動圖片,這里使用程序啟動圖片
//notification.soundName=UILocalNotificationDefaultSoundName;//收到通知時播放的聲音,默認消息聲音
notification.soundName=@"msg.caf";//通知聲音(需要真機才能聽到聲音)
//設置用戶信息
notification.userInfo=@{@"id":@1,@"user":@"Kenshin Cui"};//綁定到通知上的其他附加信息
//調(diào)用通知
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
}
#pragma mark 移除本地通知,在不需要此通知時記得移除
-(void)removeNotification{
[[UIApplication sharedApplication] cancelAllLocalNotifications];
}
@end
注意:通知中心在用完之后應該將它手動的給注銷:無論是MRC還是ARC中
方法一:最好
在 UIViewController.m 中:
-(void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
方法二:
找適當?shù)牡胤綄⑺瞥?/p>
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"Notification_GetUserProfileSuccess"object:nil];