這段時間項目要求做一個類似的鬧鐘提醒功能,對通知不太熟悉的我,決定先用到xcode自帶的本地通知試試,最終成功的實現了功能,特整理分享下。
它的表現特點:
app關閉的時候也能接收和顯示通知。
app處於後台的時候能接收通知也能顯示。
app處於前台的時候能接收,但不能顯示,但是會走應用程序delegate中的方法
具體的創建方法:
-》創建一個本地通知對象UILocalNotification
-》設置fireDate,AlertBody,AlertAction,soundName,applicationBadgeNumber,repeatInterval,alertLanuchImage屬性
-》配置通知參數,userInfo。及通知的內容。我們可以在接收通知的方法中獲取該對象。
-》調用通知,使用UIApplication的單例對象scheduleLocalNotificaiton按照計劃啟動通知
此處需要注意的是自從iOS8之後需要征求用戶的通知,如果同意則創建UIUerNotificationSettings,然後 registerUserNotificationSettings。對本地通知的數量限制,iOS最多允許最近本地通知數量是64個,超過限制的本地通知將被iOS忽略。
下面就是詳細的代碼:
1.注冊通知 ,同樣也適用於iOS10
在appdelegate的application:didFinishLaunchingWithOptions:中調用下面的方法
另外補充:為了適配iOS10,上面的代碼最好是換成下面的
2.本地通知的定義和使用
在需要使用本地通知的控制器定義,這裡為了簡便直接定義一個5s之後的鬧鐘,可以改成任意一個時間點的,轉換成NSDate類型替換[NSDate dateWithTimeIntervalSinceNow:5]即可。
為了區分不同的本地通知,可以在定義的同時定義下面的屬性
//設置通知的相關信息,這個很重要,可以添加一些標記性內容,方便以後區分和獲取通知的信息
NSDictionary *infoDic = [NSDictionary dictionaryWithObjectsAndKeys:LOCAL_NOTIFY_SCHEDULE_ID,@"id", nil];
localNotification.userInfo = infoDic;
3.取消本地通知
注意::在每次不需要或者重新刷新所有的本地通知之前必須先取消所有的本地通知,不然會有重復的相同的通知。
//取消某一個通知
NSArray *notificaitons = [[UIApplication sharedApplication] scheduledLocalNotifications];
//獲取當前所有的本地通知
if (!notificaitons || notificaitons.count <= 0) {
return;
}
for (UILocalNotification *notify in notificaitons) {
if ([[notify.userInfo objectForKey:@"id"] isEqualToString:LOCAL_NOTIFY_SCHEDULE_ID]) {
//取消一個特定的通知
[[UIApplication sharedApplication] cancelLocalNotification:notify];
break;
}
}
//取消所有的本地通知
[[UIApplication sharedApplication] cancelAllLocalNotifications];
4.本地通知的響應
如果已經注冊了本地通知,當客戶端響應通知時:
a、應用程序在後台的時候,本地通知會給設備送達一個和遠程通知一樣的提醒
b、應用程序正在運行中,則設備不會收到提醒,但是會走應用程序delegate中的方法:
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
}
如果你想實現程序在後台時候的那種提醒效果,可以在上面這個方法中添加相關代碼
if ([[notification.userInfo objectForKey:@"id"] isEqualToString:LOCAL_NOTIFY_SCHEDULE_ID]) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"test" message:notification.alertBody delegate:nil cancelButtonTitle:@"關閉" otherButtonTitles:notification.alertAction, nil nil];
[alert show];
}
需要注意的是,在情況a中,如果用戶點擊提醒進入應用程序,也會執行收到本地通知的回調方法,這種情況下如果你添加了上面那段代碼,則會出現連續出現兩次提示,為了解決這個問題,修改代碼如下:
if ([[notification.userInfo objectForKey:@"id"] isEqualToString:LOCAL_NOTIFY_SCHEDULE_ID]) {
//判斷應用程序當前的運行狀態,如果是激活狀態,則進行提醒,否則不提醒
if (application.applicationState == UIApplicationStateActive) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:notification.alertBody delegate:nil cancelButtonTitle:@"關閉" otherButtonTitles:nil, nil];
[alert show];
}
}
如果適配了iOS10,則還應該加上下面的