概述
在多數移動應用中任何時候都只能有一個應用程序處於活躍狀態,如果其他應用此刻發生了一些用戶感興趣的那麼通過通知機制就可以告訴用戶此時發生的事情。iOS中通知機制又叫消息機制,其包括兩類:一類是本地通知;另一類是推送通知,也叫遠程通知。兩種通知在iOS中的表現一致,可以通過橫幅或者彈出提醒兩種形式告訴用戶,並且點擊通知可以會打開應用程序,但是實現原理卻完全不同。今天就和大家一塊去看一下如何在iOS中實現這兩種機制,並且在文章後面會補充通知中心的內容避免初學者對兩種概念的混淆。 本地通知 本地通知是由本地應用觸發的,它是基於時間行為的一種通知形式,例如鬧鐘定時、待辦事項提醒,又或者一個應用在一段時候後不使用通常會提示用戶使用此應用等都是本地通知。創建一個本地通知通常分為以下幾個步驟: 創建UILocalNotification。 設置處理通知的時間fireDate。 配置通知的內容:通知主體、通知聲音、圖標數字等。 配置通知傳遞的自定義數據參數userInfo(這一步可選)。 調用通知,可以使用scheduleLocalNotification:按計劃調度一個通知,也可以使用presentLocalNotificationNow立即調用通知。 下面就以一個程序更新後用戶長期沒有使用的提醒為例對本地通知做一個簡單的了解。在這個過程中並沒有牽扯太多的界面操作,所有的邏輯都在AppDelegate中:進入應用後如果沒有注冊通知,需要首先注冊通知請求用戶允許通知;一旦調用完注冊方法,無論用戶是否選擇允許通知此刻都會調用應用程序的- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings代理方法,在這個方法中根據用戶的選擇:如果是允許通知則會按照前面的步驟創建通知並在一定時間後執行。 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]; //如果已經獲得發送通知的授權則創建本地通知,否則請求授權(注意:如果不請求授權在設置中是沒有對應的通知設置項的,也就是說如果從來沒有發送過請求,即使通過設置也打不開消息允許設置) if ([[UIApplication sharedApplication]currentUserNotificationSettings].types!=UIUserNotificationTypeNone) { [self addLocalNotification]; }else{ [[UIApplication sharedApplication]registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil]]; } return YES; } #pragma mark 調用過用戶注冊通知方法之後執行(也就是調用完registerUserNotificationSettings:方法之後執行) -(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]; //設置調用時間 notification.fireDate=[NSDate dateWithTimeIntervalSinceNow:10.0];//通知觸發的時間,10s以後 notification.repeatInterval=2;//通知重復次數 //notification.repeatCalendar=[NSCalendar currentCalendar];//當前日歷,使用前最好設置時區等信息以便能夠自動同步時間 //設置通知屬性 notification.alertBody=@"最近添加了諸多有趣的特性,是否立即體驗?"; //通知主體 notification.applicationIconBadgeNumber=1;//應用程序圖標右上角顯示的消息數 notification.alertAction=@"打開應用"; //待機界面的滑動動作提示 notification.alertLaunchImage=@"Default";//通過點擊通知打開應用時的啟動圖片,這裡使用程序啟動圖片 //notification.soundName=UILocalNotificationDefaultSoundName;//收到通知時播放的聲音,默認消息聲音 notification.soundName=@"msg.caf";//通知聲音(需要真機才能聽到聲音) //設置用戶信息 notification.userInfo=@{@"id":@1,@"user":@"Kenshin Cui"};//綁定到通知上的其他附加信息 //調用通知 [[UIApplication sharedApplication] scheduleLocalNotification:notification]; } #pragma mark 移除本地通知,在不需要此通知時記得移除 -(void)removeNotification{ [[UIApplication sharedApplication] cancelAllLocalNotifications]; }