ios推送分為兩種懊直,一種是本地推送,一種是遠(yuǎn)程推送淑履。項目需要實現(xiàn)的就是通過遠(yuǎn)程推送來進入到指定的頁面隶垮,要做遠(yuǎn)程推送,那就必須配置相關(guān)證書秘噪,配置證書網(wǎng)上的教程很多有詳細(xì)狸吞,這就不做過多的介紹了。
首先我們需要考慮的是在不同情況下接送過來的推送通知應(yīng)該怎么處理?有幾下幾種情況:
1蹋偏、app正在使用
2便斥、app在后臺運行
3、app進程沒啟動(進程殺死)
解決方案如下:
問題一:app在運行的過程中接收了推送消息威始,會走- (void)application:(UIApplication*)application didReceiveRemoteNotification:(nonnullNSDictionary*)userInfo方法,但是這個方法app在后臺運行接收到消息也會調(diào)用枢纠,因此我們需要在此方法中進行相應(yīng)的處理,要使用[UIApplicationsharedApplication].applicationState判斷app是在前臺還是在后臺黎棠,在前臺需要給出提示晋渺,要用戶進行確認(rèn)在跳轉(zhuǎn)到指定頁面,具體方案如下:
if([UIApplicationsharedApplication].applicationState==UIApplicationStateActive) {
UIAlertView*alertView = [[UIAlertViewalloc]initWithTitle:@"消息提醒"message:@"收到一條新訊息"delegate:selfcancelButtonTitle:@"稍后"otherButtonTitles:@"立即前往",nil];
[alertViewshow];
}else{
[selfloadDetail];
}
- (void) loadDetail {
UITabBarController*tab = (UITabBarController*)self.window.rootViewController;
UINavigationController*nvc = tab.selectedViewController;
UIViewController*vc = nvc.visibleViewController;
//防止同一界面多次push
if([vcisMemberOfClass:[SQMessageTableViewControllerclass]]) {
}else{
UIStoryboard*mainStoryboard = [UIStoryboardstoryboardWithName:@"Main"bundle:nil];
SQMessageTableViewController*messageTableViewController = [mainStoryboardinstantiateViewControllerWithIdentifier:@"SQMessageTableViewController"];
[vc.navigationControllerpushViewController:messageTableViewControlleranimated:YES];
}
}
問題二:在問題一的解決方中提到了app在后臺運行接收到消息也會調(diào)用- (void)application:(UIApplication*)application didReceiveRemoteNotification:(nonnullNSDictionary*)userInfo方法,使用[UIApplicationsharedApplication].applicationState判斷app是在前臺還是在后臺脓斩,在后臺直接加載控制器就行木西。具體的施行方案和問題一的相同。
問題三:在app沒啟動的情況下随静,app啟動進入- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions方法八千,我們要在次方法中來判斷是否有推送消息,判斷[launchOptionsobjectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]是否為空來判定是否接收了到了推送消息挪挤,再根據(jù)不同的情況加載控制器,而我這里以push的方式加載的控制器关翎。具體實現(xiàn)如下的方法來實現(xiàn):
self.userInfo= [launchOptionsobjectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if(self.userInfo) {
[selfloadDetail];
}
- (void) loadDetail {
UITabBarController*tab = (UITabBarController*)self.window.rootViewController;
UINavigationController*nvc = tab.selectedViewController;
UIViewController*vc = nvc.visibleViewController;
//防止同一界面多次push
if([vcisMemberOfClass:[SQMessageTableViewControllerclass]]) {
}else{
UIStoryboard*mainStoryboard = [UIStoryboardstoryboardWithName:@"Main"bundle:nil];
SQMessageTableViewController*messageTableViewController = [mainStoryboardinstantiateViewControllerWithIdentifier:@"SQMessageTableViewController"];
[vc.navigationControllerpushViewController:messageTableViewControlleranimated:YES];
}
}
SQMessageTableViewControllerclass控制器是指定跳轉(zhuǎn)到的頁面的控制器扛门,可能根據(jù)時間情況進行替換。
總而言之最關(guān)鍵的是就是怎么加載控制器纵寝,不同的項目結(jié)構(gòu)可能需要不同的加載控制器的方式论寨,主要看實際情況來分析可能存在的問題,一一制定方案來解決問題骄蝇,具體情況具體分析吧猾愿。