6

私はSOを見ましたが、プッシュ通知を受け取ったときに特定のView Controllerを開く方法について説明する質問を見つけることができませんでした。たとえば、WhatsApp のようなアプリを作成していて、2 つの異なるプッシュ通知、つまり 2 人の異なるユーザーからのメッセージを受け取った場合、アプリのデリゲートからそれぞれの viewController にどのように指示しますか?

appDelegate が提供する userinfo ディクショナリで私が知っている限り、特定の viewController に ID を与えることができますが、特定のビュー コントローラに敬意を表して、そのビュー コントローラに再度指示する方法がわかりません。 . 回答にコード スニペットを含めてください

**** Swift または Objective-C の回答はどちらも受け入れられます ****

4

4 に答える 4

15

アプリデリゲートでこのコードを使用して、アプリが通知から開かれたかどうかを検出できます。UIApplicationStateInactiveアプリがアクティブになる前の状態の場合は、初期ビュー コントローラーを設定する必要があります。そこで任意のロジックを実行して、どのView Controllerを開くか、そのView Controllerにどのコンテンツを表示するかを決定できます。

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{

    if(application.applicationState == UIApplicationStateActive) {

        //app is currently active, can update badges count here

    } else if(application.applicationState == UIApplicationStateBackground){

        //app is in background, if content-available key of your notification is set to 1, poll to your backend to retrieve data and update your interface here

    } else if(application.applicationState == UIApplicationStateInactive){

        //app is transitioning from background to foreground (user taps notification), do what you need when user taps here

        self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];

        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];

        UIViewController *viewController = // determine the initial view controller here and instantiate it with [storyboard instantiateViewControllerWithIdentifier:<storyboard id>];

        self.window.rootViewController = viewController;
        [self.window makeKeyAndVisible];

    }

}
于 2016-06-10T19:12:33.770 に答える
4

これは、if/else の代わりに switch/case を使用した Swift 3 バージョンです。

    open func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) {
    switch application.applicationState {
    case .active:
        print("do stuff in case App is active")
    case .background:
        print("do stuff in case App is in background")
    case .inactive:
        print("do stuff in case App is inactive")
    }
}
于 2017-05-04T10:39:28.890 に答える