簡體   English   中英

啟動特定的viewController以響應遠程推送通知

[英]Launching a specific viewController in response to a remote push notification

我正在創建一個應用程序,其故事板如下圖所示:

故事板

當用戶從“Sysalert View Controller”登錄時,它們被帶入“消息列表視圖控制器”,我在其中執行NSURLConnection以將一些JSON加載到表中。 當用戶點擊表中的一行時,它們將被帶入“消息詳細信息”,其中顯示該消息的更多詳細信息。

當用戶從推送通知啟動應用程序時,無論啟動之前應用程序的狀態如何,我都希望應用程序從我的服務器加載“消息列表”數據,然后向他們顯示剛被推送到設備的消息。

我知道我需要使用didFinishLaunchingWithOptions來告訴應用程序對推送通知做出反應但是如何設置視圖層次結構以便“消息列表”視圖控制器加載其數據然后將“消息詳細信息”視圖控制器推送到堆棧為適當的消息?

基本上這種模仿消息或郵件應用程序的行為。 如果打開通知會將您帶到該消息的視圖控制器,但您仍然可以在層次結構中向后移動,就像您從初始viewController啟動應用程序並依次遍歷viewControllers一樣。

你可以做你所描述的,但我不推薦它。

Frist,將斷開連接的視圖控制器與故事板中所需的視圖放在一起,為視圖控制器提供標識符,例如“我的推送通知視圖”

didFinishLaunchingWithOptions: ,您可以從app delegate獲取rootViewController。 該控制器將是導航控制器。 使用導航控制器,您可以在堆棧頂部推送新的視圖控制器。 要創建新的視圖控制器,請使用標識符“My Push Notification View”實例化視圖控制器。

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

[navController pushViewController:notificationController animated:YES];

我想你會想要使用類似-presentViewController:animated:completion:來顯示模態視圖而不是中斷導航堆棧。

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

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

試試我在我的一個應用程序中使用,用戶將app委托中的變量作為全局變量

 ex: BOOL gotNotifcation;

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

在NotificationsViewController中,如果是自定義按鈕,則返回后退按鈕操作

-(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];
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM