SOを調べましたが、プッシュ通知を受け取ったときに特定のViewControllerを開く方法について説明する質問は見つかりませんでした。たとえば次のようなアプリを作成している場合WhatsAppと2つの異なるプッシュ通知、つまり2人の異なるユーザーからのメッセージを受信します。アプリデリゲートからそれぞれのviewControllerにどのように送信しますか?
AppDelegateが提供するuserinfo辞書で私が知る限り、特定のviewControllerにIDを与えることができますが、特定のView Controllerにトリビュートを与える方法がわからないため、再びそのviewControllerにアクセスできます。 。回答にコードスニペットを含めてください
**** SwiftまたはObjective-Cの回答は両方とも受け入れられます****
アプリデリゲートのこのコードを使用して、通知からアプリが開いたかどうかを検出できます。アプリがアクティブになる前に、アプリケーションの状態がUIApplicationStateInactive
のときに、初期ビューコントローラーを設定する必要があります。そこで任意のロジックを実行して、どのView Controllerを開くか、どのコンテンツをそのViewControllerに表示するかを決定できます。
-(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];
}
}
これがSwift 3バージョンでif/elseの代わりにswitch/caseを使用したものです
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")
}
}
//This method is called when user tap on the notification
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
print("user clicked on the notification")
let userInfo = response.notification.request.content.userInfo
print(userInfo)
//check your response and navigate to specific view controller
moveToNextViewController()
}
func moveToNextViewController() {
//Add code for present or Push view controller
let vc = UIStoryboard.init(name: "Main", bundle: nil).instantiateViewController(withIdentifier:"ViewController") as! ViewController
self.navigationController?.pushViewController(vc, animated: true)
}