一. 推送通知的介绍
-
什么是推送通知
- 首先要明确一点, 推送通知与通知Notification和通知中心等一点关系都没有, 完全就不是一码事
- 推送通知的表现: 就是想用户推送一条消息, 告知用户App的一些情况
- 当你的App在后台/关闭的时候, 可以通过推送通知, 来通知用户一些与此App有关的信息
- 通知的应用场景就不详细解释了, 比如QQ/微信接收到新消息, 这都是推送通知
-
推送通知的分类
-
本地推送通知
- 本地通知主要是可以在不联网的情况下发送给用户
- 一般是在固定的时间点, 推送给用户
-
远程推送通知
- 与本地相比, 远程推送通知必须在联网的情况下才能接收到
- 远程推送服务: 又称APNs(Apple Push Notification Service), 即苹果推送通知服务, 记好这个名称的概念, 他是由苹果推送给用户的
- 一般的应用场景表现为, 当App彻底退出了, 或者在不确定的时间, 由App官方的服务器向让用户知晓一些情况, 就需要使用远程推送通知
使用原则:
谁能确定时间和内容, 谁就可以发送通知(即开发人员可以通过App的内部, 以代码的形式发送通知=本地推送通知; 开发人员无法确定, 由服务器确定并提供的信息=远程推送通知)
-
-
通知的展示样式
- 在屏幕顶部弹出的一个横条(一般会显示通知的标题, 在通知中心可以查看具体的内容)
- 在屏幕中间弹出一个UIAlertView(显示通知的具体内容)
- 在锁屏界面出现一块横幅(也会显示具体内容)
- 更新App的图标数字(告知新内容的数量)
- 播放音效, 提醒用户
- 注: 我们虽然可以设定通知的内容, 但是样式是由用户在设置->通知中心自己决定的
二.本地推送通知的一些基本使用
- 基本用法
首先, 创建本地推送通知的主要类为: UILocalNotification
let notification = UILocalNotification()
-
为本地通知设置两个必要的属性:
- 推送通知的触发时间:
notification.fireDate
- 推送通知的具体内容:
notification.alertBody
- 推送通知的触发时间:
-
本地通知的一些可选属性:
- 通知的声音:
notification.soundName
- App图标右上侧的数字提示:
notification.applicationIconBadgeNumber
- 通知的图片(但经过测试iOS9.0之后不能用):
notificcation.alertLaunchImage
- 通知的重复间隔:
notification.repeatInterval
, 最小为1分钟 - 其他的基本是一些不常用的了, 大家自行发掘吧
- 通知的声音:
-
推送通知:
- 立即推送通知:
UIApplication.sharedApplication().presentLocalNotificationNow(notification)
, 但是通知一般都是为了App在后台的时候通知用户, 所以基本不会用这个方法 - 根据触发时间, 推送通知:
UIApplication.sharedApplication().scheduleLocalNotification(notification)
- 立即推送通知:
-
取消调度本地推送通知
- 取消单个通知:
UIApplication.sharedApplication().cancelLocalNotification(notification)
- 取消所有的通知:
UIApplication.sharedApplication().cancelAllLocalNotifications()
- 取消单个通知:
获取目前所有准备调度的通知:
UIApplication.sharedApplication().scheduledLocalNotifications
-
在iOS8.0之后, 如果要使用通知功能, 必须让用户授权, 才可以使用, 通常我们在AppDelegate中, 当程序进入前台时就请求授权
extension AppDelegate { func localNotificationAuthority() { if #available(iOS 8.0, *) { // 1. 用通知的类型, 组合一个位移枚举 let typeValue = UIUserNotificationType.Alert.rawValue | UIUserNotificationType.Badge.rawValue | UIUserNotificationType.Sound.rawValue // 1.2 使用唯一枚举的真实值, 创建一个通知类型对象 let type = UIUserNotificationType(rawValue: typeValue) // 2. 使用通知类型对象, 创建一个注册设置对象 let setting = UIUserNotificationSettings(forTypes: type, categories: nil) // 3. 根据设置对象, 注册请求通知的权限 UIApplication.sharedApplication().registerUserNotificationSettings(setting) } } }
-
简单的代码演示:
class ViewController: UIViewController { // 懒加载位置管理者 lazy var locationManager : CLLocationManager = { let locationManager = CLLocationManager() if #available(iOS 8.0, *) { locationManager.requestAlwaysAuthorization() } return locationManager }() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. } @IBAction func sendLocalNotification(sender: AnyObject) { let notification = UILocalNotification() notification.fireDate = NSDate(timeIntervalSinceNow: 5) notification.alertBody = "本地通知~" // 设置时间对应的时区 notification.timeZone = NSTimeZone.defaultTimeZone() // 设置重复间隔(最少一分钟) // notification.repeatInterval = .Minute // 设置监听区域 // 该功能只有在iOS8.0之后才能使用 // if #available(iOS 8.0, *) { // let circleRegion = CLCircularRegion(center: CLLocationCoordinate2DMake(21.123, 123.234), radius: 1000, identifier: "监听区域") // // 1. 获取位置信息 // locationManager.startMonitoringForRegion(circleRegion) // // 2. 设置触发通知的区域 // notification.region = circleRegion // // 3. 设置区域的触发次数, 如果为false代表不限次数 // notification.regionTriggersOnce = false // } // 设置通知在滑屏解锁界面, 左滑时, 右侧显示的内容 notification.hasAction = true notification.alertAction = "回复" // 通知的启动图片 // 如果找不到图片的话, 会使用系统默认的图片 // iOS9.0之后, 经过试验, 不能使用了, 不会显示图片 notification.alertLaunchImage = "2.jpg" // 通知的声音 notification.soundName = "win.aac" // App图标右上角的文字 notification.applicationIconBadgeNumber = 10 // 设置通知的标题, 作用在通知中心 if #available(iOS 8.2, *) { notification.alertTitle = "新短信" } // 设置通知的附加信息 // notification.userInfo // 发送本地通知 UIApplication.sharedApplication().scheduleLocalNotification(notification) // UIApplication.sharedApplication().presentLocalNotificationNow(notification) } @IBAction func cancelLocalNotification(sender: AnyObject) { // UIApplication.sharedApplication().cancelLocalNotification(notification) UIApplication.sharedApplication().cancelAllLocalNotifications() } @IBAction func checkLocalNotification(sender: AnyObject) { let notification = UIApplication.sharedApplication().scheduledLocalNotifications print(notification) } }