2017-08-10 27 views
0

通知をプッシュするのが非常に新しいので、アプリが終了したときにリモートプッシュ通知を処理する最良の方法を説明するいくつかのチュートリアルを見てきました。アプリ。プッシュ通知がタップされたときdidFinishLaunchingWithOptionsを呼び出していますが、なんらかの理由で関数がスキップされ、コードを実行して適切なView Controllerを開くことができません。アプリが終了したときにプッシュ通知に応答する

ここAppDelegate

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool { 
// Override point for customization after application launch. 

//UserNotification 
let center = UNUserNotificationCenter.current() 

center.requestAuthorization(options: [.alert, .sound, .badge]) { (granted, error) in 
    // Enable or disable features based on authorization. 
    if granted { 
     UIApplication.shared.registerForRemoteNotifications() 

     if GlobalService.sharedInstance().g_userDeviceToken == nil { 
      // GlobalService.sharedInstance().g_userDeviceToken = "" 


     } 
    } else { 
     print("Don't Allow") 

    } 

    if let notification = launchOptions?[UIApplicationLaunchOptionsKey.remoteNotification] as? [String: AnyObject] { 

     self.getUserChatRooms() 
     let aps = notification["aps"] as! [String: AnyObject] 

     let mainNC = self.window?.rootViewController as! UINavigationController 
     let storyboard = UIStoryboard.init(name: "Main", bundle: nil) 

     let mainVC = storyboard.instantiateViewController(withIdentifier: String(describing: MainViewController.self)) as! MainViewController 
     GlobalService.sharedInstance().g_homeVC = mainVC 
     mainVC.didReceiveChat(aps) 
     mainNC.pushViewController(mainVC, animated: false) 

    } 
    ... 

//SVProgressHUD 
SVProgressHUD.setDefaultStyle(.dark) 

//Check UserObj 
GlobalService.sharedInstance().g_appDelegate = self 
if let userObj = GlobalService.sharedInstance().loadUserObj() { 
    GlobalService.sharedInstance().g_userMe = userObj 
    startApplication(animated: false) 
... 
return true 
} 

のコードが、これはMainVCに呼び出される関数です。

func didReceiveChat (_ notificationDictionary: [String: AnyObject]){ 
let allChats = GlobalService.sharedInstance().g_aryChatRooms 

if let noti_id = notificationDictionary["noti_id"] as? String{ 
     let pushID = Int(noti_id) 
    if pushID != nil { 
     for chat in allChats { 

      if chat.chat_room_id! == pushID! { 
      chtRoom = chat 

       NotificationCenter.default.post(name: Notification.Name(rawValue: Constants.Notifications.GET_MSG), object: self) 
      break 
      } 
     } 
    } 
} 
} 

、その後、私のviewDidLoadメソッドで、私はオブザーバを追加します。

NotificationCenter.default.addObserver(self,selector: #selector(MainViewController.addChatScn(_:_:)), name: NSNotification.Name(rawValue: Constants.Notifications.GET_MSG), object: nil) 

最後にaddChatScnメソッドを呼び出します。

@objc func addChatScn(_ chatObj: ChatRoomObj, _ msgName: String) { 
    let popvc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ChatContainerViewController") as! ChatContainerViewController 

    iconContainer.isHidden = true 
    add_Msg_Btn.isHidden = true 
    popvc.vcA = self 
    popvc.m_selectedChatRoom = chatObj 
    popvc.msgName = msgName 
    self.addChildViewController(popvc) 
    popvc.view.center = self.view.center 
    popvc.view.bounds.size = CGSize(width: 337, height: 503) 

    self.view.addSubview(popvc.view) 

    popvc.didMove(toParentViewController: self) 
} 

答えて

0

GlobalService.sharedInstanceに、「readyToReceivePush」というブール値を追加します。あなたのviewDidLoadのMainVCで、 'GlobalService.sharedInstance.readyToReceivePush'をtrueに設定します。アプリがバックグラウンドに入る場合はfalseに設定し、フォアグラウンドに戻った場合はtrueに設定します。ユーザーが通知に「didReceiveRemoteNotification」をスワイプすると、設定することを持っていたら

func applicationDidEnterBackground(_ application: UIApplication) { 
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 
    GlobalService.sharedInstance.readyToReceivePush = false 
} 

func applicationWillEnterForeground(_ application: UIApplication) { 
    // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. 
    GlobalService.sharedInstance.readyToReceivePush = true 
} 

が呼び出されます。そのメソッドで、GlobalService.sharedInstance.readyToReceivePush == falseの場合、userInfoをGlobalService.sharedInstance.savedPushInfoに保存します。

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { 
    if GlobalService.sharedInstance.readyToReceivePush == false { 
     GlobalService.sharedInstance.savedPushInfo = userInfo 
    } else { 
     // Handle notification while the user is in the foreground 
    } 
} 

あなたはGlobalService.sharedInstance.savedPushInfo場合MainVCで確認し、ことをやったら!= nilを。それが!= nilの場合、通知のuserInfoデータを処理するために、あなたのdoReceiveChat関数などを呼び出します。

+0

これは、アプリがバックグラウンドにあるときには便利だと思うが、私の特定のユースケースは、アプリが完全に終了したときである – NightHawk95

関連する問題