iOS 極光推送 如何點擊推送消息跳轉頁面


  假如你已經集成完了極光,恰好有這個問題不知如何解決,可以看看這篇文章,這篇是針對遠程通知的,本地通知大同小異吧。

  根據我項目的要求,極光推送跳轉指定頁面分為兩種情況: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);

    

}

好了,以上就是全部內容,本人小白一枚,難免有理解不到位的地方,請各位大佬指正。謝謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM