1. 程式人生 > >iOS10 遠端推送和本地推送

iOS10 遠端推送和本地推送

遠端推送
新增新的框架 UserNotifications.framework
#import <UserNotifications/UserNotifications.h>

#pragma mark 註冊推送
-(void)registerPushServer
{
    if (IOS10) {
        UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
        center.delegate = self;
        [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL
granted, NSError * _Nullable error) { if (granted) { //點選允許 NSLog(@"註冊通知成功"); [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) { NSLog(@"%@", settings); }]; } else
{ //點選不允許 NSLog(@"註冊通知失敗"); } }]; //註冊推送(同iOS8) [[UIApplication sharedApplication] registerForRemoteNotifications]; }else if (IOS8_TO_10){//iOS8到iOS10 //1.建立訊息上面要新增的動作(按鈕的形式顯示出來) UIMutableUserNotificationAction *action = [[UIMutableUserNotificationAction alloc] init]; action.identifier
= @"action";//按鈕的標示 action.title[email protected]"Accept";//按鈕的標題 action.activationMode = UIUserNotificationActivationModeForeground;//當點選的時候啟動程式 // action.authenticationRequired = YES; // action.destructive = YES; UIMutableUserNotificationAction *action2 = [[UIMutableUserNotificationAction alloc] init]; action2.identifier = @"action2"; action2.title[email protected]"Reject"; action2.activationMode = UIUserNotificationActivationModeBackground;//當點選的時候不啟動程式,在後臺處理 action.authenticationRequired = YES;//需要解鎖才能處理,如果action.activationMode = UIUserNotificationActivationModeForeground;則這個屬性被忽略; action.destructive = YES; //2.建立動作(按鈕)的類別集合 UIMutableUserNotificationCategory *categorys = [[UIMutableUserNotificationCategory alloc] init]; categorys.identifier = @"alert";//這組動作的唯一標示,推送通知的時候也是根據這個來區分 [categorys setActions:@[action,action2] forContext:(UIUserNotificationActionContextMinimal)]; //3.建立UIUserNotificationSettings,並設定訊息的顯示類型別 UIUserNotificationSettings *notiSettings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIRemoteNotificationTypeSound) categories:[NSSet setWithObjects:categorys, nil nil]];//categories設定為nil則推送無動作 //會執行代理函式- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings // 獲取type // UIUserNotificationSettings *settings = [application currentUserNotificationSettings]; // UIUserNotificationType types = [settings types]; [application registerForRemoteNotifications]; } else {//iOS8以下 [application registerForRemoteNotificationTypes: UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound]; } }

獲取deviceToken

-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    //轉換為裝置字串
    NSString *deviceTokenStr=[NSString stringWithFormat:@"%@",deviceToken];
    deviceTokenStr=[deviceTokenStr stringByReplacingOccurrencesOfRegex:@"[<>\\s]" withString:@""];
    //操作deviceToken

}

-(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
    NSLog(@"register RemoteNotifications fail:%@",[error localizedDescription]);
}
<UNUserNotificationCenterDelegate>

iOS10收到通知不再是在application: didReceiveRemoteNotification:方法去處理
推出新的代理方法,接收和處理各類通知(本地或者遠端)

#pragma mark - iOS10 推送代理

- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
    //應用在前臺收到通知
    NSLog(@"========%@", notification);
    //如果需要在應用在前臺也展示通知
completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert);
}

- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {
    //點選通知進入應用
    NSLog(@"response:%@", response);
}
#pragma mark - iOS8_10推送代理

- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forLocalNotification:(UILocalNotification *)notification completionHandler:(void (^)())completionHandler
{
    if ([identifier isEqualToString:@"XXX"]) {

     }
    completionHandler();
}

- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void (^)())completionHandler
{

}

//點選本地推送
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{

}

//點選遠端推送
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{

}

設定處理通知的action 和 category

在iOS8以前是沒有category這個屬性的;
在iOS8註冊推送,獲取授權的時候,可以一併設定category, 註冊的方法直接帶有這個引數;(見推送註冊)
在iOS10,需要呼叫一個方法setNotificationCategories:來為管理推送的UNUserNotificationCenter例項設定category, category又可以對應設定action;

//設定category
//UNNotificationActionOptionAuthenticationRequired 需要解鎖
//UNNotificationActionOptionDestructive  顯示為紅色
//UNNotificationActionOptionForeground  點選開啟app

UNNotificationAction *action1 = [UNNotificationAction actionWithIdentifier:@"action1" title:@"策略1行為1" options:UNNotificationActionOptionForeground];

UNTextInputNotificationAction *action2 = [UNTextInputNotificationAction actionWithIdentifier:@"action2" title:@"策略1行為2" options:UNNotificationActionOptionDestructive textInputButtonTitle:@"comment" textInputPlaceholder:@"reply"];

//UNNotificationCategoryOptionNone
//UNNotificationCategoryOptionCustomDismissAction  清除通知被觸發會走通知的代理方法
//UNNotificationCategoryOptionAllowInCarPlay      適用於行車模式
UNNotificationCategory *category1 = [UNNotificationCategory categoryWithIdentifier:@"category1" actions:@[action2,action1]  minimalActions:@[action2,action1] intentIdentifiers:@[] options:UNNotificationCategoryOptionCustomDismissAction];

UNNotificationAction *action3 = [UNNotificationAction actionWithIdentifier:@"action3" title:@"策略2行為1" options:UNNotificationActionOptionForeground];

UNNotificationAction *action4 = [UNNotificationAction actionWithIdentifier:@"action4" title:@"策略2行為2" options:UNNotificationActionOptionForeground];
UNNotificationCategory *category2 = [UNNotificationCategory categoryWithIdentifier:@"category2" actions:@[action3,action4]  minimalActions:@[action3,action4] intentIdentifiers:@[] options:UNNotificationCategoryOptionCustomDismissAction];

[[UNUserNotificationCenter currentNotificationCenter] setNotificationCategories:[NSSet setWithObjects:category1,category2, nil]];

設定通知內容

iOS10遠端通知與本地通知統一起來了,通知內容屬性是一致的,遠端推送需要在payload進行設定
官網上明確說明了,我們是不能直接建立UNNotificationContent的例項的,我們需要用到UNMutableNotificationContent

attachments          //附件
badge                //徽標
body                //推送內容body
categoryIdentifier  //category標識
launchImageName      //點選通知進入應用的啟動圖
sound              //聲音
subtitle            //推送內容子標題
title              //推送內容標題
userInfo          //遠端通知內容

UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
    content.title = @"Test";
    content.subtitle = @"1234567890";
    content.body = @"Copyright © 2016年 jpush. All rights reserved.";
    content.badge = @1;
    NSError *error = nil;
    NSString *path = [[NSBundle mainBundle] pathForResource:@"718835727" ofType:@"png"];
    UNNotificationAttachment *att = [UNNotificationAttachment attachmentWithIdentifier:@"att1" URL:[NSURL fileURLWithPath:path] options:nil error:&error];
    if (error) {
        NSLog(@"attachment error %@", error);
    }
    content.attachments = @[att];
    content.categoryIdentifier = @"category1";  //這裡設定category1, 是與之前設定的category對應
    content.launchImageName = @"1-Eb_0OvtcxJXHZ7-IOoBsaQ";

UNNotificationSound *sound = [UNNotificationSound defaultSound];
content.sound = sound;

通知觸發器
UNNotificationTrigger iOS10 觸發器有4種

UNPushNotificationTrigger 觸發APNS服務,系統自動設定(這是區分本地通知和遠端通知的標識)UNTimeIntervalNotificationTrigger 一段時間後觸發
UNCalendarNotificationTrigger 指定日期觸發
UNLocationNotificationTrigger 根據位置觸發,支援進入某地或者離開某地或者都有

  //十秒後
  UNTimeIntervalNotificationTrigger *trigger1 =[UNTimeIntervalNotificationTrigger triggerWithTimeInterval:10 repeats:NO];
  //每週日早上8:00
  NSDateComponents *component = [[NSDateComponents alloc] init];
  component.weekday = 1; 
  UNCalendarNotificationTrigger *trigger2 = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:component repeats:YES];
  //圓形區域,進入時候進行通知 
  CLCircularRegion *region = [[CLCircularRegion alloc] initWithCenter:cen                                                              radius:500.0 identifier:@“center"]; 
  region.notifyOnEntry = YES; //進入的時候 
  region.notifyOnExit = NO;  //出去的時候 
  UNLocationNotificationTrigger *trigger3 = [UNLocationNotificationTrigger    triggerWithRegion:region repeats:NO];

新增通知 / 更新通知

1.建立一個UNNotificationRequest類的例項,一定要為它設定identifier(不能是空字串@”“), 在後面的查詢,更新, 刪除通知,這個標識是可以用來區分這個通知與其他通知
2.把request加到UNUserNotificationCenter, 並設定觸發器,等待觸發

如果另一個request具有和之前request相同的標識,不同的內容, 可以達到更新通知的目的

 NSString *requestIdentifer = @"TestRequest";
  UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:requestIdentifer content:content trigger:trigger1];
  //把通知加到UNUserNotificationCenter, 到指定觸發點會被觸發
  [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
  }];

//在另外需要更新通知的地方
UNMutableNotificationContent *newContent = [[UNMutableNotificationContent alloc] init];
newContent.title = @"Update";
newContent.subtitle = @"XXXXXXXXX";
newContent.body = @"Copyright © 2016年 jpush. All rights reserved.";
UNTimeIntervalNotificationTrigger *trigger1 = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:3 repeats:NO];
UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"TestRequest" content:newContent trigger:trigger1];
[[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {

}];

獲取和刪除通知

  • Pending 等待觸發的通知
  • Delivered 已經觸發展示在通知中心的通知
//獲取未觸發的通知
    [[UNUserNotificationCenter currentNotificationCenter] getPendingNotificationRequestsWithCompletionHandler:^(NSArray<UNNotificationRequest *> * _Nonnull requests) {
        NSLog(@"pending: %@", requests);
    }];

    //獲取通知中心列表的通知
    [[UNUserNotificationCenter currentNotificationCenter] getDeliveredNotificationsWithCompletionHandler:^(NSArray<UNNotification *> * _Nonnull notifications) {
        NSLog(@"Delivered: %@", notifications);
    }];

    //清除某一個未觸發的通知
    [[UNUserNotificationCenter currentNotificationCenter] removePendingNotificationRequestsWithIdentifiers:@[@"TestRequest1"]];
    //清除某一個通知中心的通知
    [[UNUserNotificationCenter currentNotificationCenter] removeDeliveredNotificationsWithIdentifiers:@[@"TestRequest2"]];
    //對應的刪除所有通知
    [[UNUserNotificationCenter currentNotificationCenter] removeAllPendingNotificationRequests];
    [[UNUserNotificationCenter currentNotificationCenter] removeAllDeliveredNotifications];

本地推送

#pragma mark 初始化本地通知
-(void)initLocalNotification
{
    if (IOS10) {

        //對應的刪除所有通知
        [[UNUserNotificationCenter currentNotificationCenter] removeAllPendingNotificationRequests];
        [[UNUserNotificationCenter currentNotificationCenter] removeAllDeliveredNotifications];

        if ([[_facade getSendNewsProxy] isExistFailueNews])
        {
            UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
            content.body = NSLocalizedString(@"NEWS_CENTER_FAILNEWS", @"你有一條動態傳送失敗");
            UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"TestRequest" content:content trigger:nil];
            [[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {

            }];
        }

        UNMutableNotificationContent * notifC = [[UNMutableNotificationContent alloc] init];
        notifC.body = NSLocalizedString(@"COMMON_THREE_DAYS_NOT_LOGINED",@"你10秒沒點選我了!");
        //3天不登入則進行提醒
        UNTimeIntervalNotificationTrigger *trigger1 = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:3 repeats:NO];
        UNNotificationRequest *request1 = [UNNotificationRequest requestWithIdentifier:@"TestRequest1" content:notifC trigger:trigger1];
        [[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request1 withCompletionHandler:^(NSError * _Nullable error) {

        }];

    }else {

        //取消所有之前的本地通知
        [[UIApplication sharedApplication] cancelAllLocalNotifications];

        if ([[_facade getSendNewsProxy] isExistFailueNews])
        {
            UILocalNotification *localNoti = [[UILocalNotification alloc] init];
            if (localNoti)
            {
                localNoti.alertBody = NSLocalizedString(@"NEWS_CENTER_FAILNEWS", @"你有一條動態傳送失敗");
                [[UIApplication sharedApplication] scheduleLocalNotification:localNoti];
            }
        }

        UILocalNotification *localNotif=[[UILocalNotification alloc] init];
        if (localNotif)
        {
            //3天不登入則進行提醒
            localNotif.fireDate=[[NSDate date] dateByAddingTimeInterval:3600*24*3];
            localNotif.timeZone=[NSTimeZone defaultTimeZone];
            localNotif.alertBody=NSLocalizedString(@"COMMON_THREE_DAYS_NOT_LOGINED",@"你10秒沒點選我了!");
            localNotif.applicationIconBadgeNumber++;
            [[UIApplication sharedApplication] scheduleLocalNotification:localNotif];
        }
    }

}

相關推薦

iOS10 遠端本地

遠端推送 新增新的框架 UserNotifications.framework #import <UserNotifications/UserNotifications.h> #pragma mark 註冊推送 -(void)regis

android 之本地遠端

在現在的app中推送技術很普遍,推送可以提高使用者活躍度,也可以進行一些活動推送,今天就跟大家聊一下推送 推送分為遠端推送和本地推送,都可以通過推送訊息跳轉到一些應用或者活動介面,本地推送幾行程式碼就可以實現,遠端推送就需要藉助一些平臺的力量 (1)本地推送 Notifi

iOS開發 - ANPs通知 標簽: 通知ANPs遠程本地

control con 垃圾 pre 條件 %20 常用 建立連接 mod iOS開發 - ANPs推送通知 標簽: 推送通知ANPs遠程推送本地推送 2015-05-03 14:12 3510人閱讀 評論(0) 收藏 舉報 本文章已收錄於: iOS知識庫

.net實現手機介面

最近做專案用到手機實時推送和介面實時推送兩種功能,分別用了Fleck和極光推送。 Fleck: Fleck是 C# 實現的 WebSocket 伺服器。比WebSoket更容易配置,開發更為簡單。 官方地址:https://github.com/sta

iOS10本地遠端的原理

使用遠端推送首先要在capacity中開啟後推送服務開關,有兩個地方要開啟。 參考:http://www.jianshu.com/p/bb89d636f989 http://www.jianshu.com/p/f6701763f8f2 http:

iOS 通知:本地通知(UILocalNotification)遠端通知(APNs)詳解

——本地推送通知 推送通知的作用? 在App退到後臺或者完全退出時,可以使用通知來告訴使用者某件事情,比如推送新的聊天訊息、新聞等 通知對應的效果: 在主螢幕的頂端會出現通知訊息 當手機鎖屏時出現在鎖屏介面,可以通過滑動開啟該App, 在通知中心中

git強制覆蓋原生代碼強制本地遠端倉庫

1.git強制覆蓋本地檔案(與git遠端倉庫保持一致): git fetch --all git reset --hard origin/master git pull git強制覆蓋本地命令(單條執行): git fetch --all &&

本地分支建立,切換

命令 建立:git checkout -b 分支名 推送:git add 檔名 git commit -m “註釋” git push origin 本地分支名 切換:git checkout 分支名 步驟: 檢視分支 1.輸入git branch回車 注:命令

GitExtensionpull本地資料到遠端倉庫

1.建立新的檔案庫  如果是自己已經開發的專案,直接選中開發的專案目錄,直接進行初始化,得到初始化的檔案庫,會顯示下列頁面 從檔案樹看到初始化的檔案庫為空,此時點選提交,會跳轉到工作區間的更新頁面 “提交”是將檔案提交到本地庫 “提交併推送”則是同時將檔案提交到本地庫並

ubuntu git安裝與使用+更新被拒絕,因為遠端倉庫包含您本地尚不存在的提交。這通常是因為另外 提示:一個倉庫已向該引用進行了推送+更新被拒絕,因為您當前分支的最新提交落後於其對應的遠端分支

1 安裝安裝方式主要有兩種,即通過Apt和source:1.1 通過Apt安裝:官網上提供的命令是:$ sudo add-apt-repository ppa:git-core/ppa1中間暫停時,按回車鍵Enter繼續安裝。$ sudo apt-get update $ s

IOS (本地遠端、三方[極光])

Provider是給你手機應用發出推送訊息的伺服器,而APNS(Apple Push Notification Service)則是蘋果訊息推送伺服器。你本地的伺服器當需要給應用推送一條訊息的時候,先要將訊息發出到蘋果推送伺服器,然後再由蘋果推送伺服器將訊息發到安裝了該應用的手機。 接下來再看一張解釋圖

手把手git教程(05)--遠端倉庫克隆

如何新增遠端庫?          現在的情景是:我們已經在本地建立了一個Git倉庫後,又想在github建立一個Git倉庫,並且希望這兩個倉庫進行遠端同步,這樣github的倉庫可以作為備份,又可以其他人通過該倉庫來協作。    首先,登入github上,然後在右上角找

本地遠端(JPUSHService極光例)

本地推送,例:app鬧鐘,定時提醒==     /*     //iOS8以後需要先註冊本地通知,需要經過使用者的同意     if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {

Git將一個專案同時從本地到GitHubGitee

前言 博主是根據自己的情況寫這篇博文的,每個人遇到的情況和需求可能不一樣哈,所以初始的步驟也不一定一致,但是同時推送到Github和Gitee的步驟都會是一致滴!   Gitee拉取Github倉庫 直接在Gitee中建立一個專案,然後再最後一行匯入Github專案就闊以啦! 去到你的Githu

SwiftUI - iOS10本地通知教程UserNotifications在Swift中的實現方式

## 簡介 訊息推送相信在很多人的眼裡都不陌生了吧?像即時聊天微信,好友發信息給你時會在頂部彈下小視窗提醒你。也像是在影院APP預訂了電影票,在開場前一小時你也會收到提醒。這類推送是需要經過後端傳送請求的,需要伺服器傳送推送請求,又或者使用如極光推送等第三方渠道。 那麼如果我們的APP不需要連網呢?這是不

git的分支遠端連線遠端分支的拉取及衝突處理

[toc] ## 備註: 本文參考於廖雪峰老師的部落格[Git教程](https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000)。依照其部落格進行學習和記錄,感謝其無私分享,也歡迎各位檢視原文。

適配 iOS 8 時遇到的問題兩則:遠程 Unwind Segue

沒有 code cat ios 6 相同 padding nic else bre 原文:http://imtx.me/archives/1910.html 昨天我在微博上吐槽:iOS 8 / Xcode 6 真是史上對開發人員最糟糕的版本號了。收到非常多朋友表

對接第三方平臺JAVA接口問題解決

處理 end isp var created esc 再看 名稱 mba 前言 本節所講為實際項目中與第三方對接出現的問題最後還是靠老大解決了問題以此作為備忘錄,本篇分為三小節,一小節解析Java加密接口數據,二小節解析XML文件需註意問題,最後一節則是請求Java So

ActiveMQ環境部署+C#接收消息

pri active erro 技術 exc using serialize 生產 sage 一、 ActiveMQ環境部署 Jdk:jdk-8u91-windows-i586.exe ActiveMQ:apache-activemq-5.15.

Java 消息------GoEasy實現服務端web端

subscribe rip world 查詢 start easy 需要 註冊 註意 項目中需要消息推送,又想較低開發成本,具體需求:角色用戶在後臺管理頁面發布一個消息,所有用這個系統的用戶無論在哪個頁面都能及時收到他發布的消息,後來我在網上查詢到了一個第三方的免費推送服務