5

Il mio obiettivo è scrivere un codice che quando un utente riceve una notifica push, voglio che l'utente venga reindirizzato a un'altra vista. Se l'utente viene fornito con la notifica push e se è stato visto prima il controller (schermata iniziale di benvenuto, ecc (ma non loggato))Reindirizzare una vista con notifica push in AppDelegate

var rootViewController = self.window!.rootViewController as! ViewController 
rootViewController.performSegueWithIdentifier("hospitalSegue", sender: self) 

Questa coppia di linee di codice sta lavorando, tuttavia, se il l'utente è stato in un altro controller di visualizzazione (accesso/login/pagina utente, ecc.) questa parte di codice non funziona e reindirizza. Ho provato di tutto e non riesco ancora a trovare una soluzione. Il mio obiettivo finale è questo:

if let rootViewController = self.window!.rootViewController as? ViewController 
{ 
    var rootView: UserViewController = UserViewController() 

    if let window = self.window{ 
     window.rootViewController = rootView 
    } 

    rootViewController.performSegueWithIdentifier("hospitalSegue", sender: self) 
    println(self.window?.rootViewController) 
} 

Qualcuno può darmi un'idea?

+0

Suona come una grande Idea. Come si ricevono le notifiche push? E forse puoi darci una panoramica delle tue opinioni all'interno di InterfaceBuilder, dipende dalla tua gerarchia, come reindirizzare a una vista differente. –

+0

Stai visualizzando un 'UIViewController' modally? – Lefteris

+2

Utilizzare un NSNotificationCenter. https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/ –

risposta

1

Il codice di risposta è Objective-C, voglio parlare di logica. Per fare ciò, quando si crea la notifica push, è necessario impostare il valore userInfo per passare i dati con la notifica push.

Utilizzare questo metodo delegato: application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler

Si può decidere se quale vista si desidera mostrare gestendo userInfo

NSDictionary *segueDictionary = [userInfo valueForKey:@"aps"]; 

NSString *segueName=[[NSString alloc]initWithFormat:@"%@",[segueDictionary valueForKey:@"segueName"]]; 

if([segueName isEqualToString:@"hospitalSegue"]) 
{ 
// implement your code to redirect 
} 
0

Il codice di risposta è Objective-C, è possibile prentviewcontroller da App delegato utilizzando il metodo di seguito è stato risolto il problema utilizzando il seguente codice:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 
{ 
     [[self topViewController]presentViewController:nav animated:YES completion:nil]; 
} 

- (UIViewController*)topViewController { 
    return [self topViewControllerWithRootViewController:[UIApplication sharedApplication].keyWindow.rootViewController]; 
} 

- (UIViewController*)topViewControllerWithRootViewController:(UIViewController*)rootViewController { 
    if ([rootViewController isKindOfClass:[UITabBarController class]]) { 
     UITabBarController* tabBarController = (UITabBarController*)rootViewController; 
     return [self topViewControllerWithRootViewController:tabBarController.selectedViewController]; 
    } else if ([rootViewController isKindOfClass:[UINavigationController class]]) { 
     UINavigationController* navigationController = (UINavigationController*)rootViewController; 
     return [self topViewControllerWithRootViewController:navigationController.visibleViewController]; 
    } else if (rootViewController.presentedViewController) { 
     UIViewController* presentedViewController = rootViewController.presentedViewController; 
     return [self topViewControllerWithRootViewController:presentedViewController]; 
    } else { 
     return rootViewController; 
    } 
}