iOS基礎--推送通知小結

<big>上有六龍回日之高標,下有沖波逆折之回川!黃鶴之飛尚不得過,猿猱欲度愁攀援!<吉利蛋></big>

本地推送和遠程推送

  • 遠程的推送通知和本地推送通知,都是可以在 App 不在前臺運行的時候向其發送相應的消息,這種消息來自服務器下發的最新的數據或者是本地提醒用戶要做得事,兩種通知在用戶手機端展示的效果是一樣的,基本上都是用戶設置展示成一段信息內容或者是 App 的應用圖片相應的標志。
  • 使用推送的目的是主要就是讓 App 能夠通知使用者一些事情,并且不強求 App 必須在前臺。
  • 本地推送由 App 端自行調用,只能由當前使用的設備(手機端)發出;遠程推送是服務器發送到 APNs(蘋果推送通知服務 Apple Push Notification service ),再轉發推送到設備上 App
  • 本地推送: 不需要聯網,我們只需要在 App 中設置特定的時間提醒使用者要做啥就行了。(例如:按時提醒病人吃藥)
  • 遠程推送:需要聯網,我們的客戶端設備和 APNs 服務器會形成一個長連接,設備會向蘋果的服務器發送 UIID 和 Bundle ID,蘋果的服務器利用加密生成 deviceToken 給用戶設備,用戶設備將這個 deviceToken 發送給自己的服務器(下發推送消息的服務器),服務器會進行的數據庫存儲操作。
    • 需要向某設備發送推送消息的時候,如果用戶 App 在線使用中, 我們的服務器和 App 建立長連接,把推送的消息通過 deviceToken 區分直接推送到設備。
    • 如果App沒有在線使用的話,我們服務器會把要推送的消息和 deviceToken 發送給蘋果的服務器,由蘋果的服務器根據 deviceToken 找到對應的設備進行消息的推送

用戶可以設置推送通知展現樣式

1.App圖標上的消息數字,應用圖標標記(例如 QQ 紅色圓圈顯示未讀消息數字)
2.屏幕頂部顯示橫幅展示消息內容
3.鎖屏屏幕上顯示消息內容
4.聲音提醒
5.彈窗提醒吧
6.忘了還有沒有,有的話再來補充。


iOS 10 之后的改變

  1. 所有相關通知被統一到了UserNotifications.framework框架中。
  1. 增加了撤銷、更新、中途還可以修改通知的內容。
  2. 通知不在是簡單的文本了,可以加入視頻、圖片,自定義通知的展示
  3. 對于權限問題進行了優化,申請權限就比較簡單了(本地與遠程通知集成在一個方法中)。

上代碼 先寫個簡單的本地通知吧,我發現一寫的話內容就好多了慢慢寫吧!:
  • iOS 之前一般這樣注冊本地通知,然后就是一些其他的設置
 //    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge|UIUserNotificationTypeSound|UIUserNotificationTypeAlert) categories:nil];
//    [application registerUserNotificationSettings:settings]; ```

- 直接看 iOS10代碼吧,注冊通知并且設置一下樣式
```code
 // 注冊推送通知,iOS10之后   不管是本地通知還是遠程推送通知,都是注冊然后發送請求的形式存在。
    UNUserNotificationCenter *notificationCenter = [UNUserNotificationCenter currentNotificationCenter];
    notificationCenter.delegate = self;
    /**
     
     用戶授權應用程序通知用戶需要使用UNUserNotificationCenter通過本地和遠程通知。

     @param  option  參數設置支持通知的樣式,聲音,橫幅,彈框,等
     @param  error   錯誤信息
     @param  granted 授予成功
     */
    [notificationCenter requestAuthorizationWithOptions:UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert completionHandler:^(BOOL granted, NSError * _Nullable error) {
     NSLog(@"授權推送通知---->%d--%@", granted, error);
            }];; //
    ```
- ### 代理方法實現:

```code 
// 這里設置前臺展示的類型  聲音 彈窗 條幅  默認是不展示的所以一定要設置
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler
{
    completionHandler(UNNotificationPresentationOptionAlert|UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound);
}
// 處理用戶與通知交互后的操作 點擊了推送消息 打印了結果
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler
{
     NSLog(@"%s--->處理通知的交互",__func__);
}
  • 初始化一個通知的內容
  • UNNotificationContent: 用來具體描述通知的一個類
    一些關鍵屬性:
-  attachments    這個數組存儲的是 UNNotificationAttachment類 實例對象(UNNotificationAttachment類的作用 : 當我們想要推送帶“圖片”和”視頻“的通知,就需要靠這個類的實例化方法實現,然后放到這個屬性的數組下。注意只能是本地文件,要想使網絡的上的先存到本地)
  • 其他的屬性有時間我再補充今天先說幾個,再不寫完肯德雞要攆人了!
UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
   content.badge = @100; // 應用圖標上數字
   content.title = @"本地推送";
   content.sound = [UNNotificationSound defaultSound];;// 通知 的 聲音
   content.body = @"但使龍城飛將在,通知的詳細內容!";  // 沒有body的話不會彈出通知
// 在推送通知上展示的圖片路徑
 NSString * pathImage =  [[NSBundle mainBundle] pathForResource:@"a"ofType:@"png"];
// 通知附帶其他東西 這是給了個圖片  根據上邊的路徑
 content.attachments = @[ [UNNotificationAttachment attachmentWithIdentifier:@"ShowImage" URL:[NSURL fileURLWithPath:pathImage] options:nil error:nil]]; ```

- 設置推送的時機,也就是這個通知怎么去觸發
>UNCalenderNotificaitionTrigger(某一時間固定觸發通知)
     UNLocationNotificaitionTrigger (當進入某一區域觸發通知)
     UNTimeIntervalNotificaitionTrigger (設置時間間隔觸發通知)

```code 
// 2秒后推送 不重復推送
UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:2.0 repeats:NO];```

- 設置推送的請求    依據  推送的內容  推送時機

```code 
// 參數  請求的標示符  通知的內容 通知的觸發機制
UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"PP_Notification" content:content trigger:trigger];```

- 把這個請求添加給用戶通知中心

```code
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
[center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
    
}];```

##### 效果展示
![](http://upload-images.jianshu.io/upload_images/1523603-e4bf72d71b0b600d.gif?imageMogr2/auto-orient/strip)

--------
希望有時間把其他的也能總結一下,今天先到這吧![GitHub 希望給您幫助]()
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容