处理应用程序死亡时的通知操作iOS 10
问题描述:
我在应用程序上处理iOS的本地和远程通知,并且即时通讯面临一个问题。当应用程序被终止并且通知到达远程或本地时,我点击通知,然后调用didFinishLaunchingWithOptions被调用并打开应用程序。但是,如果我选择自定义操作而不是点击通知,我的应用程序会崩溃。处理应用程序死亡时的通知操作iOS 10
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
setActions()
if #available(iOS 10.0, *) {
UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.badge,.sound], completionHandler: {(granted,error) in
if granted{
print("Notification access granted")
}
else
{
print(error?.localizedDescription as Any)
}
})
}
else {
// Fallback on earlier versions
}
if #available(iOS 10.0, *) {
UNUserNotificationCenter.current().delegate = self
} else {
// Fallback on earlier versions
}
registerForPushNotifications(application: application)
if let notification = launchOptions?[UIApplicationLaunchOptionsKey.remoteNotification] as? [String: AnyObject]
{
self.application(application, didReceiveRemoteNotification: notification)
}
return true
}
func application(_ application: UIApplication, didReceiveRemoteNotification data: [AnyHashable : Any]) {
let aps = data["aps"] as! [String:AnyObject]
let alert = aps["alert"] as! [String:AnyObject]
let title = alert["title"] as! String
let deadlineTime = DispatchTime.now() + .milliseconds(10)
DispatchQueue.main.asyncAfter(deadline: deadlineTime) {
let navigationController = self.window?.rootViewController as! UINavigationController
let activeViewCont = navigationController.viewControllers
let viewController = activeViewCont[0] as? ViewController
viewController?.button.setTitle(title, for: .normal)
}
print("Push notification received: \(data)")
}
func setActions(){
if #available(iOS 10.0, *) {
let like = UNNotificationAction(identifier: "like", title: "Like", options: .foreground)
let dismiss = UNNotificationAction(identifier: "dismiss", title: "Dismiss", options: .destructive)
//Action for CHAT REPLY
let reply = UNTextInputNotificationAction(identifier: "reply", title: "Reply", options: .foreground, textInputButtonTitle: "Send", textInputPlaceholder: "Enter Your Message")
let categoryOne = UNNotificationCategory(identifier: "customNotification", actions: [like,dismiss,reply], intentIdentifiers: [], options: [])
let categoryTwo = UNNotificationCategory(identifier: "localNotification", actions: [like,dismiss], intentIdentifiers: [], options: [])
UNUserNotificationCenter.current().setNotificationCategories([categoryOne,categoryTwo])
}
else
{
let like = UIMutableUserNotificationAction()
like.activationMode = .foreground
like.identifier = "like"
like.title = "Like"
let dismiss = UIMutableUserNotificationAction()
dismiss.activationMode = .background
dismiss.identifier = "dismiss"
dismiss.title = "Dismiss"
let reply = UIMutableUserNotificationAction()
reply.activationMode = .background
reply.identifier = "reply"
reply.title = "Reply"
if #available(iOS 9.0, *) {
reply.behavior = .textInput
} else {
// Fallback on earlier versions
}
let categoryOne = UIMutableUserNotificationCategory()
categoryOne.identifier = "customNotification"
categoryOne.setActions([dismiss,like,reply], for: .default)
let categoryTwo = UIMutableUserNotificationCategory()
categoryTwo.identifier = "localNotification"
categoryTwo.setActions([dismiss], for: .default)
let notificationSettings = UIUserNotificationSettings(types: [.badge, .sound, .alert], categories: [categoryOne,categoryTwo])
UIApplication.shared.registerUserNotificationSettings(notificationSettings)
}
}
答
在调度队列中使用此代码。
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
var homeViewController = mainStoryboard.instantiateViewControllerWithIdentifier("HomeViewController") as! HomeViewController
let nav = UINavigationController(rootViewController: homeViewController)
appdelegate.window!.rootViewController = nav
+0
当通知到达时,应用程序被杀死只didFinishLaunchingWithOptions被调用,所以如何解决我的问题 –
+0
您的应用程序崩溃是因为您通常不是从故事板标识符创建viewcontroller对象。您已创建导航控制器对象,那时由于这个原因没有viewcontrollers设置到导航控制器堆栈中。 – Rajesh
请显示'setActions'。 – shallowThought
我已经通过添加setActions更新了问题 –
我在这里回答了同样的问题: http://stackoverflow.com/a/43815251/3934111 –