這幾天項目中加入了友盟推送的功能狸窘,集成推送功能其實很簡單墩朦,就幾個方法。但是翻擒,點擊推送消息之后跳轉(zhuǎn)到新頁面卻有如下幾種情況:
1氓涣、程序未啟動的跳轉(zhuǎn)
2、程序運行于后臺的跳轉(zhuǎn)
3陋气、程序運行于前臺的跳轉(zhuǎn)
在此梳理了一下點擊推送消息之后跳轉(zhuǎn)到新頁面的幾種情況劳吠,也算是做個筆記吧。
程序未啟動的情況
因為程序還未啟動巩趁,當我們點擊推送消息之后痒玩,首先會先調(diào)用
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
啟動應用程序晶渠。我們在這個方法中可以得到推送消息實體凰荚,但是在這個時候我們都知道是無法執(zhí)行頁面的跳轉(zhuǎn)的燃观,因此我們在AppDelegate中聲明一個屬性userInfo用于保存消息實體內(nèi)容褒脯。
@property (nonatomic ,strong) NSDictionary *userInfo;
并在didFinishLaunchingWithOptions方法中取得userInfo對象;
NSDictionary *userInfo = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey];
self.userInfo = userInfo;
因為所在項目window.rootViewController是一個UITabBarController缆毁,顧而在UITabBarController的-(void)viewDidAppear:(BOOL)animated方法中處理跳轉(zhuǎn)邏輯
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
#warning -----------
//firstAvaliUserInfo屬性用于表示該頁面是不是第一次被加載番川,其實也就是為了保證只是在第一次被加載的時候執(zhí)行跳轉(zhuǎn)邏輯。
if (_firstAvaliUserInfo == NO) {
_firstAvaliUserInfo = YES;
AppDelegate *app = (AppDelegate *)[UIApplication sharedApplication].delegate;
NSString *pushName = [[app.userInfo objectForKey:@"aps"] objectForKey:@"alert"];
if(pushName.length > 0){
[self getPushInfo:app.userInfo];
}
}
}
程序在前/后臺的跳轉(zhuǎn)
如果應用程序已經(jīng)啟動脊框,這個時候我們點擊推送消息颁督,會執(zhí)行處理點擊通知的代理方法。
-(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler{
NSDictionary * userInfo = response.notification.request.content.userInfo;
_userInfo = userInfo;
if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
//應用處于后臺時的遠程推送接受
//必須加這句代碼
[UMessage didReceiveRemoteNotification:userInfo];
}else{
//應用處于后臺時的本地推送接受
}
#warning -----前/后臺點擊跳轉(zhuǎn)
if (userInfo != nil) {
[[NSNotificationCenter defaultCenter]postNotificationName:@"ClickedPushInformationNotification" object:userInfo];
}
}
我們在通知點擊響應的方法中發(fā)送了一個需要執(zhí)行頁面跳轉(zhuǎn)的通知浇雹。當然需要在UITabBarController的- (void)viewDidLoad沉御;方法中注冊并在類中實現(xiàn)
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(clickedPushInformation:) name:@"ClickedPushInformationNotification" object:nil];
}
-(void)clickedPushInformation:(NSNotification *)notification{
NSDictionary *userInfo = notification.object;
[self getPushInfo:userInfo];
}
頁面跳轉(zhuǎn)
如果我們所收到的推送消息登錄不登錄都能查看或者是不針對某個用戶的話,可以直接跳轉(zhuǎn)昭灵。如果需要進行登錄操作才能查看的話吠裆,這個時候就需要在跳轉(zhuǎn)之前進行判斷伐谈,這個指定用戶的話可以和后臺約定字段:例如把userId當成參數(shù),在消息實體中給出试疙。在此不在說明诵棵。
當用戶點擊推送信息的時候,這個時候我們并不知道應用程序處在那個頁面祝旷,怎么辦呢履澳?我的做法是在UITabBarController層面上實現(xiàn)跳轉(zhuǎn),看代碼一目了然:
NSInteger index = self.selectedIndex;
BaseNavigationController *vc1 = self.viewControllers[index];
[vc1 pushViewController:notiDetailVC animated:YES];