美文网首页
iOS LocalNotification 相关

iOS LocalNotification 相关

作者: 钢铁少侠 | 来源:发表于2017-05-15 19:31 被阅读134次

    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 相关

          本文链接:https://www.haomeiwen.com/subject/weghxxtx.html