最近的項目中使用了推送模塊挑宠,使用的是企鵝帝國的信鴿推送服務菲盾,關于具體怎么推送的,證書如何設置各淀,我不再贅述懒鉴,一來開發(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:
第一 第一次寫文,格式不是很好拍皮,讀者多見諒歹叮!
第二 以上方法思路只是我做項目中所用,讀者如有更好的思路和方法铆帽,歡迎交流盗胀!
第三? 轉載請注明作者出處,謝謝~