我正在尝试基于notification
点击打开不同的视图控制器,但是当收到push notification
时,它会自动在后台运行控制器代码,所以当我通过应用程序图标/来自{{的通知打开应用程序时1}}它会立即加载notification centre
,但是当收到多个通知时,它会加载第一个通知控制器,而不管是否点击了哪个通知。
让我们说我已收到标题通知"晚上","早晨"和 "晚上",它应该打开"晚视图控制器"什么时候"晚上" 通知被点击,但它加载"夜视控制器"我什么时候去 它负载"晨视控制器"最后它加载"晚上 查看控制器"。在通知发出之前,我在主控制器上 然后我将应用程序移到后台。
当我点击"早晨" view controller
它现在什么都不做。
之前我尝试过使用addObserver,但结果是一样的,所以我转到app delegate。
这是app委托代码
notification
答案 0 :(得分:4)
首先,启用了Remote Notification
后台模式,以便在后台处理通知。现在的问题是,每当收到通知时,你都会将viewController推送到viewController堆栈,这就是为什么你看到三个viewControllers堆叠的原因。
其次,didReceiveRemoteNotification
可以在不同的状态下调用/处理。 StateBackground
如果应用位于后台,StateInactive
如果用户点按通知中心的通知,StateForeground
如果应用位于前台。您只需在StateBackground
中添加一个支票推送viewController,这就是点击通知时您没有看到任何更改的原因。
答案 1 :(得分:1)
为此,需要在didReceiveRemoteNotification
方法中检查应用程序状态。这是代码:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
//recieved notification
if ( application.applicationState == UIApplicationStateActive ){
// app was already in the foreground
UIViewController* topViewController = [self.navigationController topViewController];
if ([topViewController isKindOfClass:[HomeVC class]]) {
[[NSNotificationCenter defaultCenter] postNotificationName:@"getUpdatedServiceData" object:nil];
}
}
}
HomeVC中的您需要在此方法推送视图控制器中创建证书 getUpdatedServiceData 。
*注意 -
使用此方法处理应用的传入远程通知。 与应用程序不同:didReceiveRemoteNotification:方法,即 只有当您的应用程序在前台即系统中运行时才会调用 当您的应用在前台运行或运行时调用此方法 背景。此外,如果您启用了远程通知 在后台模式下,系统启动你的应用程序(或从中唤醒它) 暂停状态)并在推送时将其置于后台状态 通知到了。但是,系统不会自动进行 如果用户强行退出,请启动您的应用。在那种情况下, 用户必须重新启动应用程序或在系统之前重新启动设备 尝试再次自动启动您的应用。
感谢。
答案 2 :(得分:0)
我没试过这个,但我想这个app delegate方法会解决你的问题。
application:handleActionWithIdentifier:forRemoteNotification:withResponseInfo:completionHandler:
通过从远程通知中选择操作来激活您的应用程序时调用此方法。
userInfo
字典参数包含与远程通知相关的信息。
有关详细信息,请参阅Apple文档
答案 3 :(得分:0)
由于您在后台处理通知,因此当您尝试从通知中心启动应用时,您的应用已准备好显示之前收到的通知,此问题肯定会发生。
所以要解决你的问题,你应该
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
或- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
中显示哪些有意义,以取决于应用程序状态,这些代表会收到通知在应用启动时检查已显示的viewController。如果是,请删除它们并显示最新或点击的通知。
UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
UIViewController* topViewController = [navigationController visibleViewController];
if ([topViewController isKindOfClass:[Excercise class]])
{
[topViewController dismissViewControllerAnimated:NO completion:nil];
}
//之后启动相关通知VC。
答案 4 :(得分:0)
您可以使用不同的应用状态。
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void)
{
if ( application.applicationState == UIApplicationState.Active)
{
// App is foreground and notification is recieved,
// Show a alert.
}
else if( application.applicationState == UIApplicationState.Background)
{
// App is in background and notification is received,
// You can fetch required data here don't do anything with UI.
}
else if( application.applicationState == UIApplicationState.Inactive)
{
// App came in foreground by used clicking on notification,
// Use userinfo for redirecting to specific view controller.
}
}