iOS10--消息通知的基本使用

来源:https://www.cnblogs.com/jiuyi/archive/2019/01/24/10314551.html
-Advertisement-
Play Games

官方將通知單獨放在了UserNotifications.framework,使用時需要導入框架。UserNotifications.framework主要類文件: UNUserNotificationCenter的應用: 請求用戶授權: UNUserNotificationCenter* cente ...


官方將通知單獨放在了UserNotifications.framework,使用時需要導入框架。
UserNotifications.framework主要類文件:

UNCalendarNotificationTrigger
UNLocationNotificationTrigger
UNMutableNotificationContent
UNNotification
UNNotificationAction
UNNotificationAttachment
UNNotificationCategory
UNNotificationContent
UNNotificationRequest
UNNotificationResponse
UNNotificationServiceExtension
UNNotificationSettings
UNNotificationSound
UNNotificationTrigger
UNPushNotificationTrigger
UNTextInputNotificationAction
UNTextInputNotificationResponse
UNTimeIntervalNotificationTrigger
UNUserNotificationCenter

UNUserNotificationCenter的應用:

  • 請求用戶授權:
    UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];    
    // 請求授權    
    /*     
    UNAuthorizationOptionBadge   = (1 << 0),     
    UNAuthorizationOptionSound   = (1 << 1),     
    UNAuthorizationOptionAlert   = (1 << 2),     
    UNAuthorizationOptionCarPlay = (1 << 3),     
    */    
    [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert + UNAuthorizationOptionSound + UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error) {  if(granted){

       if(granded)
         //同意
       }else{
         //不同意
       }

    }];

    補充:獲取授權設置信息
    // 獲取通知授權和設置    
    [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {        
    /*         
    UNAuthorizationStatusNotDetermined : 沒有做出選擇         
    UNAuthorizationStatusDenied : 用戶未授權         
    UNAuthorizationStatusAuthorized :用戶已授權         
    */        
    if (settings.authorizationStatus == UNAuthorizationStatusNotDetermined) 
    {                       
          NSLog(@"未選擇");                  
    }else if (settings.authorizationStatus == UNAuthorizationStatusDenied){                        
          NSLog(@"未授權");                   
    }else if (settings.authorizationStatus == UNAuthorizationStatusAuthorized){                      
          NSLog(@"已授權");        
    }       
    }]
  • 創建本地通知:

    // 創建一個本地通知
    UNMutableNotificationContent *content_1 = [[UNMutableNotificationContent alloc] init];    
    // 主標題    
    content_1.title = [NSString localizedUserNotificationStringForKey:@"title" arguments:nil];    
    // 副標題    
    content_1.subtitle = [NSString localizedUserNotificationStringForKey:@"subtitle" arguments:nil];    
    content_1.badge = [NSNumber numberWithInteger:1];    
    content_1.body = [NSString localizedUserNotificationStringForKey:@"title_message_for_yan" arguments:nil];    
    content_1.sound = [UNNotificationSound defaultSound];    
    // 設置觸發時間    
    UNTimeIntervalNotificationTrigger *trigger_1 = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:10 repeats:NO];    
    // 創建一個發送請求
    UNNotificationRequest *request_1 = [UNNotificationRequest requestWithIdentifier:@"my_notification" content:content_1 trigger:trigger_1];

    補充:

    • UserNotifications提供了三種觸發器:
      UNTimeIntervalNotificationTrigger :一定時間後觸發
       
      UNCalendarNotificationTrigger : 在某月某日某時觸發
       
      UNLocationNotificationTrigger : 在用戶進入或是離開某個區域時觸發
    • @“my_notification”請求的標識符可以用來管理通知:
      - 移除還未展示的通知
      [center removePendingNotificationRequestsWithIdentifiers: @[@“my_notification”]];
      [center removeAllPendingNotificationRequests]; // - (void)cancelAllLocalNotifications;
       
      - 移除已經展示過的通知
      [center removeDeliveredNotificationsWithIdentifiers:@[@“my_notification”]];
      [center removeAllDeliveredNotifications];
       
      - 獲取未展示的通知
      [center getPendingNotificationRequestsWithCompletionHandler:^(NSArray<UNNotificationRequest *> * _Nonnull requests) {
          NSLog(@"%@",requests);
      }];
       
      - 獲取展示過的通知
      [center getDeliveredNotificationsWithCompletionHandler:^(NSArray<UNNotification *> * _Nonnull notifications) {
          NSLog(@"%@",notifications);
      }];
    • 遠程通知的格式:
      { "aps":{ "alert":{ "title":"I am title", "subtitle":"I am subtitle", "body":"I am body" }, "sound":"default", "badge":1 } }
      具體請參考官方文檔
  • 將通知請求添加到通知中心(UNUserNotificationCenter):

    [center addNotificationRequest:request_1 withCompletionHandler:^(NSError * _Nullable error) {

    }];

     

         
    接收通知
  • 處理通知:
    設置UNUserNotificationCenterDelegate
    註意:UNUserNotificationCenter 的 delegate 必須在 application:willFinishLaunchingWithOptions: orapplication:didFinishLaunchingWithOptions: 方法中實現;

    center.delegate = self;
    • 應用內展示通知:

      - (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler{
          // 如果不想顯示某個通知,可以直接用空 options 調用 completionHandler: // completionHandler([])
          completionHandler(UNNotificationPresentationOptionBadge + UNNotificationPresentationOptionSound);
      }

       

    • 在用戶與你推送的通知進行交互時被調用:
      - (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler{
          completionHandler();
          NSLog(@"userInfo--%@",response.notification.request.content.userInfo);
      }

UNNotificationCategory的應用:

  • 創建一個 category:
     
    /*
     
    UNNotificationActionOptionAuthenticationRequired = (1 << 0),
     
    UNNotificationActionOptionDestructive = (1 << 1), 取消
     
    UNNotificationActionOptionForeground = (1 << 2), 啟動程式
     
    */
     
    UNTextInputNotificationAction *textAction = [UNTextInputNotificationAction actionWithIdentifier:@"my_text" title:@"text_action" options:UNNotificationActionOptionForeground textInputButtonTitle:@"輸入" textInputPlaceholder:@"預設文字"];
     
    UNNotificationAction *action = [UNNotificationAction actionWithIdentifier:@"my_action" title:@"action" options:UNNotificationActionOptionDestructive];
     
    UNNotificationAction *action_1 = [UNNotificationAction actionWithIdentifier:@"my_action_1" title:@"action_1" options:UNNotificationActionOptionAuthenticationRequired];
     
    /*
     
    UNNotificationCategoryOptionNone = (0),
     
    UNNotificationCategoryOptionCustomDismissAction = (1 << 0),
     
    UNNotificationCategoryOptionAllowInCarPlay = (2 << 0),
     
    */
     
    UNNotificationCategory *category = [UNNotificationCategory categoryWithIdentifier:@"my_category" actions:@[textAction,action,action_1] intentIdentifiers:@[] options:UNNotificationCategoryOptionCustomDismissAction];
     
    NSSet *setting = [NSSet setWithObjects:category, nil];
     
    [center setNotificationCategories:setting];

     

  • 在創建 UNNotificationContent 時把 categoryIdentifier 設置為需要的 category id 即可:
    content.categoryIdentifier = @"my_category";

    遠程推送也可以使用 category,只需要在 payload 中添加 category 欄位,並指定預先定義的 category id 就可以了

  • 處理category的通知:
    - (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler{
     
    completionHandler();
     
    NSLog(@"userInfo--%@",response.notification.request.content.userInfo);
     
    // 獲取通知中心的所有的Categories
     
    [center getNotificationCategoriesWithCompletionHandler:^(NSSet<UNNotificationCategory *> * _Nonnull categories) {
     
    for (UNNotificationCategory *category in categories) {
     
    if ([category.identifier isEqualToString:@"my_category"] && [response.notification.request.content.categoryIdentifier isEqualToString:@"my_category"]) {
     
    for (UNNotificationAction *textAction in category.actions) {
     
    if ([textAction.identifier isEqualToString:@"my_text"]) {
     
    UNTextInputNotificationAction *text = (UNTextInputNotificationAction *)textAction;
     
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:text.textInputButtonTitle preferredStyle:UIAlertControllerStyleAlert];
     
    [alert addAction:[UIAlertAction actionWithTitle:@"確定" style:UIAlertActionStyleCancel handler:nil]];
     
    [[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:alert animated:YES completion:nil];
     
    }
     
    }
     
    }
     
    }
     
    }];
     
    }
          
長按 3D touch 效果圖

          
進入應用
iOS 10 中被標為棄用的 API
UILocalNotification
UIMutableUserNotificationAction
UIMutableUserNotificationCategory
UIUserNotificationAction
UIUserNotificationCategory
UIUserNotificationSettings
handleActionWithIdentifier:forLocalNotification:
handleActionWithIdentifier:forRemoteNotification:
didReceiveLocalNotification:withCompletion:
didReceiveRemoteNotification:withCompletion:

 

來源


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • JDBC全稱為:Java Data Base Connectivity (java資料庫連接),主要用於java與資料庫的鏈接。 整個鏈接過程如下圖: 1.資料庫驅動:Driver 載入mysql驅動:Class.forName("com.mysql.jdbc.Driver"); 載入oracle驅 ...
  • 備註: 直接使用Count(*)或Count(1)這些大家基本都會,主要是Count函數還可以加滿足表達式的統計:express 關於Count函數表達式的用法,目前個人只知道2種: a:使用:Count(表達式 Or null) b:使用:Count(Case when 表達式 then 1 E... ...
  • 網有很多相關內容,我在此做記錄和總結 1、主要是sql server 配置管理工具的配置 在此參考 https://www.cnblogs.com/yougmi/p/4616273.html(再次感謝!) (1)打開 sqlserver配置管理器 (2)三處配置,一處重啟: 一處配置: 二處配置: ...
  • 最近在跟著一個大佬學習Hadoop底層源碼及架構等知識點,覺得有必要記錄下來這個學習過程。想到了這個廢棄已久的blog賬號,決定重新開始更新。 主要分以下幾步來進行源碼學習: 一、搭建源碼閱讀環境二、源碼項目結構概覽及hdfs源碼包結構簡介三、NameNode介紹 第一步,搭建源碼閱讀環境。 把Ha ...
  • 根據網上安裝教程,簡單總結如下: 1.去mongodb官網下載電腦系統對應版本的軟體,比如我的是windows 64位的,就選擇64位的,可能下載下來之後文件夾上面顯示的是win32,這個不用理會; 2.把該目錄放到自己對應放軟體的盤下,我放在了d盤; 3.在mongodb文件夾目錄下新建data文 ...
  • 事務的基本特性: 事務有4個非常重要的特性 (ACID) Atomicity(原子性) 事務是一個不可分割的整體,所有操作要麼全做,要麼全不做;只要事務中有一個操作出錯,回滾到事務開始前的狀態的話,那麼之前已經執行的所有操作都是無效的,都應該回滾到開始前的狀態。 Consistency(一致性) 事 ...
  • 數據結構 redis是key-value的數據結構,每條數據都是一條字元串。註意:鍵的類型是字元串,並且不能重覆。 值的類型分5種: 字元串string 哈希hash 列表list 集合set 有序集合 數據操作行為 保存 修改 獲取 刪除 sting類型 字元串類型的redis中最為基礎的數據存儲 ...
  • 壁紙分為動態和靜態兩種: 如果只需要修改預設靜態壁紙,替換frameworks/base/core/res/res/drawable/default_wallpaper.jpg即可,或者在源碼中修改對應default_wallpaper地址.修改動態壁紙:在frameworks/base/core/ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...