推送通知

推送通知

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. 推送通知的分類

  1. 本地推送通知

     “本地”可以理解為”不聯(lián)網(wǎng)”;即使沒(méi)有網(wǎng)絡(luò)情況下,也可以推送通知消息
     應(yīng)用場(chǎng)景: 確定知道未來(lái)某個(gè)時(shí)間點(diǎn)應(yīng)該提醒用戶什么
    
  2. 遠(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. 本地推送通知

  1. 創(chuàng)建UILocalNotification 對(duì)象

  2. 設(shè)置一些必要屬性

    // 推送通知的觸發(fā)時(shí)間(何時(shí)發(fā)出推送通知)
    @property(nonatomic,copy) NSDate *fireDate;
    // 推送通知的具體內(nèi)容
    @property(nonatomic,copy) NSString *alertBody;
    
  1. 開始推送通知

    // 根據(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ì)象
  1. 額外設(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;
    
  2. 其他操作

         - 獲得被調(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;
    
  3. 注意事項(xiàng)

         - 在iOS 8.0+等曼,如果要使用本地通知里烦,需要得到用戶的許可
             在didFinishLaunchingWithOptions方法中添加如下代碼
             UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
             [application registerUserNotificationSettings:settings];
    
  4. 額外補(bǔ)充

         - 在iOS8.0之后,可以設(shè)置推送通知帶操作行為
             在注冊(cè)設(shè)置時(shí),設(shè)置categories:參數(shù)
             監(jiān)聽(tīng)通知操作行為的點(diǎn)擊
    

2. 遠(yuǎn)程推送通知

  1. 遠(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ā)送給客戶端
    
  2. 遠(yuǎn)程推送通知實(shí)現(xiàn)的條件

     > 真有真機(jī)可以調(diào)試推送通知
         因?yàn)橹挥姓鏅C(jī)具備UDID, 才能夠生成deviceToken
    
     > 需要真機(jī)調(diào)試證書, 推送測(cè)試證書
    
  3. 遠(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
         {
    
         }
    
  4. 遠(yuǎn)程推送測(cè)試

     > PushMeBaby
         1. 編譯會(huì)出現(xiàn)錯(cuò)誤, 直接把錯(cuò)誤行注釋即可;
         2. 需要填寫對(duì)應(yīng)的deviceToken;
         3. 需要將推送測(cè)試證書改名為aps.cer 拖入項(xiàng)目中;
    
  5. 第三方推送

     極光推送(JPush)
     個(gè)推
     信鴿
    
     具體集成步驟以及使用方法, 請(qǐng)查看對(duì)應(yīng)的官方文檔, 非常詳細(xì);
     第三方服務(wù)合集: [http://mdsa.51cto.com/services/]
    

es/]


[http://mdsa.51cto.com/services/]


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末胁黑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子州泊,更是在濱河造成了極大的恐慌丧蘸,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遥皂,死亡現(xiàn)場(chǎng)離奇詭異力喷,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)演训,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門弟孟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人样悟,你說(shuō)我怎么就攤上這事披蕉。” “怎么了乌奇?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵没讲,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我礁苗,道長(zhǎng)爬凑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任试伙,我火速辦了婚禮嘁信,結(jié)果婚禮上于样,老公的妹妹穿的比我還像新娘。我一直安慰自己潘靖,他們只是感情好穿剖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著卦溢,像睡著了一般糊余。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上单寂,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天贬芥,我揣著相機(jī)與錄音,去河邊找鬼宣决。 笑死蘸劈,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的尊沸。 我是一名探鬼主播威沫,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼洼专!你這毒婦竟也來(lái)了壹甥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤壶熏,失蹤者是張志新(化名)和其女友劉穎句柠,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體棒假,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡溯职,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了帽哑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谜酒。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖妻枕,靈堂內(nèi)的尸體忽然破棺而出僻族,到底是詐尸還是另有隱情,我是刑警寧澤屡谐,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布述么,位于F島的核電站,受9級(jí)特大地震影響愕掏,放射性物質(zhì)發(fā)生泄漏度秘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一饵撑、第九天 我趴在偏房一處隱蔽的房頂上張望剑梳。 院中可真熱鬧唆貌,春花似錦、人聲如沸垢乙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)追逮。三九已至酪刀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間羊壹,已是汗流浹背蓖宦。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工齐婴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留油猫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓柠偶,卻偏偏與公主長(zhǎng)得像情妖,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子诱担,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 極光推送: 1.JPush當(dāng)前版本是1.8.2毡证,其SDK的開發(fā)除了正常的功能完善和擴(kuò)展外也緊隨蘋果官方的步伐,SD...
    Isspace閱讀 6,719評(píng)論 10 16
  • 推送通知注意:這里說(shuō)的推送通知跟NSNotification有所區(qū)別NSNotification是抽象的蔫仙,不可見(jiàn)的...
    醉葉惜秋閱讀 1,515評(píng)論 0 3
  • 一料睛、推送通知 注意:這里說(shuō)的推送通知跟NSNotification有所區(qū)別NSNotification是抽象的,不...
    Mg明明就是你閱讀 1,251評(píng)論 0 17
  • 什么是推送通知? APP退到后臺(tái),或者關(guān)閉時(shí);應(yīng)用推送一條消息告訴用戶某件事情,應(yīng)用通過(guò)點(diǎn)擊通知進(jìn)入到應(yīng)用相應(yīng)的頁(yè)...
    tiger2016閱讀 561評(píng)論 0 1
  • 推送通知和NSNotification是有區(qū)別的: NSNotification:是看不到的 推送通知:是可以看到...
    AA君主閱讀 2,329評(píng)論 0 7