iOS開發中UILocalNotification本地通知實現簡單的提醒功能,uilocalnotification
這段時間項目要求做一個類似的鬧鐘提醒功能,對通知不太熟悉的我,決定先用到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,則還應該加上下面的