iOS的推送通知,除了帶有title和content這些明文字段外,還可以夾帶一些自定義參數。使用這些參數,我們就可以判斷需要打開什么頁面,傳遞什么參數,這是我們實現點擊推送通知跳轉頁面的技術基礎。
當用戶接受到推送通知并點擊后,系統會自動打開App。而推送的自定義參數,會包含在
(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
函數的launchOptions中。launchOptions是一個字典,包含了App啟動的一些參數,而推送的自定義參數藏在了名為“UIApplicationLaunchOptionsRemoteNotificationKey”的鍵中。拿到了推送參數后,通過NSNotificationCenter發(fā)送系統通知,將“我已拿到推送自定義參數”的消息發(fā)送出去。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSDictionary *userInfo = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];
if (userInfo) {
[self performSelector:@selector(postNotification:) withObject:userInfo];
}
}
既然發(fā)送了通知,很明顯我們還需要一個通知接受方來處理通知。一般我們會選擇根控制器來處理推送切換頁面,因為App無論在什么頁面,跟控制器都會在棧里,隨時可以響應頁面切換的事件。在自定義的tabbarController中,添加通知接收方法。
@interface DBTabBarController : UITabBarController
@end
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(userInfoNotification:) name:@"userInfoNotification" object:nil];
}
- (void)userInfoNotification:(NSNotification *)notification {
NSDictionary *dic = notification.userInfo;
......
}
推送自定義參數就在notification.userInfo中,你可以根據你們之前定好的規(guī)則來切換頁面。比如我們的項目中有一個type參數,決定具體切換的VC,一個messageId,如果type是message,則切換到系統消息詳細頁面,該頁面需要一個messageId來獲取具體到消息內容。
至于這個自定義參數在那里填寫,相信很多中小型公司的推送都由第三方服務商提供。我就拿我們用的友盟來舉例。

但是當我們實機去測試的時候,往往會發(fā)現還是有幾率不能實現跳轉,尤其是第一次打開App的時候(冷啟動)。這是由于
(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
這個方法在執(zhí)行的時候,我們的TabbarController還沒有初始化好,所以全局消息發(fā)出去了,但接受者還沒有,自然是無法順利處理我們的任務。解決方法是延遲執(zhí)行發(fā)送消息的方法,我設定的時間戳是0.5秒,0.5秒后根控制器基本都處理好了,自然不會出現這個問題了。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSDictionary *userInfo = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];
if (userInfo) {
[self performSelector:@selector(postNotification:) withObject:userInfo afterDelay:0.5];
}
return YES;
}