iOS的本地Notification

iOS有两种用户提醒(user notification):本地notification和远程notification。

广播提醒(broadcast notification)和key-value观察提醒不属于用户提醒

本地notification和远程notification是一样,但使用场景有所不同。

  • 本地notification,app自己定期发送的,不需要一个网络环境;
  • 远程notification,就是我们常说的远程推送啦;

附上推送的原理:app的provider推送消息到APNs(Apple Push Notification service),APNs再推送到手机上。

HF_image_01

提醒的形式包括:

  • 屏幕上的alert或者banner
  • icon上的小红点(见下图)
  • 有声音伴随的alert、banner或icon上的小红点

HF_image_02

注意

  1. 事实上除了Alert、Badge和Sound这几种方式,我们可以自定义通知形式。
  2. 如果用户的手机不允许某种形式,则该形式即使被注册了,也会被忽略(比如,静音的手机怎能显示提示音呢?)。

下面进入本文重点:local notification(本地提醒)

  • 注册local notification的用户交互形式。 可以在didFinishLaunchingWithOptions方法中调用:
let mySetting = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil) 
UIApplication.sharedApplication().registerUserNotificationSettings(mySetting)
  • 发送通知 可以在触发推送发送条件的地方调用:
func sendLocalNotification(_ body: String, fireDate: Date, dict: [AnyHashable: Any]) {      
	let notification = UILocalNotification()      
	notification.fireDate = fireDate      
	notification.alertBody = body      
	notification.userInfo = dict      
	if let notifications = UIApplication.sharedApplication().scheduledLocalNotifications {
		notification.applicationIconBadgeNumber = notifications.count + 1
	}else{
		notification.applicationIconBadgeNumber = 1
	}
	UIApplication.shared.scheduleLocalNotification(notification)
}
  • 取消通知(根据情况,不是必须的) 当需要发送本地通知的前提不存在时,可以取消本地通知:
func cancelLocalNotification(_ key: String, value: NSNumber) {      
	let notifications = UIApplication.shared.scheduledLocalNotifications
	for notification in notifications! {
		if let userinfo = notification.userInfo {
			let dict = userinfo
			if dict[key] as! NSNumber == value {
				UIApplication.shared.cancelLocalNotification(notification)
			}
		}
	}
}

注意
找到该Notification的方法是识别其userInfo的键值对。

发表评论