Notification是智能手機應用編程中很是經常使用的一種傳遞信息的機制,並且能夠很是好的節省資源,不用消耗資源來不停地檢查信息狀態(Pooling),在iOS下應用分爲兩種不一樣的Notification種類,本地和遠程。本地的Notification由iOS下NotificationManager統一管理,只須要將封裝好的本地Notification對象加入到系統Notification管理機制隊列中,系統會在指定的時間激發將本地Notification,應用只需設計好處理Notification的方法就完成了整個Notification流程了。android
本地Notification所使用的對象是UILocalNotification,UILocalNotification的屬性涵蓋了全部處理Notification須要的內容。UILocalNotification的屬性有fireDate、timeZone、repeatInterval、repeatCalendar、alertBody、 alertAction、hasAction、alertLaunchImage、applicationIconBadgeNumber、 soundName和userInfo。編程
UILocalNotification的調度api
其中fireDate、timeZone、repeatInterval和repeatCalendar是用於UILocalNotification的調度。fireDate是UILocalNotification的激發的確切時間。timeZone是UILocalNotification激發時間是否根據時區改變而改變,若是設置爲nil的話,那麼UILocalNotification將在一段時候後被激發,而不是某一個確切時間被激發。 repeatInterval是UILocalNotification被重複激發之間的時間差,不過期間差是徹底根據日曆單位(NSCalendarUnit)的,例如每週激發的單位,NSWeekCalendarUnit,若是不設置的話,將不會重複激發。 repeatCalendar是UILocalNotification重複激發所使用的日曆單位須要參考的日曆,若是不設置的話,系統默認的日曆將被做爲參考日曆。數組
UILocalNotification的提醒內容服務器
alertBody、alertAction、hasAction和alertLaunchImage是當應用不在運行時,系統處理併發
一、增長一個本地推送app
//設置20秒以後 ide
NSDate *date = [NSDate dateWithTimeIntervalSinceNow:20];ui
/*spa
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"HH:mm:ss"];
NSDate *now = [formatter dateFromString:@"15:00:00"];//觸發通知的時間
*/
//chuagjian
一個本地推送
UILocalNotification *noti = [[[UILocalNotification alloc] init] autorelease];
if (noti) {
//設置推送時間
noti.fireDate = date;//=now
//設置時區
noti.timeZone = [NSTimeZone defaultTimeZone];
//設置重複間隔
noti.repeatInterval = NSWeekCalendarUnit;
//推送聲音
noti.soundName = UILocalNotificationDefaultSoundName;
//內容
noti.alertBody = @"推送內容";
//顯示在icon上的紅色圈中的數子
noti.applicationIconBadgeNumber = 1;
//設置userinfo 方便在以後須要撤銷的時候使用
NSDictionary *infoDic = [NSDictionary dictionaryWithObject:@"name" forKey:@"key"];
noti.userInfo = infoDic;
//添加推送到uiapplication
UIApplication *app = [UIApplication sharedApplication];
[app scheduleLocalNotification:noti];
}
二、程序運行時接收到本地推送消息
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification*)notification
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"接收到本地提醒 in app"
message:notification.alertBody
delegate:nil
cancelButtonTitle:@"肯定"
otherButtonTitles:nil];
[alert show];
//這裏,你就能夠經過notification的useinfo,幹一些你想作的事情了
application.applicationIconBadgeNumber -= 1;
}
三、取消一個本地推送
UIApplication *app = [UIApplication sharedApplication];
//獲取本地推送數組
NSArray *localArr = [app scheduledLocalNotifications];
//聲明本地通知對象
UILocalNotification *localNoti;
if (localArr) {
for (UILocalNotification *noti in localArr) {
NSDictionary *dict = noti.userInfo;
if (dict) {
NSString *inKey = [dict objectForKey:@"key"];
if ([inKey isEqualToString:key]) {
if (localNoti){
[localNoti release];
localNoti = nil;
}
localNoti = [noti retain];
break;
}
}
}
//判斷是否找到已經存在的相同key的推送
if (!localNoti) {
//不存在 初始化
localNoti = [[UILocalNotification alloc] init];
}
if (localNoti && !state) {
//不推送 取消推送
[app cancelLocalNotification:localNoti];
[localNoti release];
return;
}
}
4.兩種方式取消註冊的本地通知,一種是取消指定的通知,第二種是取消全部的註冊通知:
[[UIApplication sharedApplication] cancelLocalNotification:localNotification];
[[UIApplication sharedApplication] cancelAllLocalNotification];
5.iOS5的四種通知類型
5.1. 橫幅(Banner)
橫幅通知是在iOS5中出現的新特性,是顯示在屏幕頂部的橫條,幾秒鐘後會自動消失。一條橫幅通知會顯示程序的小圖標(低分屏下顯示29×29的圖標,高分屏顯示58×58的圖標),程序的名字和通知的內容。小圖標能夠幫助用戶一眼就看清楚是哪個應用程序在提醒他們。
5.2. 提醒(Alert)
提醒通知不會自動消失,須要用戶與之交互才能關閉。設計師須要設計通知的具體內容,有時還要action button 設計title。整個提醒通知的背景樣式,包括裏面的按鈕的樣式都是不可變的,因此設計師和開發者就不要在這裏發揮創意了。Android因爲其開放性,咱們是可使用本身設計的控件的,而iOS這樣作多是爲了保持UI風格一致性。
5.3. 標記(Badge)
標記通知是顯示在程序圖標的右上角的紅色橢圓形標記,裏面顯示的數字表示須要用戶處理的通知的數量。一樣地,標記的顏色和形狀、大小也是不能夠更改的。App Store中有更新的應用程序的數量,Mail中收到的未讀郵件的數量都是用標記通知用戶的。
5.4. 聲音(Sound)
聲音提示也是iOS的一種通知方式,支持自定義,能夠與前面三種通知類型搭配使用。
6.本地通知和推送通知
iOS應用程序會使用本地通知或推送通知來提醒用戶:
6.1. 本地通知
應用程序的本地通知是由用戶的iOS設備生成併發布的,不管這個應用程序是否運行在前臺。就像一個日曆應用,或者是一個to-do list應用,能夠發出一條本地通知提醒用戶立刻有一個會議要開始了。
6.2. 推送通知
應用程序的推送通知是這樣發佈的:該應用的遠程服務器(Provider)先發出一條通知給蘋果的推送通知服務(Apple Push Notification service, APNS),蘋果的通知服務器再把這個通知推送給全部安裝了這個應用的iOS設備。
若是要使用推送通知,必須先在蘋果的推送通知服務裏註冊你要使用哪幾種類型的通知,就好比下面的一段代碼就表示同時註冊了標記和聲音兩種類型的通知:
- (void)applicationDidFinishLaunching:(UIApplication *)app {// other setup tasks here….
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound)];}
如何使用各類通知
使用本地通知的應用程序可使用橫幅、提醒、標記、聲音,可是使用推送通知的應用程序須要先註冊要使用的通知類型。
在使用通知的時候須要注意如下幾點:
1. 保證標記的內容是最新的
2. 對同一事件不要發出多個通知
3. 通知內容不用包含應用程序的名稱
對於標記型通知,當全部的事項都解決後,標記會自動消失。
在橫幅和提醒中,以及頂部的通知中內心,iOS系統會自動在消息裏顯示應用程序的名稱,因此在設計通知的內容時,就無需包含app的名稱了。
在設計通知的內容時,還須要注意:
1. 關注於信息的表達,而不是用戶的動做。避免提示用戶去點哪個按鈕或者是怎樣打開app
2. 簡短,最好不超過兩行。長信息難以快速閱讀,並且必然會有滾動條
3. 使用句式大寫(sentence-style capitalization,第一個單詞的首字母大寫)和合適的標點符號,結尾通常使用句號
關於「提醒」
一條提醒可能會包含一到兩個按鈕。對於有兩個按鈕的提醒,須要把關閉提醒的按鈕放在左邊,把action button放在右邊。
點左邊的按鈕會關閉提醒,點右邊的按鈕會關閉這條提醒並打開應用。
若是隻有一個按鈕,這個按鈕應該是一個肯定按鈕。
點擊這個肯定按鈕也只會關閉提醒,而不會打開應用。
對於提醒通知,在設計action button的title的時候須要注意:
1. title能準確描述打開應用的動做。好比點擊Play按鈕,就可以打開這個遊戲,用戶可以馬上玩
2. 使用標題式大寫(title-style capitalization,每一個單詞的首字母都大寫)
3. 足夠簡短
在鎖屏狀態的時候收到新提醒通知,會把action button的title顯示到「slide to view」的信息裏,替換掉「view」這個詞,而且將全部字母都轉化爲小寫。
關於「聲音」
對於聲音提示,用戶沒有使用手機的時候聲音能夠吸引他們的注意力,這能夠避免用戶遺漏重要信息。
咱們可使用系統內置的聲音,也能夠自定義聲音。若是使用自定義的聲音,應該保證它足夠簡短,並且是精心製做的。
關於「通知欄」
只要不是鎖屏狀態,均可以從屏幕頂部向下滑打開通知中心。
若是是在遊戲裏面,好比水果忍者這種遊戲,爲了不手指不當心滑到屏幕外而打開了通知中心,iOS5提升了打開通知中心的難度:先從屏幕頂部下拉出現有相似防滑紋的下拉條,出現下拉條後再次向下拖拽,纔可打開通知中心,不然幾秒鐘後下拉條會自動收起。此處帶防滑紋下拉條的設計能夠幫助新用戶迅速創建下拉打開通知中心的心智模型。
OS5對下拉通知欄裏的通知進行了組織,同一個app的通知根據時間前後順序組合在一塊兒。刪除某個app的通知消息須要先點右邊的「X」按鈕,「X」按鈕變爲「清除」,用戶再次點擊清除才能移除這個app下的全部通知。兩步操做下降誤刪概率,並且其交互形式也比常見的彈出二次確認的模態窗口友好得多。