Notification是智慧手機應用程式設計中非常常用的一種傳遞資訊的機制,而且可以非常好的節省資源,不用消耗資源來不停地檢查資訊狀態(Pooling),在iOS下應用分為兩種不同的Notification種類,本地和遠端。本地的Notification由iOS下NotificationManager統一管理,只需要將封裝好的本地Notification物件加入到系統Notification管理機制佇列中,系統會在指定的時間激發將本地Notification,應用只需設計好處理Notification的方法就完成了整個Notification流程了。
本地Notification所使用的物件是UILocalNotification,UILocalNotification的屬性涵蓋了所有處理Notification需要的內容。UILocalNotification的屬性有fireDate、timeZone、repeatInterval、repeatCalendar、alertBody、 alertAction、hasAction、alertLaunchImage、applicationIconBadgeNumber、 soundName和userInfo。
UILocalNotification的排程
其中fireDate、timeZone、repeatInterval和repeatCalendar是用於UILocalNotification的排程。fireDate是UILocalNotification的激發的確切時間。timeZone是UILocalNotification激發時間是否根據時區改變而改變,如果設定為nil的話,那麼UILocalNotification將在一段時候後被激發,而不是某一個確切時間被激發。 repeatInterval是UILocalNotification被重複激發之間的時間差,不過時間差是完全根據日曆單位(NSCalendarUnit)的,例如每週激發的單位,NSWeekCalendarUnit,如果不設定的話,將不會重複激發。 repeatCalendar是UILocalNotification重複激發所使用的日曆單位需要參考的日曆,如果不設定的話,系統預設的日曆將被作為參考日曆。
UILocalNotification的提醒內容
alertBody、alertAction、hasAction和alertLaunchImage是當應用不在執行時,系統處理
1、增加一個本地推送
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
//設定20秒之後 ``` NSDate *date = [NSDate dateWithTimeIntervalSinceNow:20]; /* 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]; } |
2、程式執行時接收到本地推送訊息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
- (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; } |
3、取消一個本地推送
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
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裝置。
如果要使用推送通知,必須先在蘋果的推送通知服務裡註冊你要使用哪幾種型別的通知,就比如下面的一段程式碼就表示同時註冊了標記和聲音兩種型別的通知:
1 2 3 |
- (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下的所有通知。兩步操作降低誤刪機率,而且其互動形式也比常見的彈出二次確認的模態視窗友好得多。