收到通知后,我如何才能在应用程序图标点击时获得有效负载?
Posted
技术标签:
【中文标题】收到通知后,我如何才能在应用程序图标点击时获得有效负载?【英文标题】:After Receiving Notification how can i can get payload on app icon click? 【发布时间】:2016-08-03 05:43:21 【问题描述】:我的推送通知在正常情况下正常工作,但我对以下情况有疑问:
1)当我的应用从后台移除并获得通知并点击应用图标时,我想推送视图控制器并在该视图控制器中显示有效负载数据。
2)当我的应用程序在后台并获得通知并点击应用程序图标时,我想推送视图控制器并在该视图控制器中显示有效负载数据。
以下是我的用户信息
aps =
alert = "Call from rohan panchal";
appointmentId = 220;
badge = 0;
"call_token" = "T1==cGFydG5lcl9pZD00NTI1ODY1MiZzaWc9MzM1MmM0M2E2MjkwN2JiYWMzNjgyNjk0MjFlZWMyNWEzNTZmZmM3MjpzZXNzaW9uX2lkPTJfTVg0ME5USTFPRFkxTW41LU1UUTNNREl3TVRBd01qVXdOWDV3WXpCRFMyWTRlR2xhUWpGdU1YbFpNamhvV0hoNFVHTi1VSDQmY3JlYXRlX3RpbWU9MTQ3MDIwMTAwMiZyb2xlPXB1Ymxpc2hlciZub25jZT0xNDcwMjAxMDAyLjUyMDM0NDAzNjQzMjMmZXhwaXJlX3RpbWU9MTQ3MDgwNTgwMg==";
doctorId = 238;
"doctor_country" = US;
"doctor_name" = "John smith";
patientId = 239;
"patient_country" = US;
"patient_name" = "Lottry patel";
sessionId = "2_MX40NTI1ODY1Mn5-MTQ3MDIwMTAwMjUwNX5wYzBDS2Y4eGlaQjFuMXlZMjhoWHh4UGN-UH4";
sound = default;
;
按照我的代码。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
// when i remove app from background & click on notification then following code run.
NSDictionary *notificationPayload = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];
if(notificationPayload)
NSLog(@"%@",notificationPayload);
WebViewController *DashBoard = [[WebViewController alloc]initWithNibName:@"WebViewController" bundle:nil];
self.navcntrl=[[UINavigationController alloc]initWithRootViewController:DashBoard];
else
DoctorMenuViewController *DoctorVC = [[DoctorMenuViewController alloc]initWithNibName:@"DoctorMenuViewController" bundle:nil];
self.navcntrl=[[UINavigationController alloc]initWithRootViewController:DoctorVC];
当我收到通知时,会调用以下方法。
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
NSLog(@"%@",userInfo);
WebViewController *DashBoard = [[WebViewController alloc]initWithNibName:@"WebViewController" bundle:nil];
[self.navcntrl pushViewController:DashBoard animated:YES];
请帮助。任何帮助表示赞赏。
【问题讨论】:
请分享您的用户信息,基本上您必须与 webAPI 人员核对他们发送的用户信息,然后使用导航控制器导航到所需的控制器 @gurmandeep 请检查我的用户信息。我已经更新了我的问题。 您需要哪个字段,以及您要在哪个控制器上导航。捡起来 -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo UIApplicationState state = [[UIApplication sharedApplication] applicationState]; if (state == UIApplicationStateBackground || state == UIApplicationStateInactive) //当你的应用在后台时收到通知 //打开你期望的视图控制器 else if(state == UIApplicationStateActive) //当你的应用程序在后台时收到通知应用在前台 // 什么都不做 你能在 nswer 上发帖吗 当然,我也觉得评论里搞砸了。 【参考方案1】:推送通知负载包括:
alert - 警报字符串和操作
徽章
声音
内容可用
key content-available 是一个新特性,正是这个key使无声推送成为可能。
要启用,您还必须按照此处所述将远程通知添加为您的应用 UIBackgroundModes。
当内容可用时会发生这种情况:
如果应用被暂停,系统会将其带入后台
如果应用被用户杀死,什么也不会发生,应用仍然处于未运行状态 了解应用状态变化。
潜在就是陷阱:
您使用 content-available=1 启用。但是,使用 content-available=0 禁用是错误的。要禁用,您必须删除有效负载中的密钥。
请用这个
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
if(application.applicationState == UIApplicationStateInactive)
NSLog(@"Inactive");
//do your things when you click on notification
else if (application.applicationState == UIApplicationStateBackground)
NSLog(@"Background");
else if (application.applicationState == UIApplicationStateActive)
NSLog(@"Active");
更多信息请阅读此链接http://samwize.com/2015/08/07/how-to-handle-remote-notification-with-background-mode-enabled/
【讨论】:
您好,它正在工作,但是当我的应用从后台终止时,它就无法工作 你在后台模式下查看远程通知@Maulik 吗? 是的,我检查过..一切正常,但是当我从后台删除应用程序时,点击 appicon 时不起作用 您的意思是您的应用程序被杀死并且通知来了,您点击通知横幅时它不起作用?或者你通过点击应用图标来启动应用? @Maulik 如果启动应用程序表单图标单击其工作正常 ass app lauch UIApplicationLaunchOptionsRemoteNotificationKey 这次为零。如果您的应用程序被杀死并且您通过单击通知横幅启动应用程序,您可以获得通知值表单 UIApplicationLaunchOptionsRemoteNotificationKey。【参考方案2】:application: didReceiveRemoteNotification:
当操作系统接收到 RemoteNotification 并且应用程序正在运行(在后台/挂起或在前台)时调用。
和
application:(UIApplication *)application didFinishLaunchingWithOptions
在应用程序未运行并且您单击应用程序图标时调用。
1) 当我的应用从后台移除并获得通知并点击应用图标时 -
TestViewController *testVC = your_test_vc;
UINavigationController *navVC = [[UINavigationController alloc]initWithRootViewController:testVC];
在 TestViewController 中,您可以推送控制器以显示有效负载数据。
2) 你写的都是正确的。 希望这会对你有所帮助。
【讨论】:
你是对的。但是当我从后台删除应用程序然后通知来自服务器然后我点击应用程序然后调用这个方法应用程序:(UIApplication *)应用程序didFinishLaunchingWithOptions ...但有效载荷没有得到任何数据 是的。该方法将被调用。你可以写成 self.window.rootViewController = self.navcntrl。但是如果你想要推送动画来显示你的 WebViewController 那么你需要一个视图控制器,你可以在上面推送你的控制器。【参考方案3】:应用会在特定情况下提供通知数据。如果用户的交互与其中之一不一致,则数据不可用。没有例外。
-
用户点击通知横幅(或警报)。应用是否正在运行并不重要。
负载将
content-available
字段设置为真值,并且ios 选择发送通知。
注意:这个答案没有解释如何调用或处理任何场景。
【讨论】:
这意味着我必须在用户信息中添加可用内容对吗?【参考方案4】:用户信息中的字段值是您所需要的,然后在
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
UIApplicationState state = [[UIApplication sharedApplication] applicationState];
if (state == UIApplicationStateBackground || state == UIApplicationStateInactive)
//notification is received when your app is in background
//open the view controller you expected
else if(state == UIApplicationStateActive)
//notification is received when your app is in foreground
//do nothing
【讨论】:
不起作用。当我点击 appicon 时,此方法未调用 -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 通知到达时调用该方法,您需要检查应用程序是否有任何最近的通知。然后,当您打开应用程序时,请在 didFinishLaunchingWithOptions 下检查任何通知。参考***.com/questions/16393673/… 您是说如果有新的通知并且您单击图标并打开应用程序然后您想要导航到所需的控制器? 试试weblog.plexobject.com/?p=1680或code.tutsplus.com/tutorials/…以上是关于收到通知后,我如何才能在应用程序图标点击时获得有效负载?的主要内容,如果未能解决你的问题,请参考以下文章