UILocalNotification本地推送遇到的坑

现在有一个需求:用户三天未打开APP,给用户一个提示。
针对这种情况,现在比较简单有效的方法就是采用本地推送。为了避免AppDelegate内代码杂乱,现在我们在一个UIViewController内实现。
1、首先,我们定义一个全局的UILocalNotification对象:

/// 本地通知
private var notifi: UILocalNotification = UILocalNotification()

2、在ViewDidLoad内实现具体的通知方法:

// 进入后台的通知
NotificationCenter.default.addObserver(self, selector: #selector(detectAppEnterBackground), name: NSNotification.Name.UIApplicationDidEnterBackground, object: nil)
// 进入前台的通知
NotificationCenter.default.addObserver(self, selector: #selector(detectAppEnterForeground), name: NSNotification.Name.UIApplicationWillEnterForeground, object: nil)

3、实现具体的通知方法:

// MARK: 检测用户 进入后台 的通知
@objc private func detectAppEnterBackground() {
notifi.fireDate = Date(timeIntervalSinceNow: 246060)
notifi.alertBody = "来看看你的战绩吧,你都一天没理我了"
notifi.userInfo = ["key": "value"]
notifi.applicationIconBadgeNumber = 1
UIApplication.shared.scheduleLocalNotification(notifi)
UIApplication.shared.applicationIconBadgeNumber = 1
}

// MARK: 检测用户 进入前台 的通知
@objc private func detectAppEnterForeground() {
    UIApplication.shared.cancelLocalNotification(notifi)
}

那么问题来了,程序启动之后无法执行想要的效果:无通知!!!

经过查找资料,发现我们忽略了一个问题:
UILocalNotification在 iOS8中无效,这是因为Apple改变了策略,需要开发者申请注册推送,然后才
可能正常使用

在 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool

中,或者在执行本地通知之前,对本地通知进行注册:

let setting = UIUserNotificationSettings(types: UIUserNotificationType(rawValue: UIUserNotificationType.RawValue(1 << 2)), categories: nil)
UIApplication.shared.registerUserNotificationSettings(setting)

你可能感兴趣的:(UILocalNotification本地推送遇到的坑)