本地推送通知
對(duì)本地通知的數(shù)量限制,iOS最多允許最近本地通知數(shù)量是64個(gè)扎酷,超過(guò)限制的本地通知將被iOS忽略饱溢。
app沒(méi)有徹底關(guān)閉時(shí)
- app在前臺(tái)時(shí)(包括待激活狀態(tài)):可以接收通知帅刊,但不顯示
- app在后臺(tái):可以接收窟她,并顯示通知
app徹底關(guān)閉時(shí)
- 點(diǎn)擊程序圖標(biāo):進(jìn)入app主界面
- 點(diǎn)擊通知:進(jìn)入詳情頁(yè)面
- 不需要聯(lián)網(wǎng)就能發(fā)出的推送通知(不需要服務(wù)器的支持)
- 常用來(lái)定時(shí)提醒用戶完成一些任務(wù)陈症,即使程序被殺死提示照樣有,例如:記事本震糖、備忘錄等
1 獲取通知授權(quán)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UIUserNotificationSettings *userSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil];
[application registerUserNotificationSettings:userSettings];
return YES;
}
2 創(chuàng)建通知對(duì)象(在需要的方法函數(shù)中寫入)
//1.通知對(duì)象
UILocalNotification *localNotification = [[UILocalNotification alloc]init];
//2.通知的時(shí)間
localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:5];
//3.通知的內(nèi)容
localNotification.alertBody = @"HELLO IS ME";
//4.設(shè)置通知的時(shí)候的附加信息(非必須)
localNotification.userInfo = @{@"type":@"1",@"hello":@"word"};
//5.調(diào)度本地通知
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
監(jiān)聽(tīng)本地推送通知
1 app沒(méi)有徹底關(guān)閉時(shí)
//收到本地通知
-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{
if (application.applicationState == UIApplicationStateInactive){
NSLog(@"我是待激活狀態(tài)來(lái)的");
if ([notification.userInfo[@"type"] isEqualToString:@"1"]) {
NSLog(@"做自己的事");//type是我的userinfo的里面的信息
}
}else if (application.applicationState == UIApplicationStateBackground){
//注:此處不會(huì)進(jìn)來(lái)!!!,僅此狀態(tài)下可以顯示頂部通知提示,點(diǎn)通知會(huì)進(jìn)到UIApplicationStateInactive方法(程序不掛的情況下)
NSLog(@"我是后臺(tái)來(lái)的");
}else{//UIApplicationStateActive
NSLog(@"我是前臺(tái)來(lái)的");
}
}
-
UIApplicationStateActive
應(yīng)用在前臺(tái)運(yùn)行時(shí)就是這個(gè)狀態(tài) -
UIApplicationStateInactive
待激活狀態(tài):下拉通知欄 录肯、鎖屏、雙擊Home鍵吊说、上拉任務(wù)欄等 -
UIApplicationStateBackground
后臺(tái)狀態(tài):按Home鍵 论咏、其他應(yīng)用程序把應(yīng)用擠入后臺(tái)
2 app徹底關(guān)閉時(shí)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UIUserNotificationSettings *userSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil];
[application registerUserNotificationSettings:userSettings];
if(launchOptions){
UILocalNotification *localNote = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey];
if ([localNote.userInfo[@"type"] isEqualToString:@"1"] ) {
NSLog(@"程序掛了之后點(diǎn)擊通知欄進(jìn)來(lái)的");
}
}
return YES;
}
說(shuō)明
當(dāng)應(yīng)用程序啟動(dòng)時(shí)執(zhí)行,應(yīng)用程序啟動(dòng)入口颁井。只在應(yīng)用程序啟動(dòng)時(shí)執(zhí)行一次厅贪。
@param application 用來(lái)獲取應(yīng)用程序的狀態(tài)、變量等
@param launchOptions 該參數(shù)存儲(chǔ)程序啟動(dòng)的原因
1 若用戶直接啟動(dòng)蚤蔓,lauchOptions內(nèi)無(wú)數(shù)據(jù)
2 若由其他應(yīng)用程序通過(guò)openURL:啟動(dòng) 則UIApplicationLaunchOptionsURLKey對(duì)應(yīng)的對(duì)象為啟動(dòng)URL(NSURL),UIApplicationLaunchOptionsSourceApplicationKey對(duì)應(yīng)啟動(dòng)的源應(yīng)用程序的bundle ID (NSString)
3 若由本地通知啟動(dòng)卦溢,則UIApplicationLaunchOptionsLocalNotificationKey對(duì)應(yīng)的是為啟動(dòng)應(yīng)用程序的的本地通知對(duì)象(UILocalNotification)
4 若由遠(yuǎn)程通知啟動(dòng),則UIApplicationLaunchOptionsRemoteNotificationKey對(duì)應(yīng)的是啟動(dòng)應(yīng)用程序的的遠(yuǎn)程通知信息userInfo(NSDictionary
5 其他key還有UIApplicationLaunchOptionsAnnotationKey,UIApplicationLaunchOptionsLocationKey,UIApplicationLaunchOptionsNewsstandDownloadsKey秀又。 如果要在啟動(dòng)時(shí)单寂,做出一些區(qū)分,那就需要在下面的代碼做處理吐辙。 比如:應(yīng)用可以被某個(gè)其它應(yīng)用調(diào)起(作為該應(yīng)用的子應(yīng)用)宣决,要實(shí)現(xiàn)單點(diǎn)登錄,那就需要在啟動(dòng)代碼的地方做出合理的驗(yàn)證昏苏,并跳過(guò)登錄尊沸。
@return return value description
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
NSURL *url = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey];
if(url) {
}
NSString *bundleId = [launchOptions objectForKey:UIApplicationLaunchOptionsSourceApplicationKey];
if(bundleId) {
}
UILocalNotification * localNotify = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
if(localNotify) {
}
NSDictionary *userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if(userInfo) {
}
return YES;
}
取消本地通知
//取消某一個(gè)通知
NSArray *notificaitons = [[UIApplication sharedApplication] scheduledLocalNotifications];
//獲取當(dāng)前所有的本地通知
if (!notificaitons || notificaitons.count <= 0) {
return;
}
for (UILocalNotification *notify in notificaitons) {
if ([[notify.userInfo objectForKey:@"type"] isEqualToString:@"1"]) {
//取消一個(gè)特定的通知
[[UIApplication sharedApplication] cancelLocalNotification:notify];
break;
}
}
//取消所有的本地通知
[[UIApplication sharedApplication] cancelAllLocalNotifications];
留下的問(wèn)題:程序后臺(tái)運(yùn)行或者掛掉的情況下,不點(diǎn)擊通知如何拿到數(shù)據(jù)?是不是就丟了該通知數(shù)據(jù)...