在应用收到推送通知后,我想更改主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
并使视图控制器使用UITableView
,其行作为按钮?),但它适用于以下方案:
1)应用程序位于前台。弹出推送通知提醒,用户触摸确定,视图更新正常。
2)应用程序在后台/关闭。设备处于锁定模式。推送通知到达,用户解锁设备,加载应用程序,查看也更新。
当用户使用其他应用程序时,似乎会出现问题,推送通知到达,但用户不是通过推送通知打开应用程序,而是通过点击应用程序图标。在这种情况下,似乎没有调用application: didReceiveRemoteNotification:
,并且问题中的视图永远不会更新。
希望我的解释清楚。我愿意接受有关不同方法的建议,或者如何使用我的方法处理最后一个方案。
谢谢!
答案 0 :(得分:8)
来自APNS开发指南:
让我们回顾一下操作提供的可能情况 本地通知或应用程序的远程通知。
在应用程序未运行时传递通知 前景。在这种情况下,系统会显示通知, 显示警报,标记图标,或者播放声音。
作为呈现通知的结果,用户点击该动作 警报按钮或点击(或点击)应用程序图标。如果 点击操作按钮(在运行iOS的设备上),系统启动 应用程序和应用程序调用其委托 application:didFinishLaunchingWithOptions:方法(如果实现);它 传递通知有效载荷(用于远程通知)或 本地通知对象(用于本地通知)。
如果在运行iOS的设备上点击应用程序图标,则 应用程序调用相同的方法,但不提供任何信息 关于通知。
您遇到的行为是点击应用图标时的预期行为。在这种情况下,就像用户正常启动应用程序并且没有推送通知一样。在这种情况下,您可以选择显示不同内容的唯一方法(我能想到)是在应用程序启动时联系您的服务器,并获取一些信息,指示最近发送到该设备的推送通知。