24

ich eine App bin zu schaffen, die unter Storyboard fließt wie das Bild ist:Starten eines bestimmten Viewcontroller in Reaktion auf einen Remote-Push-Benachrichtigung

storyboard

Wenn sich ein Benutzer anmeldet von „Sysalert View Controller“ sie sind in "Message List View Controller" gebracht, wo ich eine NSURLConnection mache, um JSON in die Tabelle zu laden. Wenn ein Benutzer auf eine Zeile in der Tabelle tippt, werden sie in "Nachrichtendetails" gebracht, die detailliertere Informationen für diese Nachricht anzeigen.

Wenn ein Benutzer die App von einer Push-Benachrichtigung startet, unabhängig vom Status der App vor dem Start, möchte ich, dass die App die Nachrichtenlistendaten von meinem Server lädt und ihnen dann die Nachricht anzeigt auf das Gerät geschoben.

Ich weiß, dass ich didFinishLaunchingWithOptions verwenden muss, um der App mitzuteilen, dass sie auf die Push-Benachrichtigung reagieren soll, aber wie konfiguriere ich die Ansichtshierarchie, damit der Ansichtscontroller "Nachrichtenliste" seine Daten lädt und dann die Ansicht "Nachrichtendetails" verschiebt Controller auf den Stapel für die entsprechende Nachricht?

Im Wesentlichen diese Art von imitiert das Verhalten der Nachrichten oder Mail-Anwendungen. Wenn das Öffnen mit einer Benachrichtigung Sie zu einem Ansichtscontroller für diese Nachricht führt, können Sie dennoch in der Hierarchie zurückgehen, als ob Sie die App von der ursprünglichen ViewController aus gestartet und die viewControllers nacheinander durchlaufen hätten.

+0

@conorrifin hast du die antwort? Ich habe das gleiche Problem..thanks –

+0

Mögliche Duplikat von [iOS Swift Navigieren zu bestimmten ViewController programmgesteuert von Push-Benachrichtigung] (https://stackoverflow.com/questions/43058261/ios-swift-navigate-to-certain-viewcontroller-programmatically -from-push-notifica) –

Antwort

8

Es ist möglich zu tun, was Sie beschreiben, aber ich würde es nicht empfehlen.

Frist, legen Sie eine getrennte Ansicht-Controller mit der Ansicht, die Sie im Storyboard wollen, geben Sie dem View-Controller eine Kennung, so etwas wie "My Push Notification View"

In didFinishLaunchingWithOptions: können Sie auf die RootViewController erhalten von der App-Delegierte Dieser Controller wird der Navigationscontroller sein. Mit dem Navigationscontroller können Sie einen neuen Ansichtscontroller oben auf den Stapel schieben. Um den neuen View-Controller zu erstellen, instanziieren Sie den View-Controller mit dem Bezeichner "My Push Notification View".

UINavigationController *navController = (UINavigationController *)self.window.rootViewController; 
UIViewController *notificationController = [navController.storyboard instantiateViewControllerWithIdentifier:@"My Push Notification View"]; 

[navController pushViewController:notificationController animated:YES]; 

Ich glaube, Sie so etwas wie -presentViewController:animated:completion: nutzen will eine modale Ansicht zu zeigen, anstatt die Navigationsstapel zu unterbrechen.

UIViewController *rootController = (UIViewController *)self.window.rootViewController; 
UIViewController *notificationController = [rootController.storyboard instantiateViewControllerWithIdentifier:@"My Push Notification View"]; 

[rootController presentViewController:notificationController animated:YES completion:NULL]; 
+0

Ich habe dies in ios 7 in der didFinishLauncingWithOption implementiert und es wurde jedes Mal ausgelöst und geöffnet, wenn die App geöffnet war. Was würde ich ändern, um ausgelöst zu werden, nur wenn eine Push-Benachrichtigung einging und/oder wenn die App geschlossen wurde und eine Push-Benachrichtigung kam –

4

Das versuche ich in einem meiner Anwendung verwendet, Benutzer eine Variable in AppDelegate als globaler

ex: BOOL gotNotifcation; 

-(void)application:(UIApplication*)app didReceiveRemoteNotification:(NSDictionary *)userInfo 
{ 
    NotificationsViewController *notificationobject = [[NotificationsViewController alloc]init]; 
    [self.navigationController pushViewController:notificationobject animated:YES]; 
    gotNotifcation = YES; 
} 

In NotificationsViewController Handlungs Zurück-Taste, wenn sie angepasst ist Taste

-(void)gotoback 
{ 
    AppDelegate *delegate =(AppDelegate *)[UIApplication sharedApplication].delegate; 

    if(delegate.gotNotifcation) 
    { 
     delegate.gotNotifcation = NO; 
     MessageListController *feed = [[MessageListController alloc] init]; 
     [self.navigationController pushViewController:feed animated:NO]; 
    } 
    else 
    { 
     [self.navigationController popViewControllerAnimated:NO]; 
    } 
} 
+0

konnte Sie Ihren Code in Swift 3 @Charan Giri aktualisieren –