推送通知
1. 什么是推送通知?
> 首先明確:**此處的推送通知跟我們的”NSNotification”沒(méi)有半毛錢關(guān)系
> 可以理解為: 向用戶推送一條信息來(lái)通知用戶某件事情
> 作用: 可以在APP退到后臺(tái),或者關(guān)閉時(shí);繼續(xù)推送一條消息告訴用戶某件事情
2. 推送通知的應(yīng)用場(chǎng)景?
(1) 一些任務(wù)管理APP,會(huì)在任務(wù)時(shí)間即將到達(dá)時(shí),通知你做該任務(wù);
(2) 健身App定時(shí)提醒你應(yīng)該健身了;
(3) 買過(guò)電影票后,提前半小時(shí)告訴你,電影即將開場(chǎng);
(4) 當(dāng)你QQ或者微信收到消息時(shí),即使退到后臺(tái),或者關(guān)閉APP,也可以收到信息通知告訴我們;
(5) 電商APP,推送一條消息通知我們有新品上架等等
3. 推送通知的展現(xiàn)樣式?
(1) 在屏幕頂部顯示一塊橫幅(顯示具體內(nèi)容)
(2) 在屏幕中間彈出一個(gè)UIAlertView(顯示具體內(nèi)容)
(3) 在鎖屏界面顯示一塊橫幅(鎖屏狀態(tài)下荠医,顯示具體內(nèi)容)
(4) 更新app圖標(biāo)的數(shù)字(說(shuō)明新內(nèi)容的數(shù)量)
(5) 播放音效(提醒作用)
*注意:以上樣式只能是用戶自己設(shè)置,我們無(wú)法通過(guò)代碼控制*
4. 推送通知的分類
-
本地推送通知
“本地”可以理解為”不聯(lián)網(wǎng)”;即使沒(méi)有網(wǎng)絡(luò)情況下,也可以推送通知消息 應(yīng)用場(chǎng)景: 確定知道未來(lái)某個(gè)時(shí)間點(diǎn)應(yīng)該提醒用戶什么
-
遠(yuǎn)程推送通知
概念: 與“本地”相對(duì),表示,必須在聯(lián)網(wǎng)情況下才會(huì)向用戶推送通知消息 遠(yuǎn)程推送服務(wù),又稱為APNs(Apple Push Notification Services) 應(yīng)用場(chǎng)景: 1. 不確定未來(lái)某個(gè)時(shí)間點(diǎn)應(yīng)該提醒用戶什么,臨時(shí)性的 2. 當(dāng)APP徹底退出時(shí)也想繼續(xù)讓用戶獲取一些最新消息
- 使用原則: 誰(shuí)能確定通知時(shí)間和內(nèi)容, 誰(shuí)就可以發(fā)送(開發(fā)人員在APP內(nèi)部通過(guò)代碼發(fā)送=本地通知; 服務(wù)器可以確定通知時(shí)間和內(nèi)容=遠(yuǎn)程通知)*
5. 推送通知的實(shí)現(xiàn)
1. 本地推送通知
創(chuàng)建UILocalNotification 對(duì)象
-
設(shè)置一些必要屬性
// 推送通知的觸發(fā)時(shí)間(何時(shí)發(fā)出推送通知) @property(nonatomic,copy) NSDate *fireDate; // 推送通知的具體內(nèi)容 @property(nonatomic,copy) NSString *alertBody;
-
開始推送通知
// 根據(jù)fireDate設(shè)定的時(shí)間進(jìn)行推送 [[UIApplication sharedApplication] scheduleLocalNotification:ln]; // 立即推送 presentLocalNotificationNow:(UILocalNotification *)notification;
4. 監(jiān)聽(tīng)用戶點(diǎn)擊通知
```objc
// app處于前臺(tái)
此時(shí)不會(huì)彈框通知用戶通知的到達(dá)桑涎,但是還是會(huì)調(diào)用對(duì)應(yīng)的代理方法
- app并沒(méi)有關(guān)閉彬向,一直隱藏在后臺(tái)時(shí)
此時(shí)用戶點(diǎn)擊通知信息后,會(huì)讓app進(jìn)入前臺(tái),并會(huì)調(diào)用AppDelegate的下面方法
application: didReceiveLocalNotification:
- app已經(jīng)被關(guān)閉(進(jìn)程已死)
此時(shí)用戶點(diǎn)擊通知信息后,會(huì)啟動(dòng)app攻冷,啟動(dòng)完畢會(huì)調(diào)用AppDelegate的下面方法
application: didFinishLaunchingWithOptions:
launchOptions參數(shù)通過(guò)UIApplicationLaunchOptionsLocalNotificationKey取出本地推送通知對(duì)象
-
額外設(shè)置
// 每隔多久重復(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ū)) // 在鎖屏?xí)r顯示的動(dòng)作標(biāo)題(完整標(biāo)題:“滑動(dòng)來(lái)” + alertAction) @property(nonatomic,copy) NSString *alertAction; // 音效文件名 @property(nonatomic,copy) NSString *soundName; // app圖標(biāo)數(shù)字 @property(nonatomic) NSInteger applicationIconBadgeNumber;
-
其他操作
- 獲得被調(diào)度(定制)的所有本地推送通知 @property(nonatomic,copy) NSArray *scheduledLocalNotifications; 已經(jīng)發(fā)出且過(guò)期的推送通知就算調(diào)度結(jié)束,會(huì)自動(dòng)從這個(gè)數(shù)組中移除 - 取消調(diào)度本地推送通知 - (void)cancelLocalNotification:(UILocalNotification *)notification; - (void)cancelAllLocalNotifications;
-
注意事項(xiàng)
- 在iOS 8.0+等曼,如果要使用本地通知里烦,需要得到用戶的許可 在didFinishLaunchingWithOptions方法中添加如下代碼 UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil]; [application registerUserNotificationSettings:settings];
-
額外補(bǔ)充
- 在iOS8.0之后,可以設(shè)置推送通知帶操作行為 在注冊(cè)設(shè)置時(shí),設(shè)置categories:參數(shù) 監(jiān)聽(tīng)通知操作行為的點(diǎn)擊
2. 遠(yuǎn)程推送通知
-
遠(yuǎn)程推送的原理
> 所有蘋果設(shè)備, 在聯(lián)網(wǎng)狀態(tài)下,都會(huì)與蘋果服務(wù)器建立一個(gè)長(zhǎng)連接 “長(zhǎng)連接”: 相對(duì)的一個(gè)概念是”短連接” “長(zhǎng)連接”優(yōu)勢(shì): 服務(wù)器可以向客戶端發(fā)送信息,保證數(shù)據(jù)即時(shí)性 劣勢(shì): 占用客戶和服務(wù)器資源 “短連接”優(yōu)勢(shì): 節(jié)省資源,一個(gè)會(huì)話結(jié)束后,立即釋放資源 劣勢(shì): 服務(wù)器無(wú)法主動(dòng)向客戶端發(fā)信息 > 蘋果設(shè)備“長(zhǎng)連接”作用: 時(shí)間校準(zhǔn) 系統(tǒng)升級(jí) 查找我的iPhone 推送通知... > 原理就是借助蘋果設(shè)備與APNs服務(wù)器之間的長(zhǎng)連接, 借助APNs服務(wù)器將消息發(fā)送給客戶端
-
遠(yuǎn)程推送通知實(shí)現(xiàn)的條件
> 真有真機(jī)可以調(diào)試推送通知 因?yàn)橹挥姓鏅C(jī)具備UDID, 才能夠生成deviceToken > 需要真機(jī)調(diào)試證書, 推送測(cè)試證書
-
遠(yuǎn)程推送通知實(shí)現(xiàn), 客戶端需要做的事
1. 請(qǐng)求蘋果獲得deviceToken /** * 請(qǐng)求通知授權(quán),以及請(qǐng)求遠(yuǎn)程通知 */ - (void)registerRemoteNotification { if (isIOS(8.0)) { // 1. 請(qǐng)求通知授權(quán) UIUserNotificationSettings *notificationSet = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil]; [[UIApplication sharedApplication] registerUserNotificationSettings:notificationSet]; // 2. 注冊(cè)遠(yuǎn)程通知 [[UIApplication sharedApplication] registerForRemoteNotifications]; } else { // iOS8.0之前請(qǐng)求遠(yuǎn)程推送通知 [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound ]; } } 2. 得到蘋果返回的deviceToken,發(fā)送deviceToken給公司的服務(wù)器 /** * 當(dāng)遠(yuǎn)程通知注冊(cè)后,APNs會(huì)通過(guò)調(diào)用這個(gè)方法,返回對(duì)應(yīng)的deviceToken */ -(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { NSLog(@"%@", deviceToken); } 3. 監(jiān)聽(tīng)用戶對(duì)通知的點(diǎn)擊 實(shí)現(xiàn)APP代理方法 -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { NSLog(@"%@", userInfo); } 或者: /** * 當(dāng)接收到遠(yuǎn)程通知時(shí)調(diào)用(iOS7.0之后使用) * * 當(dāng)前在前臺(tái)時(shí); 或者app在后臺(tái)\app被徹底退出狀態(tài)下,點(diǎn)擊通知打開app進(jìn)入前臺(tái); 都可以執(zhí)行以下方法 * * * 執(zhí)行completionHandler 作用 * * 1> 系統(tǒng)會(huì)估量App消耗的電量,并根據(jù)傳遞的UIBackgroundFetchResult 參數(shù)記錄新數(shù)據(jù)是否可用 * 2> 調(diào)用完成的處理代碼時(shí)禁谦,應(yīng)用的界面縮略圖會(huì)自動(dòng)更新 * * 如果想要接收到通知后,不要用戶點(diǎn)擊通知, 就執(zhí)行以下代碼, 那么必須有三個(gè)要求: 1> 必須勾選后臺(tái)模式Remote Notification ; 2> 告訴系統(tǒng)是否有新的內(nèi)容更新(執(zhí)行完成代碼塊) 3> 設(shè)置發(fā)送通知的格式("content-available":"隨便傳") */ -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { }
-
遠(yuǎn)程推送測(cè)試
> PushMeBaby 1. 編譯會(huì)出現(xiàn)錯(cuò)誤, 直接把錯(cuò)誤行注釋即可; 2. 需要填寫對(duì)應(yīng)的deviceToken; 3. 需要將推送測(cè)試證書改名為aps.cer 拖入項(xiàng)目中;
-
第三方推送
極光推送(JPush) 個(gè)推 信鴿 具體集成步驟以及使用方法, 請(qǐng)查看對(duì)應(yīng)的官方文檔, 非常詳細(xì); 第三方服務(wù)合集: [http://mdsa.51cto.com/services/]
es/]
[http://mdsa.51cto.com/services/]