3

我看到了,但我無法找到任何問題,討論您何時收到推送通知,然後如何打開特定的視圖控制器。 例如,如果您正在創建類似WhatsApp的應用程序,並且您收到兩個不同的推送通知,即來自兩個不同用戶的消息,那麼您將如何從應用程序代理指向相應的viewController?如何使您的推送通知打開某個視圖控制器?

據我在userinfo字典中知道,appDelegate給你你可以給一個特定的viewController ID,但我不知道如何給任何特定的視圖控制器致敬,然後你可以再次直接到那個viewController。 請包括一個代碼段與你的答案

****斯威夫特或Objective-C的答案都是可以接受****

回答

9

可以檢測是否從通知開這個代碼在應用程序代理應用程序。在應用程序變爲活動狀態之前,當應用程序狀態爲UIApplicationStateInactive時,您需要設置初始視圖控制器。您可以在那裏執行任何邏輯來決定應該打開哪個視圖控制器以及該視圖控制器應該顯示哪些內容。

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

    } 

} 
+0

謝謝你這麼多。第三個id語句是你從哪裏*實際*從背景到前景......前兩個只是在沒有任何UI交互的情況下更新模型。 **對?**。所以,基本上你通過viewController的標識符**正確嗎?** – Honey

+1

對不起,我花了幾天的時間來評論,這是正確的。 –

1

這裏是斯威夫特3版本帶開關/箱,而不是的if/else

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") 
    } 
} 
相關問題