Как открыть определенный контроллер после нажатия на push-уведомление, когда приложение закрывается или убивает
На самом деле, я пытаюсь сделать в своем приложении следующее: я устанавливаю будильник для уведомления и затем принудительно завершаю приложение. Теперь, когда приходит уведомление и я нажимаю на него, оно просто открывает приложение а не конкретный контроллер, который я хочу открыть (HoroscopeNotificationViewController), тогда как после установки будильника, если приложение работает в фоновом режиме, то при нажатии на уведомление об открытии и работе конкретного контроллера нормально.
Ваша помощь будет по достоинству оценена. Спасибо заранее
func application(application: UIApplication,didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
if let _:UILocalNotification = launchOptions?[UIApplicationLaunchOptionsLocalNotificationKey] as? UILocalNotification {
NSTimer.scheduledTimerWithTimeInterval(3.0, target: self, selector: #selector(AppDelegate.showNotification), userInfo: nil, repeats: false)
let firstCategory:UIMutableUserNotificationCategory = UIMutableUserNotificationCategory()
firstCategory.identifier = "FIRST_CATEGORY"
}
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
print("MessagesID : \(userInfo["gcm_message_id"]!)")
print(userInfo)
}
func application(application: UIApplication,
handleActionWithIdentifier identifier:String?,
forLocalNotification notification:UILocalNotification,
completionHandler: (() -> Void))
{
if (identifier == "FIRST_ACTION")
{
NSNotificationCenter.defaultCenter().postNotificationName("actionOnePressed", object: nil)
}
else if (identifier == "SECOND_ACTION")
{
NSNotificationCenter.defaultCenter().postNotificationName("actionTwoPressed", object: nil)
}
completionHandler()
}
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
print("MessageId: \(userInfo["gcm_message_id"])")
print(userInfo)
}
func application(application: UIApplication, didReceiveLocalNotification notification: UILocalNotification) {
if #available(iOS 8.2, *) {
print("Function goes here : \(notification.alertTitle)")
} else {
// Fallback on earlier versions
}
if notification.category == "FIRST_CATEGORY" {
sleep(8)
let horoscopeNotificationObj = window?.rootViewController?.storyboard!.instantiateViewControllerWithIdentifier("HoroscopeNotificationViewController") as! HoroscopeNotificationViewController
window?.rootViewController?.presentViewController(horoscopeNotificationObj, animated: true, completion: nil)
}
}
func showNotification() {
NSNotificationCenter.defaultCenter().postNotificationName("modifyListNotification", object: nil)
}
4 ответа
Чтобы открыть конкретный контроллер представления по касанию уведомления в завершенном или прерванном состоянии, необходимо проверить наличие объекта параметра запуска в параметрах делегата приложения didFinishLaunchingWithOptions params. Пожалуйста, обратитесь это:
func application(application: UIApplication,didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
if let localNotification: UILocalNotification = launchOptions?[UIApplicationLaunchOptionsLocalNotificationKey] as? UILocalNotification {
//launchOptions is not nil
//if this will not work then call this below method when application root view controller is ready to handle child view transition or just do a sec delay
self.application(application, didReceiveLocalNotification: localNotification)
}
**
SWIFT 4
**
let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let nextViewController = storyBoard.instantiateViewController(withIdentifier: "chatView") as! ThreadViewController
let threadIdToPass = JSON(notificationData)["threadId"]
nextViewController.threadId = threadIdToPass.intValue
print("App Delegate thread data \(threadIdToPass.intValue)")
let navigationController = self.window?.rootViewController as! UINavigationController
navigationController.show(nextViewController, sender: Any?.self)
Спасибо всем за ваши усилия, чтобы решить мой запрос. Вместо использования "NSTimer.scheduledTimerWithTimeInterval(3.0, target: self, selector: #selector(AppDelegate.showNotification)", userInfo: nil, repeat: false)"и"func showNotification() {NSNotificationCenter.defaultCenter(). PostNotificationName(). ", object: nil)}" Я просто перенес контроллер из didFinishLaunchingWithOptions на указанный контроллер, используя instantiateViewControllerWithIdentifier, и это сработало для меня. Еще раз спасибо @Sachin и @Zhang
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
if let localNotifcation: UILocalNotification = launchOptions?[UIApplicationLaunchOptionsKey.localNotification] as? UILocalNotification {
let NotificationInfo = (launchOptions![UIApplicationLaunchOptionsKey.localNotification])!
self.application(application, didReceive: NotificationInfo as! UILocalNotification)
}