1. 程式人生 > >個推推送,APP接收到推送後的操作(前臺與非前臺的處理不同)

個推推送,APP接收到推送後的操作(前臺與非前臺的處理不同)

前言

在去年的蘋果大會上,蘋果帶來的iOS 10 系統中將之前繁雜的推送通知統一成UserNotifications.framework 來集中管理和使用通知功能,還增加一些實用的功能——撤回單條通知、更新已展示通知、中途修改通知內容、在通知中顯示多媒體資源、自定義UI等功能。
那麼在ios10之前,ios的訊息推送是怎麼分類的呢?

ios 10之前

在ios之前,iOS推送分為Local Notifications(本地推送) 和 Remote Notifications(遠端推送)。

本地推送

不需要伺服器支援(無需聯網)就能發出的推送通知,app本地建立通知,加入到系統的Schedule裡,如果觸發器條件達成時會推送相應的訊息內容,如常見的定時任務鬧鐘等。

這裡寫圖片描述

使用上也是非常簡單。

/*
 @property(nonatomic,copy) NSDate *fireDate;
 @property(nonatomic,copy) NSTimeZone *timeZone; 時區

 @property(nonatomic) NSCalendarUnit repeatInterval; 重複間隔(列舉)
 @property(nonatomic,copy) NSCalendar *repeatCalendar; 重複日期(NSCalendar)

 @property(nonatomic,copy) CLRegion *region 設定區域(設定當進入某一個區域時,發出一個通知)

 @property
(nonatomic,assign) BOOL regionTriggersOnce YES,只會在第一次進入某一個區域時發出通知.NO,每次進入該區域都會發通知 @property(nonatomic,copy) NSString *alertBody; @property(nonatomic) BOOL hasAction; 是否隱藏鎖屏介面設定的alertAction @property(nonatomic,copy) NSString *alertAction; 設定鎖屏介面一個文字 @property(nonatomic,copy) NSString *alertLaunchImage; 啟動圖片 @property
(nonatomic,copy) NSString *alertTitle @property(nonatomic,copy) NSString *soundName; @property(nonatomic) NSInteger applicationIconBadgeNumber; @property(nonatomic,copy) NSDictionary *userInfo; // 設定通知的額外的資料 */ - (IBAction)addLocalNote:(id)sender { // 建立一個本地通知 UILocalNotification *localNote = [[UILocalNotification alloc] init]; // 設定本地通知的一些屬性(通知發出的時間/通知的內容) // 設定通知發出的時間 localNote.fireDate = [NSDate dateWithTimeIntervalSinceNow:5.0]; //設定通知的內容 localNote.alertBody = @"吃飯了嗎?"; //設定鎖屏介面的文字 localNote.alertAction = @"檢視具體的訊息"; //設定鎖屏介面alertAction是否有效 localNote.hasAction = YES; //設定通過點選通知開啟APP的時候的啟動圖片(無論字串設定成什麼內容,都是顯示應用程式的啟動圖片) localNote.alertLaunchImage = @"111"; //設定通知中心通知的標題 localNote.alertTitle = @"222222222222"; //設定音效 localNote.soundName = @"buyao.wav"; //設定應用程式圖示右上角的數字 localNote.applicationIconBadgeNumber = 1; //設定通知之後的屬性 localNote.userInfo = @{@"name" : @"張三", @"toName" : @"李四"}; //排程通知 [[UIApplication sharedApplication] scheduleLocalNotification:localNote]; }

這裡寫圖片描述

當用戶點選本地推送通知的時候,會自動開啟app,這裡有2種情況:app在後臺執行,或者被系統程序殺死,對於這兩種情況,我們怎麼處理呢?

app後臺執行

這裡寫圖片描述
這時候我們只需要呼叫下AppDelegate方法即可。程式碼實現

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
    // 跳轉邏輯
    if (application.applicationState == UIApplicationStateActive) return;

    if (application.applicationState == UIApplicationStateInactive) {
        // 當應用在後臺收到本地通知時執行的跳轉程式碼
        [self jumpToSession];
    }

    NSLog(@"local notifacation %@", notification);
}

- (void)jumpToSession
{
    UILabel *redView = [[UILabel alloc] init];
    redView.backgroundColor = [UIColor redColor];
    redView.frame = CGRectMake(0, 100, 300, 400);
    redView.numberOfLines = 0;
    // redView.text = [NSString stringWithFormat:@"%@", launchOptions];
    [self.window.rootViewController.view addSubview:redView];
}

app被殺死

這裡寫圖片描述
對於app被殺死的情況,要先啟動app,啟動完畢會呼叫AppDelegate方法。
需要特別注意的是:在iOS8.0以後本地通知有了一些變化,如果要使用本地通知,需要得到使用者的許可。
部分程式碼實現:

#define IS_iOS8 ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0)

@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    /*
     UIUserNotificationTypeNone    = 0,      不發出通知
     UIUserNotificationTypeBadge   = 1 << 0, 改變應用程式圖示右上角的數字
     UIUserNotificationTypeSound   = 1 << 1, 播放音效
     UIUserNotificationTypeAlert   = 1 << 2, 是否執行顯示橫幅
     */

    [application setApplicationIconBadgeNumber:0];

    if (IS_iOS8) {
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound categories:nil];
        [application registerUserNotificationSettings:settings];
    }

    // 如果是正常啟動應用程式,那麼launchOptions引數是null,其他方式需要對launchOptions設定
    if (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]) {
        // 當被殺死狀態收到本地通知時執行的跳轉程式碼
        // [self jumpToSession];
        UILabel *redView = [[UILabel alloc] init];
        redView.backgroundColor = [UIColor redColor];
        redView.frame = CGRectMake(0, 100, 300, 400);
        redView.numberOfLines = 0;
        redView.text = [NSString stringWithFormat:@"%@", launchOptions];
        [self.window.rootViewController.view addSubview:redView];
    }

    return YES;
}

遠端推送

遠端推送指從遠端伺服器推送給客戶端的通知(需要聯網),遠端推送服務一般採用蘋果的APNS (Apple Push Notification Service)。
這裡寫圖片描述

要實現遠端推送,一般會涉及到三個階段:

  1. APNS Pusher應用程式把要傳送的訊息、目的iPhone的標識打包,發給APNS。
  2. APNS在自身的已註冊Push服務的iPhone列表中,查詢有相應標識的iPhone,並把訊息發到iPhone。
  3. iPhone把發來的訊息傳遞給相應的應用程式, 並且按照設定彈出Push通知。

基本配置

條件:新建一個對應你bundle的push 證書,開啟Push Notifications 開關(XCode7不開啟也可以正常使用,XCode8以後必須開啟)。
這裡寫圖片描述

這裡寫圖片描述

程式碼實現:
註冊接受APNs通知。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {
        // 1.註冊UserNotification,以獲取推送通知的許可權
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge categories:nil];
        [application registerUserNotificationSettings:settings];

        // 2.註冊遠端推送
        [application registerForRemoteNotifications];
    } else {
        [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeNewsstandContentAvailability | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound];
    }
    return YES;
}

呼叫AppDelegate方法,獲取到使用者的deviceToken。

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    // <32e7cf5f 8af9a8d4 2a3aaa76 7f3e9f8e 1f7ea8ff 39f50a2a e383528d 7ee9a4ea>
    // <32e7cf5f 8af9a8d4 2a3aaa76 7f3e9f8e 1f7ea8ff 39f50a2a e383528d 7ee9a4ea>
    NSLog(@"%@", deviceToken.description);
}

推送通知,和本地通知一樣有兩種狀況。

// 當接受到遠端退職時會執行該方法(當進入前臺或者應用程式在前臺)
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    NSLog(@"%@", userInfo);

    UIView *redView = [[UIView alloc] init];
    redView.backgroundColor = [UIColor redColor];
    redView.frame = CGRectMake(100, 100, 100, 100);
    [self.window.rootViewController.view addSubview:redView];
}

蘋果建議使用方法

/*
 1.開啟後臺模式
 2.呼叫completionHandler,告訴系統你現在是否有新的資料更新
 3.userInfo新增一個欄位:"content-available" : "1" : 只要添加了該欄位,接受到通知都會在後臺執行
 */
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    NSLog(@"%@", userInfo);
    UIView *redView = [[UIView alloc] init];
    redView.backgroundColor = [UIColor redColor];
    redView.frame = CGRectMake(100, 100, 100, 100);
    [self.window.rootViewController.view addSubview:redView];

    completionHandler(UIBackgroundFetchResultNewData);
}

UserNotitfication

iOS10 中統一了本地推送和遠端推送的 API,在 UserNotifications.framework 來統一處理與推送相關任務,並增加了圖片、音訊、視訊,自定義通知 UI 等新特性。

通知介面

這裡寫圖片描述

多媒體

在此次版本中,iOS10 不僅新增訊息的3dtouch等,還對圖片、音訊、視訊等多媒體做了改進和優化。

型別 限制大小
圖片  10M
音訊  5M
視訊  50M

多媒體推送程式碼:

if #available(iOS 10.0, *) {
      let content = UNMutableNotificationContent()
      content.title = "iOS10 推送測試"
      content.body = "附件"
      content.userInfo = ["icon":"1","mutable-content":1]
      content.categoryIdentifier = "InputSomething"

      let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 3, repeats: false)

      let requestIdentifier = "imageLocal"
      if let imageURL = Bundle.main.url(forResource: "[email protected]", withExtension: "png"), let attachment = try? UNNotificationAttachment(identifier: "imageAttachment", url: imageURL, options: nil) {

        content.attachments = [attachment]
      }

      let request = UNNotificationRequest(identifier: requestIdentifier, content: content, trigger: trigger)

      UNUserNotificationCenter.current().add(request, withCompletionHandler: { (error) in
        if (error != nil) {
          print("error: \(error.debugDescription)")
        }
      })
    }

通常在做多媒體自定義推送的時候,一般會用到UNNotificationServiceExtension應用擴充套件,通過在 payload 中增加 mutable-content 欄位來觸發擴充套件。

{
    "aps":{
        "alert":"IOS10 推送測試",
        "sound":"default",
        "badge":1,
        "mutable-content":1,
        "category":"InputSomething"
    },
    "image":"https://ws1.sinaimg.cn/mw690/934b5ef8gw1fapg2ssteej20oz0oz420.jpg"
}

當推送達到 app 時,會啟動擴充套件並回調 didReceive 方法。在該方法裡面可以對推送的 UNMutableNotificationContent 做出相應的修改。在 didReceive 回撥方法中的 request 包含了推送的具體資訊,可以通過其 userInfo 屬性來解析出多媒體的 url。

let imageURL = Bundle.main.url(forResource: "lufei", withExtension: "jpg")

值得注意的是這裡 Bundle 指的是擴充套件的沙盒,不是 app 的沙盒,所以資源的路徑要正確。

而讀取遠端資源比讀取本地資源一般要多一步儲存操作。

private func downloadAndSave(url: URL, handler: @escaping (_ localURL: URL?) -> Void) {
    let task = URLSession.shared.dataTask(with: url, completionHandler: {
      data, res, error in

      var localURL: URL? = 下載完之後儲存到本地並返回本地的 url

      handler(localURL)
    })

    task.resume()
  }

得到本地的 url 之後操作就一樣了,都是通過 url 來生成一個 UNNotificationAttachment 物件。一切都操作完之後將這個 UNMutableNotificationContent 物件返還 contentHandler(bestAttemptContent)。

自定義介面

除了上述功能外,蘋果還新增了自定義介面,這個絕對是大招。
這裡寫圖片描述

其中上面的黃色區域可以理解成一個 ViewController 操作,下面綠色部分就是 Title 之類的顯示內容。這部分是可以隱藏的。在擴充套件的目錄下的 info.plist 編輯一些介面相關的東西。
這裡寫圖片描述

說明:

  • UNNotificationExtensionCategory 觸發 Extension 的 category 這裡需要在註冊才能有效的觸發 字串型別
  • UNNotificationExtensionInitialContentSizeRatio 上圖黃色區域的長寬比,float 型別
  • UNNotificationExtensionDefaultContentHidden 預設內容是否隱藏,Bool 型別

相關推薦

推推APP接收操作前臺前臺處理不同

前言 在去年的蘋果大會上,蘋果帶來的iOS 10 系統中將之前繁雜的推送通知統一成UserNotifications.framework 來集中管理和使用通知功能,還增加一些實用的功能——撤回單條通知、更新已展示通知、中途修改通知內容、在通知中顯示多媒體資源、自定義UI等功能。 那麼在ios10之前,i

別人給我一個介面url地址讓我資料過去然後得到別人返回的資料怎麼呼叫這個介面呢?

1:客戶端地址:http://1*2.***.**.1*4:7**8/peasentProducts/save(需要把服務端資料傳送到客戶端) 2:自己在控制層把資料放在放在一個map集合中,自己寫一個類封裝一個方法,把資料傳送過去   3:controller---控制層程式

SpringCloud工作筆記062---APP訊息_平臺API使用經驗

前言       移動Push推送是移動網際網路最基礎的需求之一,用於滿足移動互聯環境下訊息到達App客戶端。以轉轉(58趕集旗下真實個人的閒置交易平臺)為例,當買家下單後,我們通過移動Push推送訊息告訴賣家,當賣家已經發貨時,我們通過移動Push訊息告訴買家,讓買賣雙

ios極光 App收到訊息時修改BadgeNumber同時點選狀態列訊息以後跳到指定的頁面和靜默

極光推送生產環境測試需要打包為adhot或者用testflight 在收到遠端推送的訊息的時候,有以下三種情況需要考慮: 1. 程式在後臺執行 2. 程式未執行 3. 程式執行在前臺 原則上,應用在收到推送訊息時,badge的值是由後臺來控制的,但是,目前的大多數公司後端都

App訊息

首先到個推官網註冊一個賬號,然後點選“個推訊息推送",把需要推送的app進行登記 注意:登記時的應用標識就是appid. 應用登記成功之後會得到APPID,APPSecret,APPkey,MasterSecret 接著就需要配置sdk了,把得到的數值填入相對

app退出點選進入指定頁面

//宣告一個字典 NSDictionary* remoteNotification = [launchOptions objectForKey:UIApplicationLaunchOptio

rsync添加多模塊客戶端出錯!

rsync 多模塊 rsync -avz /data/ [email protected]::nfsbackup/sending incremental file listERROR: module is read onlyrsync error: syntax or usage

如何構建一套高可用的 APP 訊息平臺

轉載自  如何構建一套高可用的 APP 訊息推送平臺 訊息推送作為移動 APP 運營中的一項關鍵技術,已經被越來越廣泛的運用。本文追溯了推送技術的發展歷史,剖析了其核心原理,並對推送服務的關鍵技術進行深入剖析,圍繞訊息推送時產生的服務不穩定性,訊息丟失、延遲,接入複雜性,統計

國內APP訊息機制以及微信訊息延遲問題剖析

轉自:https://club.huawei.com/thread-15878044-1-1.html 一、前言隨著安卓手機以及QQ/微信/支付寶/滴滴出行/美圖外賣等一大批行動通訊/移動消費應用的日益普及,我們無時無刻不在享受著這些移動產品帶來的便利;但同時也會遇到一些困擾,比如QQ/微信/支

Android app 移動遇到的問題多問題集合

       關於移動推送這塊,我主要是應用了極光推送跟阿里的移動推送,阿里這塊遇到的問題就是配置檔案這塊, 問題1:碰到一個資源重複的問題,是出現在應用級的build.gradle上面的資源包引用重複, 問題2:遇到的難點就是:無法例項化接收器

伺服器實時通知客戶端方案伺服器傳送/事件方案2server event典型例子可以用作股票、新聞資訊

server event是html5規範的一部分,它相比websocket使用起來更簡單,對伺服器的改動也最小 前端html部分 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"&

伺服器實時通知客戶端方案伺服器傳送/事件方案1websocket

服務端 @Configuration public class WebSocketConfig { @Bean public ServerEndpointExporter serverEndpointExporter(){ return new ServerEndpointEx

WePush v2.3.2 釋出專注批量的小而美的工具

   WePush v2.3.2 已釋出,它是一個專注批量推送的小而美的工具。 目前支援的訊息型別:模板訊息-公眾號、模板訊息-小程式、微信客服訊息、阿里雲簡訊、阿里大於模板簡訊、騰訊雲簡訊、雲片網簡訊。 更新內容如下: v2.3.2 通過檔案匯入時,自動判斷檔案

環信app功能實現

今天 花了一天的時間終於將推送給弄好了,才發現其實很簡單,就是因為自己的幾個方法木有實現才導致花了那麼多的冤枉時間 推送的步驟如下 1.先建立一個apns推送證書,請參照:http://developer.easemob.com/docs/emchat/ios/push/c

Web Socket 多使用者之間實現時時訊息

1個月不寫部落格了,最近挺忙的,剛用了2天寫了個預約的小程式和大家分享下~首先大家看下介面:1.祕書端 - 專門新增預約的內容,新增以後立馬在 “市長端” 彈出有一個新的預約2.市長端 - 專門看最新的預約 ,看看要不要接待,接待或不接待點選按鈕以後以後立馬 回覆祕書其實挺簡

WePush 2.3.3 釋出專注批量的小而美的工具

   WePush 2.3.3 已釋出,它是一個專注批量推送的小而美的工具。 目前支援的訊息型別:模板訊息-公眾號、模板訊息-小程式、微信客服訊息、阿里雲簡訊、阿里大於模板簡訊、騰訊雲簡訊、雲片網簡訊。 更新內容如下: v2.3.3 使用Velocity模板引擎處

IOS8開發之實現App訊息

第一部分 首先第一步當然是介紹一下蘋果的推送機制(APNS)咯(ps:其實每一篇教程都有),先來看一張蘋果官方對其推送做出解釋的概要圖。 Provider是給你手機應用發出推送訊息的伺服器,而APNS(Apple Push Notification Service)則是蘋果訊息推送伺服器。你本地的

vs2010 編譯mosquitto win32版本開啟websockets實現訊息

廢話少說,開始~ 1. 下載vs2010 我下了個旗艦版的,不過只有30天試用期,無妨,編譯就夠了。 http://www.xpgod.com/soft/6637.html  ps:之前用過vs2008去編譯,然後各種莫名其妙,如果有同學知道為什麼的,請留言。

Android App訊息 實現原理

1.訊息推送的實質實際上,是當伺服器有新訊息需推送給使用者時,先發送給應用App,應用App再發送給使用者2. 作用產品角度:功能需要,如:資訊類產品的新聞推送、工具類產品的公告推送等等運營角度:活動運營需要,如:電商類產品的促銷活動;召回使用者 / 提高活躍度等等作為開發者

iOS經典講解之實現App訊息功能(二)

作者:Loving_iOS 上一篇部落格iOS經典講解之實現App訊息推送功能(一)講解了實現訊息推送的的準備工作,接下來我們來講解第二部分的內容,實現具體的推送及程式碼示例。 訊息推送的第三方平臺有很多,這裡我們使用極光推送平臺,註冊極光推送平臺的賬號。 登陸後進入控