iOS 10 以下系统:
1. 添加通知:
几种触发方式:
UNPushNotificationTrigger 通过 APNs 服务发来的推送自动创建
UNTimeIntervalNotificationTrigger 定时触发
UNCalendarNotificationTrigger 定期触发
UNLocationNotificationTrigger 定位触发
// 设置每一周的某一天弹出通知
let notification = UILocalNotification()
notification.alertBody = R.string.localize.heyItSTimeToWorkout()
notification.timeZone = NSTimeZone.default
let calendar = NSCalendar.autoupdatingCurrent
var components = calendar.dateComponents([ .year, .weekOfYear], from: Date())
components.hour = localNotificationModel.hour
components.minute = localNotificationModel.minute
components.weekday = localNotificationModel.weekday
notification.repeatInterval = .weekOfYear
let date = NSCalendar.current.date(from: components)
print("localNotificationModel.weekday___\(localNotificationModel.weekday)____fireDate________\(String(describing: date))")
notification.fireDate = date
notification.userInfo = ["identifier": localNotificationModel.recordID]
UIApplication.shared.scheduleLocalNotification(notification)
2. 移除通知:
guard let notifications = UIApplication.shared.scheduledLocalNotifications else {
return
}
for notification in notifications {
guard let userInfo = notification.userInfo else {
continue
}
if (userInfo["identifier"] as? String ) ?? "" == identifer {
UIApplication.shared.cancelLocalNotification(notification)
break
}
}
3. 移除全部还未触发的通知:
UIApplication.shared.cancelAllLocalNotifications()
iOS 10以上版本系统
1. 添加通知:
if #available(iOS 10.0, *) {
var components = DateComponents()
components.hour = localNotificationModel.hour
components.minute = localNotificationModel.minute
components.weekday = localNotificationModel.weekday
let trigger = UNCalendarNotificationTrigger(dateMatching: components, repeats: true)
let content = UNMutableNotificationContent()
content.body = R.string.localize.heyItSTimeToWorkout()
let request = UNNotificationRequest(identifier: localNotificationModel.recordID, content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request) { (error) in
print("error==\(error.debugDescription)" )
}
}
2. 移除通知:
if #available(iOS 10.0, *) {
UNUserNotificationCenter.current().removePendingNotificationRequests(withIdentifiers: [identifer])
}
3. 移除全部还未触发的通知:
UNUserNotificationCenter.current().removeAllPendingNotificationRequests()
需要注意的问题:
1. 通知的添加一定要设置 alertBody,不然通知无法显示
2. 在iOS 10中,用同一个 identifier 添加多次通知,这时候永远是最后一个有效,也就是说后面添加的会覆盖前面添加的; 但是 在 iOS 10以下,同一个 identifier 添加多次通知,只要 Notification触发的时间设置的不一样,后面添加的就不会覆盖前面添加的,所以会添加多个通知。这是一个坑.
3.一个坑点: APP可以删除,但是设置的通知并不会被删除
APP设置通知之后,如果你没有把通知移除掉,这时候你把APP删除,重新安装之后,你之前设置的通知依旧会出现在新安装的APP之中,系统保留了这些通知的信息。
调试:
//获取已添加的通知队列中,待触发的通知信息
func getPendingNotificationRequests(){
#if DEBUG
if #available(iOS 10.0, *) {
UNUserNotificationCenter.current().getPendingNotificationRequests { (notificationReqeusts) in
print("notificationReqeusts.count____\(notificationReqeusts.count)")
for request in notificationReqeusts {
let trigger = request.trigger as! UNCalendarNotificationTrigger
let nextTriggerDate = trigger.nextTriggerDate()
print("nextTriggerDate____\(String(describing: nextTriggerDate))")
}
}
} else {
let notifications = UIApplication.shared.scheduledLocalNotifications
print("notifications.count_______\(String(describing: notifications?.count))")
for notification in notifications! {
print("nextTriggerDate______\(notification.fireDate)")
}
}
#endif
}
我 18:49 添加了7个通知打印输出如下:
nextTriggerDate____2017-05-21 10:49:00 +0000
nextTriggerDate____2017-05-22 10:49:00 +0000
nextTriggerDate____2017-05-16 10:49:00 +0000
nextTriggerDate____2017-05-17 10:49:00 +0000
nextTriggerDate____2017-05-18 10:49:00 +0000
nextTriggerDate____2017-05-19 10:49:00 +0000
nextTriggerDate____2017-05-20 10:49:00 +0000
发现输出的通知触发时间和我添加通知的时间刚好相差8h,这是时区的问题,那么应该如何解决这个问题呢?答案是不需要处理,经过验证发现,通知触发时间依然会是你添加通知的时间,而不是你打印的通知信息的那个时间,原因估计是系统做过处理了
其他在查资料的过程中的一些零碎有用信息:
更新和取消通知
1.取消已展示的推送
[notificationCenter removeDeliveredNotificationsWithIdentifiers:@[requestIdentifier]];
2.取消未展示的推送
[notificationCenter removePendingNotificationRequestsWithIdentifiers:@[requestIdentifier]];
3.更新
// 无论显示还是未显示的通知想要更新只需要新建一个 UNNotificationRequest 将 requestIdentifier 设置成想替换的通知标识就可以完成替换
DeviceToken变化
DeviceToken不仅仅系统升级的时候会改变,系统重刷,应用删除再安装,DeviceToken都会改变
网友评论