iOS LocalNotification 相关

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都会改变

你可能感兴趣的:(iOS LocalNotification 相关)