用swift在应用中在指定时间添加本地推送

因为项目需要,所以研究了一天的本地推送,现在,把它写成博客,记录下自己的想法咯。

仔细想想,本地推送还是不难的,主要是网上资料大把,比较花时间的是项目逻辑(在哪里添加,哪里取消,怎么知道是否添加等等)。

现在要讲的是怎么添加本地推送,怎么取消本地推送,和怎么设置固定时间推送(在本文中是每天晚上九点钟)

  要在应用中添加推送通知,首先要在应用的AppDelegate的

application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?)方法添加注册通知:

iOS8或iOS之后版本注册本地通知方法:

let pushtypes : UIUserNotificationType = [UIUserNotificationType.Badge,UIUserNotificationType.Alert,UIUserNotificationType.Sound]

let mySetting : UIUserNotificationSettings = UIUserNotificationSettings(forTypes: pushtypes, categories: nil)

UIApplication.sharedApplication().registerUserNotificationSettings(mySetting)

iOS8.0以下注册通知方法:

UIApplication.sharedApplication().registerForRemoteNotificationTypes([UIRemoteNotificationType.Alert,UIRemoteNotificationType.Badge,UIRemoteNotificationType.Sound])

注册完通知,接下来就是怎么添加本地推送和设置固定时间推送了:

  //MARK:添加本地推送
    func addLocalNotification() {
        //本地推送时间(暂时为晚上九点)
        let pushTime: Float = 21*60*60

        //初始化本地通知
        let lNotification = UILocalNotification()
        let date = NSDate()
        let dateFormatter = NSDateFormatter()
        //日期格式为“时,分,秒”
        dateFormatter.dateFormat = "HH,mm,ss"
        //设备当前的时间(24小时制)
        let strDate = dateFormatter.stringFromDate(date)
        //将时、分、秒分割出来,放到一个数组
        let dateArr = strDate.componentsSeparatedByString(",")
        //统一转化成秒为单位
        let hour = ((dateArr[0] as NSString).floatValue)*60*60
        let minute = ((dateArr[1] as NSString).floatValue)*60
        let second = (dateArr[2] as NSString).floatValue
        var newPushTime = Float()
        if hour > pushTime {
            newPushTime = 24*60*60-(hour+minute+second)+pushTime
        } else {
            newPushTime = pushTime-(hour+minute+second)
        }
        let fireDate = NSDate(timeIntervalSinceNow: NSTimeInterval(newPushTime))

        //设置推送时间
        lNotification.fireDate = fireDate
        //设置推送时区
        lNotification.timeZone = NSTimeZone.defaultTimeZone()
        //应用的红色数字
        lNotification.applicationIconBadgeNumber = 1
        //推送声音
        lNotification.soundName = UILocalNotificationDefaultSoundName
        //推送内容
        lNotification.alertBody = pushBody
        //重复间隔
        lNotification.repeatInterval = NSCalendarUnit.Day
        //添加一个字典类型的info,主要就是为了记录通知的标识,这里用存了一个key名
        let info = NSDictionary(object: cartLocalNotifi, forKey: key_cartLocalNotifi)
        lNotification.userInfo = info as [NSObject : AnyObject]
        //应用添加该本地通知
        UIApplication.sharedApplication().scheduleLocalNotification(lNotification)
    }

  添加了这个方法后,就可以在每晚的九点钟准时推送你的应用了。

  接下来要说的就是怎么检测你的应用是否已经添加了你要添加的本地推送(避免重复添加)和移除你已添加的本地推送(如果每分钟推送一次,你不觉得很烦嘛??)

  检测是否已添加本地推送的原理是:首先获取设备的所有本地推送(一个数组),然后你要遍历这个数组,根据你在创建本地推送的时候的key名识别你是否已添加。

  废话不多说,代码上:

//获取本地推送数组
            let localArray = UIApplication.sharedApplication().scheduledLocalNotifications
            if localArray != nil && localArray?.count > 0 {
                for localNotif in localArray! {
                    let dict = localNotif.userInfo
                    if dict != nil {
                        let notifiName = dict![key_cartLocalNotifi] as? String
                        if notifiName != nil && notifiName == cartLocalNotifi {
                            //取消推送
                            UIApplication.sharedApplication().cancelLocalNotification(localNotif)
                        }
                    }
                }
            }

  

cartLocalNotifi和
key_cartLocalNotifi 为了方便,我写成了全局变量,其实也就是string字段,前者是通知的名字,后者是通知名字的key。啊!!终于写完了。。。希望读完我的博客的你能学点什么。。。。
时间: 2024-11-09 01:43:45

用swift在应用中在指定时间添加本地推送的相关文章

Swift 本地推送通知UILocalNotification

Notification是智能手机应用开发中常用的信息传递机制,它不用消耗更多资源去不停的检查信息状态,可以非常好的节省资源. 在iOS中分为两种通知:本地.远程.本地的UILocalNotification由全局的NotificationManager统一管理,我们只需要将本地通知对象添加到系统的Notification队列中就可以了,系统会在指定的时间激发本地通知. 本地推送通知:UILocalNotification 如果要使用推送通知,必须先在苹果的推送通知服务里注册你要使用哪几种类型的

SWIFT推送之本地推送(UILocalNotification)

本地推送通知是通过实例化UILocalNotification实现的.要实现本地化推送可以在AppDelegate.swift中添加代码实现,本事例是一个当App进入后台时推送一条消息给用户. 1.首先在didFinishLaunchingWithOptions方法内添加代码,IOS8推送消息首先要获得用户的同意,在初次安装App时会提示用户是否允许程序推送消息,此方法是App第一次运行的时候被执行一次,每次从后台激活时不执行该方法. func application(application:

iOS开发中通知(Notification)快速入门及推送通知实现教程

iOS开发中通知(Notification)快速入门及推送通知实现教程 标签: NSNotificationCenterNSNotification 2016-11-14 00:18 232人阅读 评论(0) 收藏 举报  分类: iOS(400)  转载自:http://www.111cn.NET/sj/ios8/90190.htm 通知(Notification)是开发框架中观察者模式的一种实现方式,内部的实现机制由Cocoa框架支持,通常用于试图控制器和数据模型的交互.通过通知,可以向一个

解决.NET Core中MailKit无法使用阿里云邮件推送服务的问题

在博问中(.net core怎么实现邮件发送)知道了MailKit无法使用阿里云邮件推送服务发送邮件的问题,自已实测也遇到同样的问题,而用自己搭建的邮件服务器没这个问题. 于是,向阿里云提交了工单...在提供了TCP抓包数据后,阿里云技术专员发现了问题所在:在认证通过后,MailKit发送了EHLO命令,然后才发送MAIL FROM命令,服务器在收到EHLO时会重置客户端的认证状态,所以后续的命令过来时,服务器认为客户端没有认证,于是报错“503 Bad sequence of commands

Cygwin中使用git时无法远程推送(出现DLL文件不兼容)

Cygwin中使用Git远程推送出现DLL文件不兼容 之前在Window和Linux时使用git远程推送都没有什么问题,今天在Win7中试了下Cygwin的git push是却出现如下提示: 说是不兼容的cygwin DLL文件引起段错误. 网上试了好几个办法都不行,最后突然想到GitHub分布式主要是通过公钥和私钥的原理来实现的. 因为在Win7上已经安装了Git, 也就是说私钥已经有了.于是直接把Win7上.ssh下面的文件拷贝到Cywgin home路径下的.ssh路径,发现居然可以了.

SWIFT推送之本地推送(UILocalNotification)之二带按钮的消息

上一篇讲到的本地推送是普通的消息推送,本篇要讲一下带按钮动作的推送消息,先上个图瞅瞅: 继上一篇的内容进行小小的改动: 在didFinishLaunchingWithOptions方法内进行以下修改 if (UIDevice.currentDevice().systemVersion as NSString).floatValue >= 8 { // APService.registerForRemoteNotificationTypes( // UIUserNotificationType.B

Ionic项目中使用极光推送-android

对于Ionic项目中使用消息推送服务,Ionic官方提供了ngCordova项目,这个里面的提供了用angularjs封装好的消息推送服务(官方文档),使用的是GitHub上的 PushPlugin 插件,也有相关的实现实例:GitHub地址 ,但是使用的是Google的GCM消息推送服务,一些网络原因,国内GCM可能不怎么好用(自己也没有试可不可以). 于是选择国内的消息推送服务,主要有:百度云推送,腾讯信鸽,极光推送,yunba 等等,其中只有极光推送官方提供了phonegap/cordov

在指定时间干,必须干(kbmmw 中的事件调度)

从去年开始,kbmmw 慢慢增加内涵,除了完善各种服务外,陆续增加和扩展了作为一个中间件必须有的功能, 例如,权限管理.日志系统.调度系统.内存调试等功能. 今天给大家介绍一下kbmmw 的调度事件,调度事件的主要目标就是”在指定时间干,必须干“,不是“爱干”,是“必须干” :). 在传统的delphi 中事件调度室通过两种方式,一种方式通过Ttimer 来实现,(我20年做的母校的食堂餐饮消费系统就是通过Ttimer来轮询 POS 机的).另外一种就是通过扩展Tthread 线程类,通过后台完

js中使用eval()方法将字符串转换成日期格式、并获取指定时间的日期

1.在js中eval()方法将字符串格式数据转换成日期格式 function getDate(strDate) {         //strDate为需要转换成日期格式的字符串         var date = eval('new Date(' + strDate.replace(/\d+(?=-[^-]+$)/,                 function (a) { return parseInt(a, 10) - 1; }).match(/\d+/g) + ')');