推送通知

一、推送通知

  • 注意:這里說的推送通知跟NSNotification有所區(qū)別
    NSNotification是抽象的,不可見的
  • 推送通知是可見的(能用肉眼看到)

iOS中提供了2種推送通知

  • 本地推送通知(LocalNotification)
  • 遠(yuǎn)程推送通知(RemoteNotification)

推送通知的作用

推送通知的作用.png

推送通知的呈現(xiàn)效果總結(jié)

  • 總結(jié)一下,推送通知有5種不同的呈現(xiàn)效果
    • 在屏幕頂部顯示一塊橫幅(顯示具體內(nèi)容)
    • 在屏幕中間彈出一個(gè)UIAlertView(顯示具體內(nèi)容)
    • 在鎖屏界面顯示一塊橫幅(鎖屏狀態(tài)下,顯示具體內(nèi)容)
    • 更新app圖標(biāo)的數(shù)字(說明新內(nèi)容的數(shù)量)
    • 播放音效(提醒作用)

推送通知的呈現(xiàn)效果設(shè)置

推送通知的呈現(xiàn)效果設(shè)置.png

推送通知的使用細(xì)節(jié)

  • 發(fā)出推送通知時(shí),如果當(dāng)前程序正運(yùn)行在前臺(tái),那么推送通知就不會(huì)被呈現(xiàn)出來
  • 點(diǎn)擊推送通知后,默認(rèn)會(huì)自動(dòng)打開發(fā)出推送通知的app
  • 不管app打開還是關(guān)閉,推送通知都能如期發(fā)出



二、本地推送通知

  • 什么是本地推送通知
    • 顧名思義,就是不需要聯(lián)網(wǎng)就能發(fā)出的推送通知(不需要服務(wù)器的支持)
  • 本地推送通知的使用場景
    • 常用來定時(shí)提醒用戶完成一些任務(wù),比如
    • 清理垃圾、記賬、買衣服、看電影、玩游戲

2.1-如何發(fā)出本地推送通知

  • 創(chuàng)建本地推送通知對象
    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;

  • 調(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;

2.2-本地推送通知的其他屬性

  • 每隔多久重復(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ū))

2.3-點(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取出本地推送通知對象

2.4-iOS8.0的變化

  • 在iOS 8.0中,如果要使用本地通知,需要得到用戶的許可
    在didFinishLaunchingWithOptions方法中添加如下代碼:
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge 
                                                                                  | UIUserNotificationTypeSound
                                                                                  | UIUserNotificationTypeAlert categories:nil];

[application registerUserNotificationSettings:settings];



三、遠(yuǎn)程推送通知

3.1-什么是遠(yuǎn)程推送通知

  • 顧名思義,就是從遠(yuǎn)程服務(wù)器推送給客戶端的通知(需要聯(lián)網(wǎng))
  • 遠(yuǎn)程推送服務(wù),又稱為APNs(Apple Push Notification Services)
  • 為什么需要遠(yuǎn)程推送通知?
    • 傳統(tǒng)獲取數(shù)據(jù)的局限性
    • 只要用戶關(guān)閉了app,就無法跟app的服務(wù)器溝通,無法從服務(wù)器上獲得最新的數(shù)據(jù)內(nèi)容
    • 遠(yuǎn)程推送通知可以解決以上問題
    • 不管用戶打開還是關(guān)閉app,只要聯(lián)網(wǎng)了,都能接收到服務(wù)器推送的遠(yuǎn)程通知

3.2-遠(yuǎn)程推送通知使用須知

  • 所有的蘋果設(shè)備,在聯(lián)網(wǎng)狀態(tài)下,都會(huì)與蘋果的服務(wù)器建立長連接

  • 什么是長連接

    • 只要聯(lián)網(wǎng)了,就一直建立連接
  • 長連接的作用

    • 時(shí)間校準(zhǔn)
    • 系統(tǒng)升級
    • 查找我的iPhone
    • .....
  • 長連接的好處

    • 數(shù)據(jù)傳輸速度快
    • 數(shù)據(jù)保持最新狀態(tài)

3.3-獲得deviceToken的過程

獲得deviceToken的過程.png

獲得deviceToken的過程.png

從獲得deviceToken 到 推送消息給設(shè)備 的過程.png

全過程詳細(xì)圖.png

3.3-開發(fā)iOS程序的推送功能

一. iOS端需要做的事
  • 1.注冊蘋果獲得deviceToken
  • 2.得到蘋果返回的deviceToken
  • 3.發(fā)送deviceToken給公司的服務(wù)器
  • 4.監(jiān)聽用戶對通知的點(diǎn)擊
二.調(diào)試iOS的遠(yuǎn)程推送功能, 必備條件:
  • 1.真機(jī)
  • 2.調(diào)試推送需要的證書文件
    • 1>aps_development.cer: 某臺(tái)電腦就能調(diào)試某個(gè)app的推送服務(wù)
    • 2> iphone5_qq.mobileprovision: 某臺(tái)電腦就能利用某臺(tái)設(shè)備調(diào)試某個(gè)程序
三.發(fā)布具有推送服務(wù)的app
  • 1>aps_production.cer: 如果發(fā)布的程序中包含了推送服務(wù),就必須安裝這個(gè)證書
  • 2> qq.mobileprovision : 某臺(tái)電腦就能發(fā)布某個(gè)程序
四.注冊遠(yuǎn)程推送通知
注冊遠(yuǎn)程推送通知
  • 客戶端如果想接收APNs的遠(yuǎn)程推送通知,必須先注冊(得到用戶的授權(quán))
// 一般在App啟動(dòng)完畢后就馬上注冊
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
     //注冊遠(yuǎn)程通知
     UIRemoteNotificationType type = UIRemoteNotificationTypeAlert | 
UIRemoteNotificationTypeBadge | 
UIRemoteNotificationTypeSound;

 [application registerForRemoteNotificationTypes:type];

    return YES;
}
  • 如果是第一次注冊,會(huì)彈出右邊的對話框


    對話框.png
  • 注冊成功后會(huì)調(diào)用AppDelegate的下面方法,得到設(shè)備的deviceToken
-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken (NSData *)deviceToken
{
    NSLog(@"%@", deviceToken);
}
  • 當(dāng)用戶點(diǎn)擊遠(yuǎ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 didReceiveRemoteNotification:(NSDictionary *)userInfo;

    • 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ù)通過UIApplicationLaunchOptionsRemoteNotificationKey取出服務(wù)器返回的字典內(nèi)容




四、證書配置

創(chuàng)建App ID.png

為App ID創(chuàng)建APNs SSL證書1.png

為App ID創(chuàng)建APNs SSL證書2.png

為App ID創(chuàng)建APNs SSL證書3.png

生成描述文件.png

安裝.png



五、總結(jié):遠(yuǎn)程推送通知步驟

  • 遠(yuǎn)程推送應(yīng)用配置過程

1.創(chuàng)建支持遠(yuǎn)程推送功能的App ID
2.創(chuàng)建調(diào)試證書,并選中剛剛創(chuàng)建的App ID
3.下載CER文件,并導(dǎo)入鑰匙串管理
4.創(chuàng)建發(fā)布證書,并選中剛剛創(chuàng)建的App ID
5.下載CER文件,并導(dǎo)入鑰匙串管理
6.檢查App ID,確認(rèn)證書已經(jīng)指定
7.生成描述文件

格式:{"aps":{"alert":"This is some fancy message.","badge":1,"sound":"default"}}

  • 遠(yuǎn)程推送應(yīng)用程序開發(fā)過程

    1.新建應(yīng)用程序
    2.指定AppID,在developer.apple.com上設(shè)置的AppID

if(系統(tǒng)版本 >= 8.0)
{
    // 注冊接收通知的類型
    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
    [application registerUserNotificationSettings:settings];

    // 注冊允許接收遠(yuǎn)程推送通知
    [application registerForRemoteNotifications];
}
else
{
    // 如果是iOS7.0,使用以下方法注冊
    [application registerForRemoteNotificationTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound];
}


// 當(dāng)?shù)玫教O果的APNs服務(wù)器返回的DeviceToken就會(huì)被調(diào)用
// 7040f7d5 5a974598 c5cf31b5 3e340b39 68affd25 122f0ce1 3f315226 396c2e5b
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    NSLog(@"deviceToken是:%@", deviceToken);
}

// 接收到遠(yuǎn)程通知,觸發(fā)方法和本地通知一致
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
    NSLog(@"%@", userInfo);
}
  • 使用后臺(tái)的遠(yuǎn)程消息推送

1- 在Capabilities中打開遠(yuǎn)程推送通知
2- 實(shí)現(xiàn)代理方法

遠(yuǎn)程消息數(shù)據(jù)格式: {"aps" : {"content-available" : 1},"content-id" : 42}

/***********
           *  當(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 作用(有兩個(gè)目的)
           *
           *      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":"隨便傳")
               注意:接收到遠(yuǎn)程通知到執(zhí)行完網(wǎng)絡(luò)請求之間的時(shí)間不能超過30秒
***********/
- (void)application:(UIApplication *)application 
didReceiveRemoteNotification:(NSDictionary *)userInfo 
fetchCompletionHandler:(void (^ (UIBackgroundFetchResult))completionHandler
{
  if (userInfo) {
      int contentId = [userInfo[@"content-id"] intValue];

      ViewController *vc = (ViewController *)application.keyWindow.rootViewController;
      [vc loadDataWithContentID:contentId completion:^(NSArray *dataList) {
          vc.dataList = dataList;

          NSLog(@"刷新數(shù)據(jù)結(jié)束");

          completionHandler(UIBackgroundFetchResultNewData);
      }];
  } else {
        completionHandler(UIBackgroundFetchResultNoData);
  }



六、其他推送

  1. 遠(yuǎn)程推送測試

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

具體集成步驟以及使用方法, 請查看對應(yīng)的官方文檔, 非常詳細(xì);
第三方服務(wù)合集: http://mdsa.51cto.com/services/




如有不足之處,歡迎指出,謝謝


  • 掃一掃,關(guān)注我

掃一掃,關(guān)注我.jpg


  • 掃一掃,關(guān)注我的公眾號


    掃一掃,關(guān)注我.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 極光推送: 1.JPush當(dāng)前版本是1.8.2,其SDK的開發(fā)除了正常的功能完善和擴(kuò)展外也緊隨蘋果官方的步伐,SD...
    Isspace閱讀 6,883評論 10 16
  • 推送通知注意:這里說的推送通知跟NSNotification有所區(qū)別NSNotification是抽象的,不可見的...
    醉葉惜秋閱讀 1,614評論 0 3
  • 一、推送通知 注意:這里說的推送通知跟NSNotification有所區(qū)別NSNotification是抽象的,不...
    Mg明明就是你閱讀 1,310評論 0 17
  • 推送通知和NSNotification是有區(qū)別的: NSNotification:是看不到的 推送通知:是可以看到...
    AA君主閱讀 2,395評論 0 7
  • 推送通知 1. 什么是推送通知? 2. 推送通知的應(yīng)用場景? 3. 推送通知的展現(xiàn)樣式? 4. 推送通知的分類 本...
    翻這個(gè)墻閱讀 659評論 1 0

友情鏈接更多精彩內(nèi)容