看標(biāo)題就應(yīng)該知道這次的主題是講點(diǎn)擊推送的消息跳轉(zhuǎn)頁面的功能,那么有關(guān)證書配置及完整的接入推送功能這里就不細(xì)說了,不懂的可以看這里。
由于收到通知時(shí),APP可能處在不同的狀態(tài)(未啟動(dòng)、活躍、后臺(tái)運(yùn)行),而不同的狀態(tài)在點(diǎn)擊通知欄的通知時(shí)所調(diào)用的方法不同。
(1)未啟動(dòng)
未啟動(dòng)時(shí),點(diǎn)擊通知的回調(diào)方法是:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
而對(duì)應(yīng)的通知內(nèi)容則為
NSDictionary *pushNotificationKey = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
當(dāng)pushNotificationKey為nil時(shí),說明用戶是直接點(diǎn)擊APP進(jìn)入的,如果點(diǎn)擊的是通知欄,那么即為對(duì)應(yīng)的通知內(nèi)容。
(2)啟動(dòng)時(shí)(活躍、后臺(tái)運(yùn)行)
當(dāng)APP處在啟動(dòng)狀態(tài)時(shí),點(diǎn)擊通知欄的回調(diào)方法是:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo;
其中userInfo就是對(duì)應(yīng)的通知內(nèi)容,與未啟動(dòng)時(shí)pushNotificationKey是相同的。
如果你的跳轉(zhuǎn)方法是用presentViewController,那么可以直接在AppDelegate中獲取當(dāng)前的根視圖,直接調(diào)用presentViewController方法進(jìn)行跳轉(zhuǎn)。如果你的跳轉(zhuǎn)方法需要用到push,那么你的根視圖必須包含有UINavigationController,否則將推不過去。
在我的項(xiàng)目上,我的根視圖是UITabBarController,我通過UITabBarController當(dāng)前選中的視圖控制器,判斷當(dāng)前選中的視圖控制器是否是UINavigationController,如果是就直接跳轉(zhuǎn)到需要的頁面。
我接收到通知后的代碼如下
- (void)receiveNotification:(NSDictionary *)userInfo {
self.userInfo = userInfo;
[XGPush handleReceiveNotification:userInfo
successCallback:^{
NSLog(@"信鴿收到推送成功");
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_MSEC)), dispatch_get_main_queue(), ^{
if ([self.startVC isKindOfClass:[MainTabBarViewController class]]) {
MainTabBarViewController *mainTab = (MainTabBarViewController *)self.startVC;
if ([mainTab.selectedViewController isKindOfClass:[UINavigationController class]]) {
UINavigationController *nav = (UINavigationController *)mainTab.selectedViewController;
if ([nav.topViewController isKindOfClass:[UserProtoccolViewController class]]) {
UserProtoccolViewController *protocolVC = (UserProtoccolViewController *)nav.topViewController;
if (protocolVC.isMessageDetail == YES) {
return;
}
}
UIStoryboard *LoginStoryBoard = [UIStoryboard storyboardWithName:@"Login" bundle:nil];
UserProtoccolViewController *protoccolVC = [LoginStoryBoard instantiateViewControllerWithIdentifier:@"UserProtoccol"];
protoccolVC.titleStr = self.userInfo[@"title"];
protoccolVC.url = self.userInfo[@"detailUrl"];
protoccolVC.isMessageDetail = YES;
[nav pushViewController:protoccolVC animated:YES];
}
}
});
} errorCallback:^{
NSLog(@"信鴿收到推送失敗");
}];
}
這個(gè)方法中參數(shù)userInfo就是前面說到的通知內(nèi)容,startVC是根視圖。userInfo中的鍵值對(duì)未必和我這里的列子一樣,這個(gè)可以讓后臺(tái)傳你需要的參數(shù)。
這樣,點(diǎn)擊推送消息跳轉(zhuǎn)頁面功能就完成啦!不過我這里還需要在啰嗦一句,就是后臺(tái)做推送的時(shí)候一定要注意證書的選擇,從App Store上下載下來的一定要用生產(chǎn)證書,其他時(shí)候(如真機(jī)調(diào)試)要用開發(fā)證書,否則將收不到推送。還有一個(gè)問題,我也是今天才發(fā)現(xiàn)的,就是從App Store上下載的和真機(jī)調(diào)試的雖然用的是同一部手機(jī),但是token是不一樣的,在調(diào)試的時(shí)候也需要注意一下。
有什么說的不對(duì)的地方歡迎大家指正~