假如你已經集成完了極光,恰好有這個問題不知如何解決,可以看看這篇文章,這篇是針對遠程通知的,本地通知大同小異吧。
根據我項目的要求,極光推送跳轉指定頁面分為兩種情況:app在后台情況和app在殺死的情況下。app在前台跳轉頁面暫時沒做過。
-.殺死app情況
這種情況app是由推送消息喚醒的,app啟動就必須觸發這個方法:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions ;
判斷app是否是由推送消息喚醒的,看下面:
把這個寫在上面的方法中即可。但是有時候可能會出問題。下面有方法解決。
if (launchOptions) { //是否有推送消息
NSDictionary *remoteNotification = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey]; //這是判斷app是否是由遠程通知啟動的 若是由本地通知啟動的 則把 UIApplicationLaunchOptionsRemoteNotificationKey 換成 UIApplicationLaunchOptionsLocalNotificationKey
if (remoteNotification) { //是否有遠程推送消息
[self jumpToViewctroller:remoteNotification]; //這是跳轉頁面的方法。
}
}
//跳轉方法
-(void)jumpToViewctroller:(NSDictionary *)remoteNotification{
//remoteNotification是消息的json格式,跳轉指定控制器首先你需要跟后台商量一下,添加一個字段。我這里添加的是jump,如果是1跳轉這個,是2的話跳轉那個等等。
if ([[NSString stringWithFormat:@"%@",remoteNotification[@"jump"]] isEqualToString:@"1"]) {
//這里注意一下。大多數頁面都是UINavigationController的子控制器。當然了,在這里你是不能push進去的。必須present進去。此時你可能會問,那存儲一個key值present是干什么用的。哈哈,這是告訴你要跳轉的控制器,我是被present進來的。所以我返回的時候你也要把我diss回去。同時你也要清除它。
/*
控制器的返回方法。
if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"present"] isEqualToString:@"1"]) {
[self dismissViewControllerAnimated:YES completion:^{
[[NSUserDefaults standardUserDefaults] setObject:@"" forKey:@"present"]; // 這里最好完全清除它。
}];
}else{
[self.navigationController popViewControllerAnimated:YES];
}
*/
DelivedViewController *VC = [DelivedViewController new];
[[NSUserDefaults standardUserDefaults] setObject:@"1" forKey:@"present"] ;
[[NSUserDefaults standardUserDefaults] synchronize];
UINavigationController *na = [[UINavigationController alloc] initWithRootViewController:VC];
[self.window.rootViewController presentViewController:na animated:YES completion:nil];
}
}
以上就是app未運行的情況下跳轉頁面的。 注意: 前面說了判斷是否有推送消息可能有問題。我遇到的問題就是 程序奔潰。可以讓它延遲執行,方法如下:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 忽略 。。。。。。
[self performSelector:@selector(sendNotation:) withObject:launchOptions afterDelay:1.5];
return YES;
}
-(void)sendNotation:(NSDictionary *)launchOptions{
if (launchOptions) {
NSDictionary *remoteNotification = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey];
if (remoteNotification) {
[self jumpToViewctroller:remoteNotification];
}
}
}
這樣就ok了。
二,app在后台運行情況。
這種情況就非常簡單了。 上代碼!
// iOS 10 Support 程序在后台時收到通知,點擊通知欄進入app
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {
// Required
NSDictionary * userInfo = response.notification.request.content.userInfo;
if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
//UNPushNotificationTrigger 遠程(通知類型)
[JPUSHService handleRemoteNotification:userInfo];//userInfo消息數據,包含jump。
if ([UIApplication sharedApplication].applicationState == UIApplicationStateInactive ) {
[self jumpToViewctroller:userInfo];
[UIApplication sharedApplication].applicationIconBadgeNumber = 0; //本地消息清0
[JPUSHService setBadge:0];//極光消息清0
}
}
completionHandler(); // 系統要求執行這個方法
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
// Required, iOS 7 Support
[JPUSHService handleRemoteNotification:userInfo];
if ([UIApplication sharedApplication].applicationState == UIApplicationStateInactive ) {
[self jumpToViewctroller:userInfo];
[UIApplication sharedApplication].applicationIconBadgeNumber = 0;
[JPUSHService setBadge:0];
}
completionHandler(UIBackgroundFetchResultNewData);
}
好了,以上就是全部內容,本人小白一枚,難免有理解不到位的地方,請各位大佬指正。謝謝!