個推推送,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)。
要實現遠端推送,一般會涉及到三個階段:
- APNS Pusher應用程式把要傳送的訊息、目的iPhone的標識打包,發給APNS。
- APNS在自身的已註冊Push服務的iPhone列表中,查詢有相應標識的iPhone,並把訊息發到iPhone。
- 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:遇到的難點就是:無法例項化接收器
伺服器實時通知客戶端方案,伺服器傳送/推送事件方案(2)server event,典型例子,可以用作股票、新聞資訊推送
server event是html5規範的一部分,它相比websocket使用起來更簡單,對伺服器的改動也最小 前端html部分 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"&
伺服器實時通知客戶端方案,伺服器傳送/推送事件方案(1)websocket
服務端 @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訊息推送功能(一)講解了實現訊息推送的的準備工作,接下來我們來講解第二部分的內容,實現具體的推送及程式碼示例。 訊息推送的第三方平臺有很多,這裡我們使用極光推送平臺,註冊極光推送平臺的賬號。 登陸後進入控