将从 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 导航到 ViewController
在推送通知 Swift 2 AppDelegate 上加载特定的 viewController
在 AppDelegate iOS 中单击 FCM 推送通知时导航到特定选项卡 - Swift