iOS推送應用邏輯場景
注意要點,
《推送接收情景》根據(jù)應用狀態(tài)分為,前臺,后臺,關(guān)閉應用,三種情況。
前臺:打開應用,并處于最前端使用狀態(tài)。
后臺,打開應用,并處于后端運行狀態(tài)。
關(guān)閉,完全關(guān)閉,殺死應用。
《推送通知類型》分為,靜默推送和普通推送。
靜默推送:
收到推送(沒有聲音,手機通知中心也不會顯示,程序處于前臺,后臺,關(guān)閉狀態(tài)下均不會顯示,不管程序處于前臺還是后臺,主要沒有完全關(guān)閉都可以觸發(fā),就能自動執(zhí)行。推送服務無法自行改變應用角標)
普通推送:
收到推送后(有聲音提示,程序處于前臺,后臺,關(guān)閉狀態(tài)下均會在手機的通知中心顯示推送的消息。
程序處于前臺狀態(tài)下,通知中心會自動提示。
通知中心已成功收到推送的消息,只能通過點擊通知中心消息,來獲取推送的數(shù)據(jù)進行處理。
如果通知中心已成功收到推送的消息,想通過點擊應用圖標,來獲取,推送的數(shù)據(jù),很抱歉無法做到。
如果非要實現(xiàn)這功能,需要,和后臺交互一起完成,提供一下思路。
后臺和推送的第三方比如信鴿,極光交互完成后。
后臺記錄,是否推送成功。
前端,通過點擊應用圖標時候,請求一次后臺,來獲取數(shù)據(jù)。然后獲取完成,作出相應操作。
《靜默推送》,獲取成功,不管前臺還是后臺都會觸發(fā)下面的代理方法一,方法二。
如果兩個方法同時實現(xiàn),只會觸發(fā)方法二。
方法一是iOS7之前,方法二是iOS7之后。
個人建議只實現(xiàn),方法一,來處理靜默推送。
理由,繼續(xù)往下看。
//方法一
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
NSLog(@"====方法一收到靜默推送的回調(diào)userinfo=%@", userInfo);
}
//方法二
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
NSLog(@"====方法二收到靜默推送的回調(diào)userinfo=%@", userInfo);
}
《普通推送》分為前臺,后臺,關(guān)閉三個狀態(tài)。下面一一分析。
當應用處于《關(guān)閉狀態(tài)》下,點擊推送消息,同時觸發(fā)代理方法三,然后依次順序觸發(fā)方法二。
//方法三
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//成功獲取推送的數(shù)據(jù)
NSDictionary* remoteNotification = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (launchOptions) {
/*
通過關(guān)閉程序下無法查看Xcode日記,可以通過改變,應用圖標,觀察應用變化邏輯
*/
application.applicationIconBadgeNumber=66;
NSLog(@"存在擊通知消息,并點擊了改消息進入應用=%@", remoteNotification);
}
else{
NSLog(@"不存在擊通知消息,并點擊了應用圖標進入應用");;
}
//方法二(與靜默推送中方法二,是同一個方法。所以,靜默推送時候,建議實現(xiàn)方法一就好。不然會沖突,處理就麻煩了)
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
/*
可以嘗試打開下面改變圖標對比,方法三和方法二執(zhí)行順序
*/
// application.applicationIconBadgeNumber=77;
NSLog(@"====方法二收到推送的回調(diào)userinfo=%@", userInfo);
}
當應用處于《后臺狀態(tài)》下時,點擊推送消息
或從《前臺狀態(tài)》下,切換到通知中心,點擊推送消息
會觸發(fā)下面代理方法四
//方法四
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler {
NSDictionary *dic=response.notification.request.content.userInfo;
NSLog(@"====[XGDemo]用戶點擊通知的回調(diào)成功=%@",dic);
completionHandler();
}
當應用處于《前臺狀態(tài)》下時,推送消息過來,首先手機的通知中心會自動提示,并展示在程序的上方,此時程序會自動執(zhí)行下面代理方法五
//方法五
// App 在前臺彈通知需要調(diào)用這個接口
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler {
NSDictionary *dic=notification.request.content.userInfo;
NSLog(@"APP前臺彈通知,提示時候會自動觸發(fā),不需要用戶再切換到后臺點擊通知或不需要用戶點擊彈出的dic =%@", dic);
completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert);
}
聲明
本人在10.3.3系統(tǒng)下,使用的是信鴿推送服務測試。