Chapter 16 notification iOS 8 -Swift Programming cookBook 读书笔记
来源:互联网 发布:mac 从远程拷贝文件夹 编辑:程序博客网 时间:2024/05/27 01:30
概述
iOS有3种nofitication:
- NSNotification: app可以广播到本app里面所有可能的接收者,当app在前台的时候,iOS同样用这类广播来通知app系统的消息,比如键盘显示或者隐藏
- UILocalNotification: 即使app在后台或者完全没有运行,也可以收到,比如:你想在某一个特别的时间唤醒你的app,可以用这类notification
- push notification: 通过一个服务器送给iOS设备
16.1 发送notification
一个notification有3个重要的属性:
- Name:一个字符串,notification的收,发是通过name来做匹配
- Sender:一般是self,只要是收的那一边,可以多做一个判断,比如: 有2个sender都发了相同name的notification,那么可以只接收其中某一个的
- User info dictionary: 可以传一个字典
let notificationName = "NotificationNameGoHere" override func viewDidLoad() { super.viewDidLoad() let notification = NSNotification(name: notificationName, object: self, userInfo: ["Key1" : "Value1", "Key2" : 2]) NSNotificationCenter.defaultCenter().postNotification(notification) }
16.2 收notification
通过调用addObserver:selector:name:object: 方法, 有4个属性要注意:
- addObserver: 接收notification的对象
- selector: 函数,有一个参数是NSNotification
- name:想要接收的notification的名字
- object: 送notification的对象
如果不想接收了,调用NSNotificationCenter的removeObserver, observer的类必须要继承于NSObject
class Person:NSObject { var firstName: NSString? var lastName:NSString? func handleSendPersonInfoNotification(notification:NSNotification) { firstName = notification.userInfo![AppDelegate.personInfoKeyFirstName()] as! String lastName = notification.userInfo![AppDelegate.personInfoKeyLastName()] as! String } override init() { super.init() NSNotificationCenter.defaultCenter().addObserver(self, selector: "handleSendPersonInfoNotification:", name: AppDelegate.SendPersonInfoNotification, object: UIApplication.sharedApplication().delegate) } deinit { NSNotificationCenter.defaultCenter().removeObserver(self) }}
16.3 接收键盘的notification
键盘的notification:
- UIKeyboardWillShowNotification: 键盘将要显示,携带user-info
- UIKeyboardDidShowNotification: 键盘已经显示
- UIKeyboardWillHideNotification:键盘将要消失,携带user-info
- UIKeyboardDidHideNotification:键盘已经消失
在user-info里面,有一些需要Key注意: - UIKeyboardAnimationCurveUserInfoKey : 动画的曲线的类型,返回是一个anyobject,要先转为NSValue,然后取得一个NSUInteger
- UIKeyboardAnimationDurationUserInfoKey: 动画持续的时间,返回是一个anyobject,要先转为NSValue,然后取得一个double
- UIKeyboardFrameBeginUserInfoKey: 键盘的frame,如果键盘即将显示,那就是键盘显示之前的frame,如果键盘已经显示,将要隐藏,那么就是键盘显示的frame,返回是一个anyobject,要先转为NSValue,然后取得一个CGRect
- UIKeyboardFrameEndUserInfoKey:动画结束后的键盘frame
16.4 local notification
如果你在做一个闹钟或者一个日历app,需要在你的app没有运行的时候,提醒用户,需要用到。步骤:
- registerUserNotificationSettings: 首先要注册一个notification,iOS会弹出一个框让用户接受或拒绝。
- scheduleLocalNotification: 在用户选择了以后,会调用 func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings),在这个函数里面scheduleLocalNotification
- 然后当schedule的时间到了以后,会调用 func application(application: UIApplication, didReceiveLocalNotification notification: UILocalNotification)
UIApplication.sharedApplication().scheduleLocalNotification(notification)
let settings = UIUserNotificationSettings(forTypes: .Alert | .Badge, categories: nil) UIApplication.sharedApplication().registerUserNotificationSettings(settings)
一个UILocalNotification有许多属性:
- fireDate: 一个NSDate类型,告诉iOS什么时候notification被触发
- timeZone: 一个NSTimeZone类型,你可以取得当前的timezone,通过NSCalendar的timeZone函数
- alertBody: 一个NSString类型,表示当notification触发时,显示的字符串
- hasAction: 一个Bool类型,告诉iOS,当notification的时候,你的app是否想要有动作,如果是true,iOS会显示你的alertAction给用户,如果是false,只会显示有一个notification到了。
- alertAction:一个国际化的字符串
- applicationIconBadgeNumber: 如果local notification需要更改你的app icon上的小红点上的值,设置这个值,必须是int。iOS会做加1的动作。你可以取到当前icon上的值, 用UIApplication的applicationIconBadgeNumber属性。
- userInfo: 字典,当notification产生的时候,可以传给app。
hasAction 和 alertAction 属性容许用户去在notification certer打开你的local notificaiton,让iOS开启你的app。
以下实现了app在后台的时候,系统发送notification:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { //First ask the user if we are allowed to perform local notifications let settings = UIUserNotificationSettings(forTypes: .Alert, categories: nil) application.registerUserNotificationSettings(settings) return true } func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) { //The user did not allow us to send notifications if notificationSettings.types == nil { return } let notification = UILocalNotification() notification.fireDate = NSDate(timeIntervalSinceNow: 8) notification.timeZone = NSCalendar.currentCalendar().timeZone notification.alertBody = "A new item is downloaded" notification.hasAction = true notification.alertAction = "View" notification.applicationIconBadgeNumber++ notification.userInfo = [ "Key 1" : "Value 1", "Key 2" : "Value 2" ] application.scheduleLocalNotification(notification) }
16.5 app在前台的时候,发local notification
local notification发生的情况:
- app在前台: local notification发生后,application:didReceiveLocalNotification:方法会被调用
- app在后台:当用户点击notification,app被调用,到前台,然后application:didReceiveLocalNotification:方法会被调用,如果不点击,就不会被调用
- app没开:首先app要先开过一次,notification被注册过,然后app被关掉或者没有active,到了app的notification定义的时间,iOS会弹出提示,如果用户点击,那么app会被唤醒。didFinishLaunchingWithOptions的launchOptions传入UIApplicationLaunchOptionsLocalNotification。
- 设备锁屏: 没有特别的地方,看app在以上上面哪种状况下,就按照上面的状况处理。
tips: 双击home键: shift+commend+h,shift+commend按住不放,h按2次。
16.6 系统的notification
当你的app在前台的时候,想要取得系统的notification。
以下是一些比较重要的系统notification:
- NSCurrentLocaleDidChangeNotification: locale改变,比如:用户把语言从英文变成中文
- NSUserDefaultsDidChangeNotification: 用户改变了app的设置,在setting里面, notification会返回一个NSUserDefaults
func handleSettingsChanged(notification: NSNotification)NSNotificationCenter.defaultCenter().addObserver(self, selector: "handleSettingsChanged:", name: NSUserDefaultsDidChangeNotification, object: nil)
- UIDeviceBatteryStateDidChangeNotification: 当电池状态改变的时候,比如设备插入电脑,可以读UIDevice的batteryState来获得电量
- UIDeviceProximityStateDidChangeNotification: 当距离sensor改变状态的时候,可以读UIDevice的proximityState,来取得距离sensor的值
- UIDeviceOrientationDidChangeNotification: 旋转
当app在后台的时候,notification会不会发过来的,但是会存起来,当app在前台的时候发过来。如果app竖屏在后台,然后转了4次,又回到竖屏,不会有nitification。
NSNotificationCenter.defaultCenter().addObserver(self, selector: "orientationChanged:", name: UIDeviceOrientationDidChangeNotification, object: nil)
16.7/8/9 push notification
让你的app接受服务器的push notification,步骤:
- 设置provision profile,enable push notification;
- 在app里面,注册,iOS会弹出一个框,让用户确认;
application.registerForRemoteNotifications()
- 收集设备的push notifications identifier,发给服务器
- 实现回调函数
application:didRegisterForRemoteNotificationsWithDe viceToken:application:didFailToRegisterForRemoteNotifications WithError:
t.b.d
0 0
- Chapter 16 notification iOS 8 -Swift Programming cookBook 读书笔记
- Chapter 10 手势 iOS 8 -Swift Programming cookBook 读书笔记
- Chapter 5:collection view - iOS 8 Swift Programming cookBook 读书笔记
- Chapter 5:UIKit Dynamics - iOS 8 Swift Programming cookBook 读书笔记
- Chapter 19:animations - iOS 8 Swift Programming cookBook 读书笔记
- Chapter 7:多线程GCD - iOS 8 Swift Programming cookBook 读书笔记
- Chapter 17 Core Data iOS 8 -Swift Programming cookBook 读书笔记
- Network(NSURLSession) - iOS 8 Swift Programming cookBook 读书笔记
- Chapter1 基础部分 - iOS 8 Swift Programming cookBook 读书笔记
- 《iOS 6 Programming Cookbook》读书笔记
- iOS 8 Swift Programming Cookbook: Solutions & Examples for iOS Apps
- iOS 8 Swift Programming Cookbook: Solutions & Examples for iOS Apps
- iOS 5 Programming Cookbook
- iOS7 Programming Cookbook-Chapter 7-Concurrency(Operation)
- 【读书笔记】"Programming Windows" (chapter 1)
- 《C++.GUI.Programming.with.Qt.4》读书笔记Chapter 16~18
- iOS7 Programming Cookbook-Chapter 7-Concurrency(Timer and Thread部分)
- iOS7 Programming Cookbook-Chapter 7:Concurrency(Block部分)
- 自定义UITableViewCell(2) 多个自定义cell
- HBase1.0以上版本的API改变
- Linux学习笔记---目录处理命令---删除文件或目录
- 关于使用openfiler作为共享存储来安装rac时的问题
- Java Servlet完全教程
- Chapter 16 notification iOS 8 -Swift Programming cookBook 读书笔记
- CELL⾃适应⾼度
- JMeter--web性能测试使用笔记
- [网狐]游戏添加方法
- Makefile中用宏定义进行条件编译(gcc -D)/在Makefile中进行宏定义-D
- Hadoop YARN新特性—label based scheduling
- C源码@数据结构与算法->队列(queue)
- Java
- Modeling with Sequence Diagram