4

应用收到推送通知后,我想更改 main 上某些按钮的标题ViewController。为了实现这种行为,我在我的应用程序委托中重写了将我想更新的控制器application: didReceiveRemoteNotification:重新实例化为它的根视图控制器的方法,将按钮的标题设置为我想要的任何内容:UINavigationController

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
       UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:self.welcomeViewController];
       [self.window setRootViewController:navController];
       [self.welcomeViewController.buttonToUpdate setTitle: @"Updated Text" forState: UIControlStateNormal];
}

虽然这可能不是最好的解决方案(也许我可以UIButtons完全忘记并让视图控制器使用 aUITableView并将其行用作按钮?),但它适用于以下场景:

1)应用程序在前台。推送通知警报弹出,用户点击确定,视图更新正常。

2)后台/关闭的应用程序。设备处于锁定模式。推送通知到达,用户解锁设备,加载应用程序,视图也更新正常。

例如,当用户使用另一个应用程序并且推送通知到达时,问题似乎出现了,但用户不是通过推送通知而是通过点击应用程序图标打开应用程序。在那种情况下,application: didReceiveRemoteNotification:似乎没有被调用,并且问题中的视图永远不会更新。

希望我的解释清楚。我愿意接受有关不同方法的建议,或者如何使用我的方法处理最后一种情况。

谢谢!

4

1 回答 1

8

来自 APNS 开发指南:

让我们回顾一下操作为应用程序传递本地通知或远程通知时的可能场景。

当应用程序未在前台运行时会发送通知。在这种情况下,系统会显示通知、显示警报、标记图标,可能还会播放声音。

作为呈现通知的结果,用户点击警报的操作按钮或点击(或点击)应用程序图标。如果点击操作按钮(在运行 iOS 的设备上),系统将启动应用程序并且应用程序调用其委托的 application:didFinishLaunchingWithOptions: 方法(如果已实现);它传入通知负载(用于远程通知)或本地通知对象(用于本地通知)。

如果在运行 iOS 的设备上点击应用程序图标,应用程序会调用相同的方法,但不会提供有关通知的信息

您遇到的行为是点击应用程序图标时的预期行为。在这种情况下,就好像用户正常启动了应用程序并且没有收到推送通知一样。在这种情况下,您显示不同内容的唯一方法(我能想到的)是在启动应用程序时联系您的服务器并获取一些信息,表明最近向该设备发送了推送通知。

于 2013-02-18T19:57:12.330 回答