对于Swift 3和Swift 4.0
使用 NotificationCenter 和 AppDelegate 方法didRegister notificationSettings
。NotificationSettings 显示用户是否选择了徽章、声音等,如果他们拒绝推送通知,它将是一个空数组。它在用户响应推送通知提示时专门触发,并且似乎是大多数开发人员使用的,因为它比检查 didBecomeActive 更具体。但苹果可能会改变这一点。谁知道?
不幸的是,NotificationCenter 没有预设的通知名称,因此您要么必须设置和扩展(见末尾),要么使用原始值(SO 对此有更多信息)。
在 AppDelegate 中:
func application(_ application: UIApplication, didRegister notificationSettings: UIUserNotificationSettings) {
// if not registered users will have an empty set of settings
let accepted: Bool = !notificationSettings.types.isEmpty
NotificationCenter.default.post(name: Notification.Name(rawValue: "didRespondToPrompt"), object: self, userInfo: ["didAccept" : accepted])
}
然后观察你需要的任何地方,例如在视图控制器中:
class MyViewController: UIViewController {
//MARK: - Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(MyViewController.didRespondToPushPrompt(_:)), name: NSNotification.Name(rawValue: "didRespondToPrompt"), object: nil)
}
@objc func didRespondToPushPrompt(_ notification: Notification) {
if let userInfo: [AnyHashable : Any] = notification.userInfo, let didAccept: Bool = userInfo[NSNotificationKeyNames.didAccept] as? Bool, !didAccept {
//if user doesn't accept, do this...
} else {
//all other situations code goes here
}
}
}
有几件事:首先,对于 Swift 4.0,我在一个方法前面使用了“@objc”,但对于 Swift 3,这不是必需的。
此外,对于使用 NotificationCenter,实际上我没有使用“rawValue”。相反,我做了一个这样的扩展:
import Foundation
extension NSNotification.Name {
static let DidRegisterForPushNotifications = NSNotification.Name("DidRegisterForPushNotifications")
}
然后我可以这样使用:
NotificationCenter.default.post(name: Notification.Name.DidRegisterForPushNotifications, object: self, userInfo: ["didAccept" : myBool])
等等等等