web-dev-qa-db-ja.com

リモートプッシュ通知に応答して特定のviewControllerを起動する

下の画像のようなストーリーボードフローのアプリを作成しています。

storyboard

ユーザーが「SysalertViewController」からログインすると、「Message List View Controller」に移動し、NSURLConnectionを実行してJSONをテーブルにロードします。ユーザーがテーブルの行をタップすると、「メッセージの詳細」が表示され、そのメッセージの詳細情報が表示されます。

ユーザーがプッシュ通知からアプリを起動すると、起動前のアプリの状態に関係なく、アプリにサーバーから「メッセージリスト」データを読み込んで、デバイスにプッシュされたばかりのメッセージを表示する必要があります。

プッシュ通知に反応するようにアプリに指示するにはdidFinishLaunchingWithOptionsを使用する必要があることはわかっていますが、「メッセージリスト」ビューコントローラーがデータをロードしてから「メッセージの詳細」をプッシュするようにビュー階層を設定するにはどうすればよいですか。適切なメッセージのスタックにコントローラーを表示しますか?

基本的に、この種のメッセージまたはメールアプリの動作を模倣します。通知で開くと、そのメッセージのView Controllerが表示されますが、最初のviewControllerからアプリを起動し、viewControllerを順番に通過したかのように、階層内に戻ることができます。

24
conorgriffin

あなたが説明したことをすることは可能ですが、私はそれをお勧めしません。

まず、ストーリーボードに必要なビューを含む切断されたView Controllerを配置し、ViewControllerに「MyPushNotificationView」のような識別子を付けます。

didFinishLaunchingWithOptions:では、アプリデリゲートからrootViewControllerにアクセスできます。このコントローラーがナビゲーションコントローラーになります。ナビゲーションコントローラーを使用すると、スタックの一番上に新しいビューコントローラーをプッシュできます。新しいViewControllerを作成するには、識別子「My PushNotificationView」を使用してViewControllerをインスタンス化します。

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];
8
Jeffery Thomas

これを試してください私は私のアプリケーションの1つで使用しました、グローバルとしてアプリデリゲートの変数を使用します

 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];
    }
}
4
Charan Giri