【问题标题】:Implement didReceiveRemoteNotification to show a new viewController when push comes实现 didReceiveRemoteNotification 以在推送到来时显示新的 viewController
【发布时间】:2015-04-05 11:42:04
【问题描述】:

我有一个应用程序,它应该在远程推送通知到来时加载一个 ViewController,我的 appDelegate.m 中有这个代码:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    NSLog(@"REMOTE NOTIFICATION %@", userInfo);
    if( [[MTMAPIClient sharedClient] isLoggedIn: nil]){
        if (userInfo && userInfo[@"aps"] && userInfo[@"aps"][@"extra"]) {
            if ( application.applicationState == UIApplicationStateActive ) {
                [self playSound];
            }
        }

        [NotificationHelper pushNotificationCame:userInfo view:self.tabBarController.selectedViewController];
    }
}

我的应用程序是一个选项卡式应用程序(如 AppStore 和 iTunes),我在 appDelegate 中保留了对 UITabBarController 的引用。

我的通知助手代码是:

+ (void) pushNotificationCame:(NSDictionary*)userInfo view:(UINavigationController*) viewController
{
    NSString* otp;
    if (userInfo && userInfo[@"aps"] && userInfo[@"aps"][@"extra"]) {

        otp = (NSString*)userInfo[@"aps"][@"extra"][@"otp"];


       [Authorization loadAuthByOtp:otp
                            success:^(Authorization *auth) {
                                dispatch_async(dispatch_get_main_queue(), ^{
                                    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"myStoryBoard" bundle:[NSBundle mainBundle]];
                                    TransactionDetailViewController* appTransactionDetailsView = [storyboard instantiateViewControllerWithIdentifier:@"transactionDetails"];
                                    appTransactionDetailsView.authorization = auth;
                                    [viewController pushViewController:appTransactionDetailsView animated:YES];
                                });

                            } failure:^(NSString *error, ErrorType errorType) {
                                NSLog(@"pushNotificationCame loadAuthByOtp failed with error: %@", error);
                            }];
    }
}

这适用于 70% 的场景,但有时当我退出应用程序并重新登录时,当推送通知出现时 self.tabBarController.selectedViewController 和 pushNotificationCame 方法中的“viewController”不是我选项卡中的当前活动视图栏所以 PushViewController 不起作用。

换句话说,当推送通知到来时,我的应用程序选项卡 A、B、C 中有三个选项卡选项卡 B 并没有任何反应。没有错误,但也没有新的 viewController。仅当我退出并重新登录应用程序时才会发生这种情况,通常它可以正常工作!

我的退出代码:

[viewController.navigationController.tabBarController performSegueWithIdentifier:@"logoutSegue" sender:viewController];

还有我的登录代码:

[self performSegueWithIdentifier:@"fromSignInToApplications" sender:self];

将用户带到 TabBarController 中的第一个选项卡。

在 AppDelegate 中

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{
    self.tabBarController = (UITabBarController *)self.window.rootViewController;
}

【问题讨论】:

  • 注销/登录时你会做什么? self.tabBarController 正确吗?
  • @Wain 我编辑了帖子以包含您要求的详细信息。

标签: ios objective-c iphone


【解决方案1】:

看起来问题是当你注销/登录时你正在构建一个视图控制器堆栈,所以在堆栈的根目录你有原始的选项卡视图控制器,然后你有注销,然后登录,然后是一个新的选项卡视图控制器。在这个时间点,应用程序委托仍然有对原始选项卡视图控制器的引用,并且不再起作用。

(注意,你可能没有注销视图控制器,但原理适用于登录视图控制器)

您应该考虑做的是显示注销和登录视图控制器而不是推送它们,然后,当登录完成时,而不是使用 fromSignInToApplications 推送,您将关闭并再次显示原始选项卡视图控制器。这也会使用更少的内存,并且可能会减少未来的观察等问题。

替代方法是在 segue 之后发布登录通知,以便应用程序委托可以获取新的选项卡视图控制器 - 但是,它不是窗口根视图控制器,因此您需要进行一些更改或考虑如何实现会工作的。

【讨论】:

  • 在调试窗口中,我看到的两种情况都指向相同的指针地址:0x12560ac20 0x000000012560ac20
  • 你是对的我通过在登录时发送通知并更新对 tabBarController 的引用来解决问题:- (void) tabBarControllerChanged:(NSNotification*)notification { self.tabBarController = (UITabBarController*)notification.userInfo[@"tabBar"]; }
猜你喜欢
  • 1970-01-01
  • 2016-03-10
  • 1970-01-01
  • 1970-01-01
  • 2018-06-25
  • 2012-08-07
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多