2015-04-27 2 views
0

Я хочу отобразить конкретный UIViewController, когда получено push-уведомление, и пользователь коснется этого уведомления. Я сделал некоторые исследования и пробовал несколько вещей без успеха.Как отобразить определенный UIViewController при получении push-уведомления и прослушивании

Я пробовал следующий код, он работает на UIAlertController, но он не отображает конкретный UIViewController, который я хотел. Пожалуйста, помогите мне. Я использую Xcode 6.3.

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    NSDictionary *userInfo = [launchOptions valueForKey:@"UIApplicationLaunchOptionsRemoteNotificationKey"]; 
    NSDictionary *apsInfo = [userInfo objectForKey:@"aps"]; 

    if(apsInfo) { 

     UIStoryboard *myStoryBoard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]]; 
     notificationViewController *nvc = [myStoryBoard instantiateViewControllerWithIdentifier:@"notificationViewController"]; 

     [self.window.rootViewController presentViewController:nvc animated:YES completion:nil]; 
    } 

    return YES; 
} 

Заранее спасибо

ответ

0

Вы можете создать объект «Router», который обрабатывать полезную нагрузку уведомления, и передать этот объект из ViewController в ViewController, строящего шаг навигации стеки за шагом.

Here is a link to a sample project Я сделал, чтобы проиллюстрировать эту концепцию. Ради демоверсии «Router» построен после вызова buildNavigationStack в application:application handleOpenURL:, но вы можете легко изменить его, чтобы использовать словарь userInfo, полученный в application:didReceiveRemoteNotification:fetchCompletionHandler:.

+0

Уважаемый @ Rufel многие пользователи реализуют это и работают в основном во всех приложениях, которые используют push-уведомления, которые напрямую перенаправляются на другое представление, когда пользовательский клиент на этом уведомлении сообщает, пожалуйста, код ссылки. –

+0

@onestopappsolution: Я не уверен, что понимаю, что вы имеете в виду? – Rufel

0

Для этой цели я создаю переменную UIViewController под названием currentViewController в классе AppDelegate или моем классе Singleton, если он существует в проекте.

Для каждого VC создано, добавить следующую строку внутри viewWillAppear и viewDidAppear:

[(myAppDelegate *)[[UIApplication sharedApplication] delegate] setCurrentViewController:self]; 

Таким образом, VC показывается на экране всегда находится в Ивар.

Итак, в - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo или где бы вы ни представляли alertViewController, вы можете легко или легко представить свой новый VC.

[self.currentViewController presentViewController:vc animated:YES completion:nil]; 

Полное Detail Решение: В этом подходе критическая и сложная часть задающего currentViewController в одноплодной классе. Отдых будет очень прямолинейным.

Создать Singleton Класс:

//CapsHelper.h 
#import <Foundation/Foundation.h> 
#import <UIKit/UIKit.h> 
@interface CAPSHelper : NSObject 
{ 

} 

@property (nonatomic, strong) UIViewController * currentViewController; 

+ (instancetype)sharedHelpers; 

//CapsHelper.m 
#import "CAPSHelper.h" 
@interface CAPSHelper() 

@end 

@implementation CAPSHelper 

@synthesize currentViewController; 

#pragma mark Singleton Methods 
+ (instancetype) sharedHelpers 
{ 
    static CAPSHelper *sharedMyManager = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedMyManager = [[self alloc] init]; 
    }); 
    return sharedMyManager; 
} 

Допустим, у вас есть около 10 viewcontrollers в приложении под названием VC1, VC2, .., VC10 и т.д. В каждом ВК viewWillAppear:animated:

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    [[CAPSHelper sharedHelpers] setCurrentViewController:self] 
} 

Или, если это похоже на множество репрессий вы можете создать новый класс и переопределить viewWillAppear:animated:, и вам не составит труда попытаться вспомнить добавление выше к новым VC, которые вы создадите в будущем.

На данный момент мы все готово, каждый раз, когда ВК будет представлен на экране, мы проводим его в переменной с именем currentViewController, и она доступна из любой точки планеты, импортируя #import "CAPSHelper.h"

//AppDelegate.m 
#import "AppDelegate.h" 
#import "CAPSHelper.h" 

@interface AppDelegate() 

@end 

@implementation AppDelegate 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    NSDictionary *userInfo = [launchOptions valueForKey:@"UIApplicationLaunchOptionsRemoteNotificationKey"]; 
    NSDictionary *apsInfo = [userInfo objectForKey:@"aps"]; 

    if(apsInfo) 
    { 
     if([[CAPSHelper sharedHelpers] currentViewController]) 
     { 
      //UIViewController * pushNotificationViewController = [[UIViewController alloc] ..... This is your specific VC which you want to present when a PN is recieved.. 
      [[[CAPSHelper sharedHelpers] currentViewController] presentViewController:pushNotificationViewController animated:YES completion:nil]; 
     } 
    } 
} 

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 
{ 
    NSDictionary *apsInfo = [userInfo objectForKey:@"aps"]; 
    if(apsInfo) 
    { 
     if([[CAPSHelper sharedHelpers] currentViewController]) 
     { 
      //UIViewController * pushNotificationViewController = [[UIViewController alloc] ..... This is your specific VC which you want to present when a PN is recieved.. 
      [[[CAPSHelper sharedHelpers] currentViewController] presentViewController:pushNotificationViewController animated:YES completion:nil]; 
     } 
    } 
} 
+0

Не могли бы вы списать исходный код помощи более подробно. Я очень благодарен, что мне нравится ваш подход и я принимаю ответ, но немного помогаю ему в коде режима, если вы запишите пошаговые методы, которые хорошо работают в одобренных приложение. Спасибо –

+0

Надеюсь, это поможет, вот как я делаю то же самое, что вы пытаетесь сделать в моем приложении – aytunch

Смежные вопросы