将从 AppDelegate 的推送通知中收到的数据传递给 ViewController

Posted

技术标签:

【中文标题】将从 AppDelegate 的推送通知中收到的数据传递给 ViewController【英文标题】:Passing data received from a push notification from the AppDelegate to a ViewController 【发布时间】:2014-03-10 12:28:36 【问题描述】:

在我的应用程序中,有一个集合视图,其中显示一组从 Web 服务检索到的图像。每个图像都有标签。因此,该应用还可以使用标签过滤图像。

现在我正在尝试向此应用添加推送通知。将新图像添加到服务器时会发送推送通知。这些图像被标记为最新。我通过推送通知将该标签作为消息传递,我需要的是当用户点击推送通知打开应用程序时,它应该将最新的新图像加载到集合视图中。

我已经完成了一半。我在AppDelegate.m 文件中成功收到带有didReceiveRemoteNotification 方法的消息的推送通知。现在我需要将它传递给集合视图所在的视图控制器。我被困在这一点上。我不知道如何将它发送到视图控制器。

我尝试在 App 委托中声明一个属性,将消息值分配给它并从视图控制器引用它,但它不起作用。我绑定了代表、通知中心、用户默认值,但没有任何效果。

谁能告诉我如何做到这一点?

谢谢。

编辑:

这是我的代码。我尝试的最后一种方法是本地通知。

AppDelegate.m

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo

    [[NSNotificationCenter defaultCenter] postNotificationName:@"PushNotificationMessageReceivedNotification" object:nil userInfo:userInfo];

ViewController.m

- (void)viewWillAppear:(BOOL)animated

    [super viewWillAppear:animated];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(remoteNotificationReceived:) name:@"PushNotificationMessageReceivedNotification"
                                               object:nil];


- (void)remoteNotificationReceived:(NSNotification *)notification

    NSLog(@"Notification: %@", notification.userInfo);
    NSString *msg = [[notification.userInfo valueForKey:@"aps"] valueForKey:@"alert"];
    self.label.text = msg;

【问题讨论】:

你并发布一个新的本地通知并在通知对象中传递字典 试过了,但只有当我的应用程序在前台运行时它才有效。如果它在后台,它就不起作用。 当您在应用程序委托中声明属性时,有什么问题。错误是什么。 你是为 ios 7 开发的吗? @rajath 没有抛出错误。该值在didReceiveRemoteNotification 方法中正确分配给属性。我在视图控制器的viewWillAppear 方法中有检索代码。没有收到任何值。 【参考方案1】:

案例 1:如果您的应用是后台并且用户通过点击通知启动应用,那么您可以检查应用启动表单通知还是正常

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];


        NSDictionary *remoteNotificationPayload = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
        if (remoteNotificationPayload) 
            [[NSNotificationCenter defaultCenter] postNotificationName:@"notification" object:nil userInfo:remoteNotificationPayload];
       
return YES; 

案例2:如果您的应用在前台,通知将在 didReceiveRemoteNotification 中收到

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 


    NSLog(@"userinfo %@",userInfo);

    [[NSNotificationCenter defaultCenter] postNotificationName:@"notification" object:nil userInfo:userInfo];

现在你可以在任何带有本地通知的控制器中添加一个观察者,然后做你想做的事情

【讨论】:

案例 2 工作正常。案例1由于某种原因没有。我也从didFinishLaunchingWithOptions 发布了相同的通知,但没有任何反应。 @Isuru 你的应用被杀了吗? @Isuru 其他方式是在 didFinishLaunchingWithOptions 中检查通知并使用通知有效负载推送视图控制器。这应该工作 你是对的。我尝试了两种方式。当应用程序在后台并且没有被杀死并且应用程序完全终止时。它在应用程序还活着但在后台运行时工作。应用程序被杀死时不起作用。知道当应用程序也完全终止时如何执行此操作吗? 当它终止时,您是否通过点击通知启动了应用程序?【参考方案2】:

我不知道它是否有效,这只是我的建议。我以前没有尝试过,但在你的情况下它可能有效 用户 NSUserDefaults 。

在您的 appDelegate.m 中

[[NSUserDefaults standardUserDefaults] setObject:imageArrayFromServer forKey:@"MyAppSpecificGloballyUniqueString"];

在您的 viewController.m 中

NSArray *myArray = [[NSUserDefaults standardUserDefaults] objectForKey:@"MyAppSpecificGloballyUniqueString"];

【讨论】:

我试过这个。但是没有返回值。在视图控制器的viewWillDisappear 中,我尝试检索值但没有运气 嘿,我从中获得了价值,我在 appdelegate 的 applicationDidEnterBackground 中创建了一个 imageArray,并将它们放入 viewcontroller

以上是关于将从 AppDelegate 的推送通知中收到的数据传递给 ViewController的主要内容,如果未能解决你的问题,请参考以下文章

在 AppDelegate 中使用推送通知重定向视图

推送通知:从 AppDelegate 导航到 ViewController

在推送通知 Swift 2 AppDelegate 上加载特定的 viewController

在 AppDelegate iOS 中单击 FCM 推送通知时导航到特定选项卡 - Swift

为啥我在 Swift 中没有收到来自 Firebase 的推送通知?

如何在收到推送通知后刷新 watchkit 界面控制器