在做本地通知之前一定要關(guān)心的一點,App是通過哪種途徑啟動的陕赃?
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {}
說明:當應(yīng)用程序啟動時執(zhí)行,應(yīng)用程序啟動入口颁股。只在應(yīng)用程序啟動時執(zhí)行一次么库。application參數(shù)用來獲取應(yīng)用程序的狀態(tài)、變量等甘有,值得注意的是字典參數(shù):(NSDictionary *)launchOptions诉儒,該參數(shù)存儲程序啟動的原因。
1.若用戶直接啟動亏掀,lauchOptions內(nèi)無數(shù)據(jù);
2.若由其他應(yīng)用程序通過openURL:啟動忱反,則UIApplicationLaunchOptionsURLKey對應(yīng)的對象為啟動URL(NSURL),UIApplicationLaunchOptionsSourceApplicationKey對應(yīng)啟動的源應(yīng)用程序的bundle ID (NSString);
3.若由本地通知啟動滤愕,則UIApplicationLaunchOptionsLocalNotificationKey對應(yīng)的是為啟動應(yīng)用程序的的本地通知對象(UILocalNotification)温算;
4.若由遠程通知啟動,則UIApplicationLaunchOptionsRemoteNotificationKey對應(yīng)的是啟動應(yīng)用程序的的遠程通知信息userInfo(NSDictionary)间影;
了解完APP的啟動方式之后注竿,我們來擼一下代碼吧!!
FirstViewController *first = [[FirstViewController alloc] init];
self.window.rootViewController = first;
self.first = first;
// *注冊本地通知, ios8之后必須要注冊*
if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)]){
[application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil]];
}
if (launchOptions == nil) {
// 直接點擊app圖標啟動的程序
first.labelState.text = @"直接點擊app圖標啟動的程序";
}
NSURL *url = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey];
if(url) {
// 由其他應(yīng)用程序通過openURL啟動的程序
NSString *bundleId = [launchOptions objectForKey:UIApplicationLaunchOptionsSourceApplicationKey];
if(bundleId) {
}
}
UILocalNotification * localNotify = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
if(localNotify) {
// 點擊本地通知啟動的程序, 在這里你可以做應(yīng)用的跳轉(zhuǎn)巩割,
// first.labelState.text = @"點擊本地通知啟動的程序";
for (NSString *str in [launchOptions allKeys]) {
first.labelState.text = [NSString stringWithFormat:@"%@=%@=%@", first.labelState.text, str, [launchOptions objectForKey:str]];
}
// NSLog(@"%@", launchOptions);
}
NSDictionary * userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if(userInfo) {
// 點擊遠程通知啟動的程序
first.labelState.text = @"點擊遠程通知啟動的程序";
}
清楚了APP的啟動方式后裙顽,那如何創(chuàng)建一個本地通知呢,我們來看一下吧宣谈,廢話九就少說一點愈犹,我們還是直接擼代碼。
// 創(chuàng)建一個通知
UILocalNotification *localNotification = [[UILocalNotification alloc] init];
//設(shè)置本地通知的觸發(fā)時間(如果要立即觸發(fā)蒲祈,無需設(shè)置)甘萧,這里設(shè)置為20妙后
// localNotification.fireDate = [NSDate date];
//設(shè)置本地通知的時區(qū)
localNotification.timeZone = [NSTimeZone defaultTimeZone];
//設(shè)置通知的內(nèi)容
localNotification.alertBody = @"內(nèi)容";
//設(shè)置通知動作按鈕的標題
// localNotification.alertAction = @"查看”;
//設(shè)置提醒的聲音,可以自己添加聲音文件梆掸,這里設(shè)置為默認提示聲
localNotification.soundName = UILocalNotificationDefaultSoundName;
//設(shè)置通知的相關(guān)信息扬卷,這個很重要,可以添加一些標記性內(nèi)容酸钦,方便以后區(qū)分和獲取通知的信息
// NSDictionary *infoDic = [NSDictionary dictionaryWithObjectsAndKeys:@"tongzhi",@"id",@"11",@"time",@"aa",@"affair.aid", nil];
// localNotification.userInfo = infoDic;
// 通知重復(fù)提示的單位怪得,可以是天、周卑硫、月徒恋,如果提示間隔設(shè)置了,比如:設(shè)置為 kCFCalendarUnitDay 欢伏,那么每天的這個時間你都會收到這個通知入挣。
localNotification.repeatInterval = 0;
NSLog(@"%@", localNotification);
// 本地通知打印的格式 <UIConcreteLocalNotification: 0x17e23650>{fire date = (null), time zone = Asia/Shanghai (GMT+8) offset 28800, repeat interval = 0, repeat count = UILocalNotificationInfiniteRepeatCount, next fire date = 2016年10月31日 星期一 中國標準時間上午11:16:31, user info = (null)}
//在規(guī)定的日期觸發(fā)通知
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
// 立即觸發(fā)一個通知, 會彈出一個alert
// [[UIApplication sharedApplication] presentLocalNotificationNow:localNotification];
獲取和刪除本地的通知:
/**
* 獲取本地通知
* 注意:已經(jīng)發(fā)出且過期的通知會從數(shù)組里自動移除硝拧。比如說你現(xiàn)在發(fā)出一個通知径筏,沒有延遲,你打印一下本地的全部的通知會發(fā)現(xiàn)障陶,并沒有這個通知滋恬,那是因為這個通知已經(jīng)發(fā)出過了,就系統(tǒng)自動刪除了抱究。如果是一個重復(fù)的通知恢氯,比如說,每天都會定時發(fā)出的通知鼓寺,你就能從數(shù)組中獲取的到勋拟。總之一句話妈候。過期的通知會自動從數(shù)組中移除敢靡。
* 1. 獲取本地全部的通知
* 2. 獲取本地的特定的通知
*/
// 1.獲取全部的通知
NSArray *localNotifications = [[UIApplication sharedApplication] scheduledLocalNotifications];
NSLog(@"全部的通知 = %@", localNotifications);
// 2.獲取特定的通知,userInfo中有你想要的數(shù)據(jù)
for (UILocalNotification *notify in localNotifications) {
if ([[notify.userInfo objectForKey:@"id"] isEqualToString:@"通知的名字"]) {
//取消一個特定的通知
[[UIApplication sharedApplication] cancelLocalNotification:notify];
break;
}
}
剛才我們說了APP的啟動方式州丹,創(chuàng)建和獲取本地通知醋安,那么當應(yīng)用受到本地通知怎么處理呢?系統(tǒng)為我們提供的有方法墓毒,一起來看一下吧吓揪。
/**
* 當用戶點擊本地通知進入app的時候調(diào)用(app當時并沒有被關(guān)閉)
* 若app已關(guān)閉不會被調(diào)用此方法
*/
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
// 判斷應(yīng)用程序當前的運行狀態(tài),如果是激活狀態(tài)所计,則進行提醒柠辞,否則不提醒
if (application.applicationState == UIApplicationStateActive) {
self.first.labelTitle.text = @"應(yīng)用在前臺";
} else if (application.applicationState == UIApplicationStateBackground) {
self.first.labelTitle.text = @"應(yīng)用在后臺";
} else { // 應(yīng)用在沒有被殺死是,點擊本地通知主胧,將執(zhí)行這個方法
// 在這里你可以做頁面的跳轉(zhuǎn)
self.first.labelTitle.text = @"用戶點擊本地通知進入app叭首,并且app當時沒有關(guān)閉";
}
}
那么到現(xiàn)在為止本地通知差不多已經(jīng)說完了,大家如果想看遠程推送的東西踪栋,可以私信我焙格,我一定會在第一時間給大家回復(fù)的。????????????