iOS 關于信鴿推送點擊推送通知的處理

最近的項目中使用了推送模塊挑宠,使用的是企鵝帝國的信鴿推送服務菲盾,關于具體怎么推送的,證書如何設置各淀,我不再贅述懒鉴,一來開發(fā)文檔中已經講的非常清楚,二來在網上一搜的話也能搜到一大堆碎浇;在這里主要寫下關于推送的通知來了之后點擊此通知該如何處理临谱,也是對自己做完之后做一個筆記

在這里我項目中所要達到的效果是點擊通知欄的推送消息,就進入應用中的相應頁奴璃;默認的效果是點擊推送消息悉默,會直接進入應用,如果應用未啟動苟穆,則會啟動應用進入首頁抄课;如果應用已啟動,只是點擊home退入后臺的話雳旅,則會返回應用跟磨,并且應用之前在哪一個界面,依然是那個界面;

1.如果是應用未啟動

則可以通過

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

方法來判斷是點擊圖標啟動應用還是點擊推送消息啟動應用攒盈,如果是點擊推送啟動應用的話抵拘,上面的那個方法的launchOptions必不為nil,可以通過是否為nil進行判斷型豁;然后可以通過

if(launchOptions) {

NSDictionary* remoteNotification = [launchOptionsobjectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];

if(remoteNotification) {

NSLog(@"推送過來的消息是%@",remoteNotification);

//點擊推送通知進入指定界面(這個肯定是相當于從后臺進入的)

[self goToMssageViewControllerWith:remoteNotification];//進入相應頁面的方法

}

}

返回的詞典remoteNotification就是推送的消息主體僵蛛,可以在此進行打印查看,然后判斷是點擊推送消息啟動的應用之后尚蝌,在goToMssageViewControllerWith:的方法里面寫進入自己消息對應頁面的代碼(下面再講)

2.如果應用已啟動,掛在后臺

這種情況下點擊推送的消息進入應用時會調用

- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo

userInfo就是推送的消息的主體

在這個方法中可以進行自己進入消息對應頁面的代碼操作

3.如果推送消息到達時應用就在前臺運行

這種情況依然會調用2.中的方法墩瞳,但是如果你什么都沒設置驼壶,用戶就不會知道你推送了消息,如果你設置了進入對應頁面喉酌,則應用會一下子很突然的進入對應界面热凹,體驗不好;這個時候就需要判斷應用是在前臺運行還是掛在后臺(如果程序未啟動就不用考慮這種情況)

if([UIApplicationsharedApplication].applicationState==UIApplicationStateActive)

{//前臺運行時泪电,收到推送的通知會彈出alertview提醒

NSDictionary*oneDict = [userInfoobjectForKey:@"aps"];

NSDictionary*twoDict = [oneDictobjectForKey:@"alert"];

NSString*msg = [twoDictobjectForKey:@"body"];

UIAlertView*alert = [[UIAlertViewalloc]initWithTitle:@"溫馨提示"message:msgdelegate:selfcancelButtonTitle:nilotherButtonTitles:@"確定",nil];

[alertshow];

}

else if ([UIApplicationsharedApplication].applicationState==UIApplicationStateInactive)

{//點擊推送通知進入界面的時候

[self goToMssageViewControllerWith:userInfo];

}

UIApplicationsharedApplication].applicationState有三個狀態(tài)般妙,分別是UIApplicationStateActive//應用正在前臺運行

UIApplicationStateInactive//點擊推送的通知進入應用

UIApplicationStateBackground//應用在后臺掛起

這里面只須判斷應用是在前臺運行(2.)還是點擊推送通知進入應用(3.)了,然后再進行相應的處理相速,我項目中所用的是如果在前臺運行碟渺,推送消息來了就彈窗告知,不過感覺不是很好突诬,讀者可用自己方法苫拍,也可以用第三方MBProgressHUD中的那個浮現(xiàn)兩三秒自動消失的控件來操作;如果是點擊推送通知進入應用旺隙,我還是用的那個進入相應界面的方法

4.如何進入推送消息相應的界面

重頭戲來了額绒极,做到這塊的時候我在網上搜了好多,但并沒什么很多值得參考的資料蔬捷,最后的話在cocoaChina論壇中找到一個值得參考的http://www.cocoachina.com/bbs/read.php?tid=257582垄提,里面的8樓說的很有道理,我也是基于此做的周拐;

首先關于推送的消息這塊铡俐,比如你推送的消息分為三類,一類是點擊消息進入A頁面妥粟,一類是點擊進入B頁面审丘,一類是點擊進入C頁面,你可以在推送的消息主體中設置一個事件值EventID勾给,定義101就是關于A頁面的消息滩报,102就是關于B頁面的消息,103就是關于C頁面的消息锦秒;然后接收到消息主體后解析出來進行判斷露泊,可以使用switch case進行判斷喉镰,

NSIntegerEventID = [[msgDic objectForKey:@"eventId"]integerValue];

switch(EventID) {

case101: {//寫進入A頁面的代碼

break;

}

case102: {//寫進入B頁面的代碼

break;

}

case103: {//寫進入C頁面的代碼

break;


default:

break;

}

然后是進入相應的界面旅择,我這里做的處理是已知消息對應的界面之后,在appdelegate文件中包含此界面的頭文件侣姆,然后在對應的位置處進行初始化生真,然后present過去

case101: {

//進入A界面

AViewController *Avc = [[AViewController alloc] init];

[self.window.rootViewController ?presentViewController:Avc animated:YES ?completion: nil ];?

break;

}

這里的話要說明幾點

第一沉噩、以上代碼是只是針對與不帶導航欄的簡單頁面,并且A頁面與其上級界面并沒有數(shù)據(jù)傳遞柱蟀,也就是說川蒙,A頁面的初始化并沒有用到它上一級頁面的數(shù)據(jù)

第二、很明顯长已,大家想要進入的頁面沒有像A這么簡單的畜眨;就像我這次,有一類是進入帶有導航欄的頁面术瓮;有一類是進入tabbar的其中一個標簽頁面

A.如何進入帶有導航欄的頁面

對于這個我問題我也只找了好久康聂,試探了好幾種辦法,比如使用根視圖的導航控制器進行push胞四,均不行恬汁,最后使用的就是之前參考那個論壇上的方法;

case101: {

//進入帶有導航欄的A頁面

AViewController*Avc = [[AViewControlleralloc]init];

UINavigationController*planNav = [[UINavigationControlleralloc]initWithRootViewController:Avc];

[self.window.rootViewController presentViewController:planNav animated:YES ?completion: nil ];

break;

}

使用把A頁面裝入導航控制器中辜伟,然后present導航控制器就好了氓侧,這樣點擊推送消息就可以進入帶有導航控制器的頁面了;如果A頁面是從上個界面push過來的导狡,并且初始化的時候使用到了上級界面的一些數(shù)據(jù)约巷,這種情況的話,就需要讓推送消息把這些數(shù)據(jù)一并推送過來烘豌,然后進行解析载庭,在上面進行初始化的時候使用這些數(shù)據(jù)進行初始化,相當于斷絕它與上級界面的關系廊佩;剩下的還有一點就是導航欄上的返回鍵了囚聚,因為是present過去的,所以系統(tǒng)導航欄自帶的backBarButtonItem并不會出現(xiàn)标锄,即使你在那個present方法最后一個block參數(shù)中設置也不行顽铸;這里的話用的是之前說的那個論壇哥們說的方法,在viewwillappear方法里面進行判斷

- (void)viewWillAppear:(BOOL)animated {

//判斷是否是點擊推送過來的料皇,如果是的話設置左導航標簽為返回鍵

NSUserDefaults*pushJudge = [NSUserDefaultsstandardUserDefaults];

if([[pushJudgeobjectForKey:@"push"]isEqualToString:@"push"]) {

//給導航欄加一個返回按鈕谓松,便于將推送進入的頁面返回出去,如果不是推送進入該頁面践剂,那肯定是通過導航欄進入的鬼譬,則頁面導航欄肯定會有導航欄自帶的leftBarButtonItem返回上一個頁面

UIBarButtonItem*leftButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemReplytarget:self action:@selector(rebackToRootViewAction)];

self.navigationItem.leftBarButtonItem= leftButton;

}else{

self.navigationItem.leftBarButtonItem=nil;

}

}

- (void)rebackToRootViewAction {

//將標示條件置空,以防通過正常情況下導航欄進入該頁面時無法返回上一級頁面

NSUserDefaults*pushJudge = [NSUserDefaults standardUserDefaults];

[pushJudge setObject:@""forKey:@"push"];

[pushJudge synchronize];

[self dismissViewControllerAnimated:YES completion:nil];

}

就是在本地存儲NSUserDefaults中存儲用來判斷是否是點擊推送進入頁面的逊脯,這個判斷值是在goToMssageViewControllerWith:(上面找)方法中存入的优质,即進入相應頁面之前先設置這個值,

- (void)goToMssageViewControllerWith:(NSDictionary*)msgDic

{

//將字段存入本地

NSUserDefaults*pushJudge = [NSUserDefaults standardUserDefaults];

[pushJudge setObject:@"push"forKey:@"push"];

[pushJudge synchronize];

NSIntegerEventID = [[msgDic objectForKey:@"eventId"] integerValue];

switch(EventID) {

...

? ?}

}

這樣就能達到基本一樣的相應頁了,點擊返回的話是返回之前應用退入后臺時的那個頁面

B.如何進入tabbar的其中一個標簽頁面

這個其實很簡單的巩螃,因為這個肯定不會跟上級頁面有什么關聯(lián)演怎,我用的方法是重新把所有的標簽頁面存入一個tabbar中,然后present過去就好了避乏;

RootTabBarController*tabBarController = [RootTabBarController new];?

UINavigationController*AAController = [[UINavigationController alloc] initWithRootViewController:[AAViewController new]];

UINavigationController*BBController = [[UINavigationController alloc] initWithRootViewController:[BBViewController new]];

UINavigationController*CCController = [[UINavigationController alloc] initWithRootViewController:[CCViewController new]];

NSArray*array_controllers = [NSArray arrayWithObjects:AAController,BBController,CCController,nil];

tabBarController.viewControllers= array_controllers;

tabBarController.selectedViewController= [tabBarController.viewControllersobjectAtIndex:2];

[tabBarControllersetSelBtn:2];

[self.window.rootViewControllerpresentViewController:tabBarControlleranimated:YEScompletion:nil];

以上就是簡陋方法爷耀;


ps:

第一 第一次寫文,格式不是很好拍皮,讀者多見諒歹叮!

第二 以上方法思路只是我做項目中所用,讀者如有更好的思路和方法铆帽,歡迎交流盗胀!

第三? 轉載請注明作者出處,謝謝~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末锄贼,一起剝皮案震驚了整個濱河市票灰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宅荤,老刑警劉巖屑迂,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異冯键,居然都是意外死亡惹盼,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門惫确,熙熙樓的掌柜王于貴愁眉苦臉地迎上來手报,“玉大人,你說我怎么就攤上這事改化⊙诟颍” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵陈肛,是天一觀的道長揍鸟。 經常有香客問我,道長句旱,這世上最難降的妖魔是什么阳藻? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮谈撒,結果婚禮上腥泥,老公的妹妹穿的比我還像新娘。我一直安慰自己啃匿,他們只是感情好蛔外,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般冒萄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上橙数,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天尊流,我揣著相機與錄音,去河邊找鬼灯帮。 笑死崖技,一個胖子當著我的面吹牛,可吹牛的內容都是我干的钟哥。 我是一名探鬼主播迎献,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼腻贰!你這毒婦竟也來了吁恍?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤播演,失蹤者是張志新(化名)和其女友劉穎冀瓦,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體写烤,經...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡翼闽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了洲炊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片感局。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖暂衡,靈堂內的尸體忽然破棺而出询微,到底是詐尸還是另有隱情,我是刑警寧澤狂巢,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布拓提,位于F島的核電站,受9級特大地震影響隧膘,放射性物質發(fā)生泄漏代态。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一疹吃、第九天 我趴在偏房一處隱蔽的房頂上張望蹦疑。 院中可真熱鬧,春花似錦萨驶、人聲如沸歉摧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叁温。三九已至再悼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間膝但,已是汗流浹背冲九。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留跟束,地道東北人莺奸。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像冀宴,于是被迫代替她去往敵國和親灭贷。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,504評論 25 707
  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫略贮、插件甚疟、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,024評論 4 62
  • 悠悠最喜歡那本小翻翻書,估計是小逃延,她的小手拿著正好古拴,每天都會拿著玩一會。給野牛會聳聳肩真友,我給悠悠慫聳了聳黄痪,她的上身...
    悠悠麻麻2016閱讀 239評論 0 0
  • 隨著互聯(lián)網的逐漸普及,網絡營銷也逐漸成為企業(yè)市場營銷的一個重要渠道盔然,而許多企業(yè)目前的主要營銷渠道都是以傳統(tǒng)營銷為主...
    鐵牛哥閱讀 447評論 0 0
  • 我想我真的是實足的宅女桅打,特別喜歡一個人安靜的呆著。
    趙小姐的想法兒閱讀 237評論 0 0