2018-01-10

1.如果是應(yīng)用未啟動

則可以通過

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

方法來判斷是點擊圖標(biāo)啟動應(yīng)用還是點擊推送消息啟動應(yīng)用紧索,如果是點擊推送啟動應(yīng)用的話,上面的那個方法的launchOptions必不為nil鉴竭,可以通過是否為nil進行判斷粉铐;然后可以通過

if(launchOptions) {

NSDictionary*?remoteNotification?= [launchOptionsobjectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];

if(remoteNotification) {

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

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

[self?goToMssageViewControllerWith:remoteNotification];//進入相應(yīng)頁面的方法

}

}

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

2.如果應(yīng)用已啟動,掛在后臺

這種情況下點擊推送的消息進入應(yīng)用時會調(diào)用

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

userInfo就是推送的消息的主體

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

3.如果推送消息到達時應(yīng)用就在前臺運行

這種情況依然會調(diào)用2.中的方法才菠,但是如果你什么都沒設(shè)置,用戶就不會知道你推送了消息贡定,如果你設(shè)置了進入對應(yīng)頁面赋访,則應(yīng)用會一下子很突然的進入對應(yīng)界面,體驗不好;這個時候就需要判斷應(yīng)用是在前臺運行還是掛在后臺(如果程序未啟動就不用考慮這種情況)

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//應(yīng)用正在前臺運行

UIApplicationStateInactive//點擊推送的通知進入應(yīng)用

UIApplicationStateBackground//應(yīng)用在后臺掛起

這里面只須判斷應(yīng)用是在前臺運行(2.)還是點擊推送通知進入應(yīng)用(3.)了,然后再進行相應(yīng)的處理步悠,我項目中所用的是如果在前臺運行签杈,推送消息來了就彈窗告知,不過感覺不是很好鼎兽,讀者可用自己方法答姥,也可以用第三方MBProgressHUD中的那個浮現(xiàn)兩三秒自動消失的控件來操作;如果是點擊推送通知進入應(yīng)用谚咬,我還是用的那個進入相應(yīng)界面的方法

4.如何進入推送消息相應(yīng)的界面

重頭戲來了額鹦付,做到這塊的時候我在網(wǎng)上搜了好多,但并沒什么很多值得參考的資料择卦,最后的話在cocoaChina論壇中找到一個值得參考的http://www.cocoachina.com/bbs/read.php?tid=257582敲长,里面的8樓說的很有道理,我也是基于此做的互捌;

首先關(guān)于推送的消息這塊潘明,比如你推送的消息分為三類,一類是點擊消息進入A頁面秕噪,一類是點擊進入B頁面钳降,一類是點擊進入C頁面,你可以在推送的消息主體中設(shè)置一個事件值EventID腌巾,定義101就是關(guān)于A頁面的消息遂填,102就是關(guān)于B頁面的消息,103就是關(guān)于C頁面的消息澈蝙;然后接收到消息主體后解析出來進行判斷吓坚,可以使用switch case進行判斷,

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

switch(EventID) {

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

break;

}

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

break;

}

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

break;

default:

break;

}

然后是進入相應(yīng)的界面灯荧,我這里做的處理是已知消息對應(yīng)的界面之后礁击,在appdelegate文件中包含此界面的頭文件,然后在對應(yīng)的位置處進行初始化逗载,然后present過去

case101: {

//進入A界面

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

[self.window.rootViewControllerpresentViewController:Avc?animated:YEScompletion:?nil ];

break;

}

這里的話要說明幾點

第一哆窿、以上代碼是只是針對與不帶導(dǎo)航欄的簡單頁面,并且A頁面與其上級界面并沒有數(shù)據(jù)傳遞厉斟,也就是說挚躯,A頁面的初始化并沒有用到它上一級頁面的數(shù)據(jù)

第二、很明顯擦秽,大家想要進入的頁面沒有像A這么簡單的码荔;就像我這次漩勤,有一類是進入帶有導(dǎo)航欄的頁面;有一類是進入tabbar的其中一個標(biāo)簽頁面

A.如何進入帶有導(dǎo)航欄的頁面

對于這個問題我也找了好久缩搅,試探了好幾種辦法越败,比如使用根視圖的導(dǎo)航控制器進行push,均不行誉己,最后使用的就是之前參考那個論壇上的方法眉尸;

case101: {

//進入帶有導(dǎo)航欄的A頁面

AViewController*Avc = [[AViewControlleralloc]init];

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

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

break;

}

使用把A頁面裝入導(dǎo)航控制器中,然后present導(dǎo)航控制器就好了巨双,這樣點擊推送消息就可以進入帶有導(dǎo)航控制器的頁面了噪猾;如果A頁面是從上個界面push過來的,并且初始化的時候使用到了上級界面的一些數(shù)據(jù)筑累,這種情況的話袱蜡,就需要讓推送消息把這些數(shù)據(jù)一并推送過來,然后進行解析慢宗,在上面進行初始化的時候使用這些數(shù)據(jù)進行初始化坪蚁,相當(dāng)于斷絕它與上級界面的關(guān)系;剩下的還有一點就是導(dǎo)航欄上的返回鍵了镜沽,因為是present過去的敏晤,所以系統(tǒng)導(dǎo)航欄自帶的backBarButtonItem并不會出現(xiàn),即使你在那個present方法最后一個block參數(shù)中設(shè)置也不行缅茉;這里的話用的是之前說的那個論壇哥們說的方法嘴脾,在viewwillappear方法里面進行判斷

- (void)viewWillAppear:(BOOL)animated {

//判斷是否是點擊推送過來的,如果是的話設(shè)置左導(dǎo)航標(biāo)簽為返回鍵

NSUserDefaults*pushJudge = [NSUserDefaultsstandardUserDefaults];

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

//給導(dǎo)航欄加一個返回按鈕蔬墩,便于將推送進入的頁面返回出去译打,如果不是推送進入該頁面,那肯定是通過導(dǎo)航欄進入的拇颅,則頁面導(dǎo)航欄肯定會有導(dǎo)航欄自帶的leftBarButtonItem返回上一個頁面

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

self.navigationItem.leftBarButtonItem= leftButton;

}else{

self.navigationItem.leftBarButtonItem=nil;

}

}

- (void)rebackToRootViewAction {

//將標(biāo)示條件置空奏司,以防通過正常情況下導(dǎo)航欄進入該頁面時無法返回上一級頁面

NSUserDefaults*pushJudge = [NSUserDefaults standardUserDefaults];

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

[pushJudge synchronize];

[self dismissViewControllerAnimated:YES completion:nil];

}

就是在本地存儲NSUserDefaults中存儲用來判斷是否是點擊推送進入頁面的,這個判斷值是在goToMssageViewControllerWith:(上面找)方法中存入的樟插,即進入相應(yīng)頁面之前先設(shè)置這個值韵洋,

- (void)goToMssageViewControllerWith:(NSDictionary*)msgDic

{

//將字段存入本地

NSUserDefaults*pushJudge = [NSUserDefaults standardUserDefaults];

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

[pushJudge synchronize];

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

switch(EventID) {

...

? ?}

}

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

B.如何進入tabbar的其中一個標(biāo)簽頁面

這個其實很簡單的黄锤,因為這個肯定不會跟上級頁面有什么關(guān)聯(lián)麻献,我用的方法是重新把所有的標(biāo)簽頁面存入一個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];

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市监婶,隨后出現(xiàn)的幾起案子旅赢,更是在濱河造成了極大的恐慌齿桃,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件煮盼,死亡現(xiàn)場離奇詭異短纵,居然都是意外死亡,警方通過查閱死者的電腦和手機僵控,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門香到,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人报破,你說我怎么就攤上這事悠就。” “怎么了充易?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵梗脾,是天一觀的道長。 經(jīng)常有香客問我盹靴,道長炸茧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任稿静,我火速辦了婚禮梭冠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘改备。我一直安慰自己控漠,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布绍妨。 她就那樣靜靜地躺著润脸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪他去。 梳的紋絲不亂的頭發(fā)上毙驯,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天,我揣著相機與錄音灾测,去河邊找鬼爆价。 笑死,一個胖子當(dāng)著我的面吹牛媳搪,可吹牛的內(nèi)容都是我干的铭段。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼秦爆,長吁一口氣:“原來是場噩夢啊……” “哼序愚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起等限,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤爸吮,失蹤者是張志新(化名)和其女友劉穎芬膝,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體形娇,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡锰霜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了桐早。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片癣缅。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖哄酝,靈堂內(nèi)的尸體忽然破棺而出友存,到底是詐尸還是另有隱情,我是刑警寧澤炫七,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布爬立,位于F島的核電站,受9級特大地震影響万哪,放射性物質(zhì)發(fā)生泄漏侠驯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一奕巍、第九天 我趴在偏房一處隱蔽的房頂上張望吟策。 院中可真熱鬧,春花似錦的止、人聲如沸檩坚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽匾委。三九已至,卻和暖如春氓润,著一層夾襖步出監(jiān)牢的瞬間赂乐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工咖气, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留挨措,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓崩溪,卻偏偏與公主長得像浅役,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子伶唯,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,182評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫觉既、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,107評論 4 62
  • 千呼萬喚始出來,猶抱琵琶半遮面瞪讼。我以為錯過了正是一年櫻桃紅的季節(jié)岭参,沒有品嘗到櫻桃在嘴里,喉嚨里歡呼雀躍的心動感尝艘,...
    周姝帆閱讀 436評論 4 8
  • 嗨,大家好姿染,今天的晨讀是大家都非常推崇的《窮查理寶典》背亥,這本書的作者是股神巴菲的黃金搭檔查理·芒格。 在看完今天的...
    纖陌顏閱讀 332評論 0 5
  • 時光軌跡里 載滿舊印痕 曾以為抹平 誰知刻太深 無意間觸碰 心中淚滴流 本想已忘卻 誰知藏太久 陽光依舊艷 花草依...
    六月天氣閱讀 188評論 17 29