一敦冬、簡介
注意:這里說的推送通知跟NSNotification有所區(qū)別
NSNotification是抽象的,不可見的
推送通知是可見的(能用肉眼看到)
iOS中提供了2種推送通知
本地推送通知(Local Notification)
遠(yuǎn)程推送通知(Remote Notification)
二啊胶、推送通知的作用
可以讓不在前臺(tái)運(yùn)行的app,告知用戶app內(nèi)部發(fā)生了什么事情
還可以在呈現(xiàn)推送通知的同時(shí)播放音效
鎖屏?xí)r也照樣呈現(xiàn)
呈現(xiàn)推送通知的同時(shí),還可以更新app圖標(biāo)的數(shù)字
三遗遵、推送通知的呈現(xiàn)效果總結(jié)
總結(jié)一下搬味,推送通知有5種不同的呈現(xiàn)效果
在屏幕頂部顯示一塊橫幅(顯示具體內(nèi)容)
在屏幕中間彈出一個(gè)UIAlertView(顯示具體內(nèi)容)
在鎖屏界面顯示一塊橫幅(鎖屏狀態(tài)下境氢,顯示具體內(nèi)容)
更新app圖標(biāo)的數(shù)字(說明新內(nèi)容的數(shù)量)
播放音效(提醒作用)
顯示橫幅還是UIAlertView,取決于用戶的設(shè)置
用戶也可以決定是否要開啟以下4個(gè)功能:
顯示App圖標(biāo)數(shù)字
播放音效
鎖屏顯示
顯示在“通知中心”
發(fā)出推送通知時(shí)碰纬,如果當(dāng)前程序正運(yùn)行在前臺(tái)产还,那么推送通知就不會(huì)被呈現(xiàn)出來
點(diǎn)擊推送通知后,默認(rèn)會(huì)自動(dòng)打開發(fā)出推送通知的app
不管app打開還是關(guān)閉嘀趟,推送通知都能如期發(fā)出
四脐区、本地推送通知
1 .什么是本地推送通知
顧名思義,就是不需要聯(lián)網(wǎng)就能發(fā)出的推送通知(不需要服務(wù)器的支持)
2 .本地推送通知的使用場景
常用來定時(shí)提醒用戶完成一些任務(wù)她按,比如
清理垃圾牛隅、記賬炕柔、買衣服、看電影媒佣、玩游戲
3 .如何發(fā)出本地推送通知
創(chuàng)建本地推送通知對(duì)象
UILocalNotification *ln = [[UILocalNotification alloc] init];
設(shè)置本地推送通知屬性
推送通知的觸發(fā)時(shí)間(何時(shí)發(fā)出推送通知)
@property(nonatomic,copy) NSDate *fireDate;
推送通知的具體內(nèi)容
@property(nonatomic,copy) NSString *alertBody;
在鎖屏?xí)r顯示的動(dòng)作標(biāo)題(完整標(biāo)題:“滑動(dòng)來” + alertAction)
@property(nonatomic,copy) NSString *alertAction;
音效文件名
@property(nonatomic,copy) NSString *soundName;
app圖標(biāo)數(shù)字
@property(nonatomic) NSInteger applicationIconBadgeNumber;
每隔多久重復(fù)發(fā)一次推送通知
@property(nonatomic) NSCalendarUnit repeatInterval;
點(diǎn)擊推送通知打開app時(shí)顯示的啟動(dòng)圖片
@property(nonatomic,copy) NSString *alertLaunchImage;
附加的額外信息
@property(nonatomic,copy) NSDictionary *userInfo;
時(shí)區(qū)
@property(nonatomic,copy) NSTimeZone *timeZone;
(一般設(shè)置為[NSTimeZone defaultTimeZone] 匕累,跟隨手機(jī)的時(shí)區(qū))
調(diào)度本地推送通知(調(diào)度完畢后,推送通知會(huì)在特地時(shí)間fireDate發(fā)出)
[[UIApplication sharedApplication] scheduleLocalNotification:ln];
獲得被調(diào)度(定制)的所有本地推送通知
@property(nonatomic,copy) NSArray *scheduledLocalNotifications;
(已經(jīng)發(fā)出且過期的推送通知就算調(diào)度結(jié)束默伍,會(huì)自動(dòng)從這個(gè)數(shù)組中移除)
取消調(diào)度本地推送通知
- (void)cancelLocalNotification:(UILocalNotification *)notification;
- (void)cancelAllLocalNotifications;
立即發(fā)出本地推送通知
- (void)presentLocalNotificationNow:(UILocalNotification *)notification;
4.點(diǎn)擊本地推送通知
當(dāng)用戶點(diǎn)擊本地推送通知欢嘿,會(huì)自動(dòng)打開app,這里有2種情況
app并沒有關(guān)閉也糊,一直隱藏在后臺(tái)
讓app進(jìn)入前臺(tái)炼蹦,并會(huì)調(diào)用AppDelegate的下面方法(并非重新啟動(dòng)app)
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification;
app已經(jīng)被關(guān)閉(進(jìn)程已死)
啟動(dòng)app,啟動(dòng)完畢會(huì)調(diào)用AppDelegate的下面方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
launchOptions參數(shù)通過UIApplicationLaunchOptionsLocalNotificationKey取出本地推送通知對(duì)象
5.iOS 8.0的變化
在iOS 8.0中狸剃,如果要使用本地通知掐隐,需要得到用戶的許可
在didFinishLaunchingWithOptions方法中添加如下代碼:
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
[application registerUserNotificationSettings:settings];
五、iOS的本地推送刪除不了解決方法
最近在研究蘋果推送,當(dāng)測試本地推送的時(shí)候,發(fā)現(xiàn)一個(gè)問題,就是一旦你添加了一個(gè)本地推動(dòng)的通知,當(dāng)你修改代碼,刪除應(yīng)用,當(dāng)你再次運(yùn)行app,它還是會(huì)在橫幅上面彈出推送,尼瑪怎么搞都刪除不了,近乎崩潰了,開始以為是ios7的Bug,蘋果爹自ios7之后各種bug曾出不窮,不過最后冷靜思考了一下,有木有可能App本地的推送是設(shè)置系統(tǒng)里面,所以你在app刪除本地推送的代碼都沒辦法取消推送,于是終于給我找到了一個(gè) cancelAllLocalNotifications方法,尼瑪,蛋疼的本地推送終于不見了...狗皮膏藥般的惡魔終于不見了.
這個(gè)是產(chǎn)生本地推送的一個(gè)本地通知,一旦你運(yùn)行它,那么恭喜,你刪除app,修改代碼,再安裝,橫幅就一直尼瑪?shù)膹椦綇?..
UILocalNotification *notification = [[UILocalNotification alloc] init];
//設(shè)置10秒之后
NSDate *pushDate = [NSDate dateWithTimeIntervalSinceNow:10];
if (notification != nil) {
// 設(shè)置推送時(shí)間
notification.fireDate = pushDate;
// 設(shè)置時(shí)區(qū)
notification.timeZone = [NSTimeZone defaultTimeZone];
// 設(shè)置重復(fù)間隔
notification.repeatInterval = kCFCalendarUnitDay;
// 推送聲音
notification.soundName = UILocalNotificationDefaultSoundName;
// 推送內(nèi)容
notification.alertBody = @"推送內(nèi)容";
//顯示在icon上的紅色圈中的數(shù)子
notification.applicationIconBadgeNumber = 1;
//設(shè)置userinfo 方便在之后需要撤銷的時(shí)候使用
NSDictionary *info = [NSDictionary dictionaryWithObject:@"name"forKey:@"key"];
notification.userInfo = info;
//添加推送到UIApplication
UIApplication *app = [UIApplication sharedApplication];
[app scheduleLocalNotification:notification];
怎么才能取消這種流氓行為呢钞馁?只需要3行代碼,世界瞬間清凈了...順帶刪除掉那個(gè)1的小紅點(diǎn)
UIApplication *app = [UIApplication sharedApplication];
app.applicationIconBadgeNumber = 0;
[app cancelAllLocalNotifications];