推送通知

推送通知

1. 什么是推送通知?

    > 首先明確:**此處的推送通知跟我們的”NSNotification”沒有半毛錢關(guān)系
    > 可以理解為: 向用戶推送一條信息來通知用戶某件事情
    > 作用: 可以在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) 買過電影票后,提前半小時(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ù)字(說明新內(nèi)容的數(shù)量)
    (5) 播放音效(提醒作用)
*注意:以上樣式只能是用戶自己設(shè)置,我們無法通過代碼控制*

4. 推送通知的分類

  1. 本地推送通知

     “本地”可以理解為”不聯(lián)網(wǎng)”;即使沒有網(wǎng)絡(luò)情況下,也可以推送通知消息
     應(yīng)用場(chǎng)景: 確定知道未來某個(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. 不確定未來某個(gè)時(shí)間點(diǎn)應(yīng)該提醒用戶什么,臨時(shí)性的
         2. 當(dāng)APP徹底退出時(shí)也想繼續(xù)讓用戶獲取一些最新消息
    
    • 使用原則: 誰能確定通知時(shí)間和內(nèi)容, 誰就可以發(fā)送(開發(fā)人員在APP內(nèi)部通過代碼發(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)聽用戶點(diǎn)擊通知

    ```objc
    // app處于前臺(tái)
        此時(shí)不會(huì)彈框通知用戶通知的到達(dá),但是還是會(huì)調(diào)用對(duì)應(yīng)的代理方法
    - app并沒有關(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ù)通過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)來” + 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ā)出且過期的推送通知就算調(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)聽通知操作行為的點(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ù)器無法主動(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ì)通過調(diào)用這個(gè)方法,返回對(duì)應(yīng)的deviceToken
          */
         -(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
         {
             NSLog(@"%@", deviceToken);
         }
    
     3. 監(jiān)聽用戶對(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)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,431評(píng)論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,637評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,555評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,900評(píng)論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,629評(píng)論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,976評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,976評(píng)論 3 448
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,139評(píng)論 0 290
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,686評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,411評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,641評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,129評(píng)論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,820評(píng)論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,233評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,567評(píng)論 1 295
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,362評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,604評(píng)論 2 380

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

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