swift 本地通知、远程通知
无论是远程推送、本地推送 都需要注册通知代码
iOS 8 把原先一步到位的 RemoteNotification 的注册分成两部分,一部分是注册新引入的那个「UIUserNotificationSettings」,另一部分是 RemoteNotifications。
事实上,Apple 在 iOS 8 将 RemoteNotification 和 LocalNotification 统一了起来。两种 Notifications 将统一由 UIUserNotificationSettings 来管理用户界面相关的东西:标记、声音和提醒。除了统一用户界面的通知外,UIUserNotificationSettings 还引入了 UIUserNotificationCategory,可以让用户方便的直接在 Notification 上进行一些快捷的操作(Action)。
if(UIApplication.instancesRespondToSelector(Selector("registerUserNotificationSettings:"))){
application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes: UIUserNotificationType.Sound | UIUserNotificationType.Alert | UIUserNotificationType.Badge, categories: nil))
}else{
application.registerForRemoteNotificationTypes(.Alert | .Sound | .Badge)
}
然后,在Appdelegate.swift 写相关远程推送、本地通知等代码
// 收到本地通知
func application(application: UIApplication, didReceiveLocalNotification notification: UILocalNotification) {
var alertView = UIAlertView(title: "系统本地通知", message: notification.alertBody, delegate: nil, cancelButtonTitle: "返回")
alertView.show()
}
// 远程推送通知 注册成功
func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
println(deviceToken.description)
}
// 远程推送通知 注册失败
func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) {
if error.code == 3010 {
println("Push notifications are not supported in the iOS Simulator.")
}else{
println("application:didFailToRegisterForRemoteNotificationsWithError: \(error)")
}
}
// 收到远程推送通知
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
let notif = userInfo as NSDictionary
let apsDic = notif.objectForKey("aps") as NSDictionary
let alertDic = apsDic.objectForKey("alert") as String
var alertView = UIAlertView(title: "系统本地通知", message: alertDic, delegate: nil, cancelButtonTitle: "返回")
alertView.show()
}
// 注册通知 alert、sound、badge (8.0之后,必须要添加下面这段代码,否则注册失败)
func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) {
application.registerForRemoteNotifications()
}
******************************本地通知方法******************************
//
// TimeViewController.swift
// UIControlDemo
//
// Created by on 14/12/10.
// Copyright (c) 2014年 马大哈. All rights reserved.
//
import UIKit
class TimeViewController: BaseViewController {
var wordTextField:UITextField? //文字
var dateTextField:UITextField? //时间
var datePicker: UIDatePicker?
override func viewDidLoad() {
super.viewDidLoad()
self.title = "时间/日期/本地通知"
let leftBarButton:UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Trash, target: self, action: "locaNotifcationDeleteAll")
self.navigationItem.rightBarButtonItem = leftBarButton;
wordTextField = UITextField(frame: CGRectMake(50, 80, 200, 40))
wordTextField?.backgroundColor = .clearColor()
wordTextField!.tag = 100
wordTextField?.borderStyle = UITextBorderStyle.RoundedRect
wordTextField?.keyboardType = UIKeyboardType.Default
wordTextField?.returnKeyType = UIReturnKeyType.Done
wordTextField?.contentVerticalAlignment = UIControlContentVerticalAlignment.Center
wordTextField?.clearButtonMode = UITextFieldViewMode.WhileEditing
wordTextField?.secureTextEntry = false
wordTextField?.textColor = .blackColor()
wordTextField?.textAlignment = .Left
wordTextField?.placeholder = "键盘"
wordTextField?.font = UIFont.systemFontOfSize(15)
self.view.addSubview(wordTextField!)
dateTextField = UITextField(frame: CGRectMake(50, 140, 200, 40))
dateTextField?.backgroundColor = .clearColor()
dateTextField!.tag = 101
dateTextField?.borderStyle = UITextBorderStyle.RoundedRect
dateTextField?.keyboardType = UIKeyboardType.Default
dateTextField?.returnKeyType = UIReturnKeyType.Done
dateTextField?.contentVerticalAlignment = UIControlContentVerticalAlignment.Center
dateTextField?.textColor = .blackColor()
dateTextField?.textAlignment = .Left
dateTextField?.placeholder = "日期picker"
dateTextField?.font = UIFont.systemFontOfSize(15)
self.view.addSubview(dateTextField!)
datePicker = UIDatePicker()
datePicker?.datePickerMode = .DateAndTime
datePicker?.timeZone = NSTimeZone.systemTimeZone()
datePicker?.addTarget(self, action: "datePickerSelected:", forControlEvents: UIControlEvents.ValueChanged)
dateTextField!.inputView = datePicker
var button = UIButton.buttonWithType(UIButtonType.Custom) as UIButton
button.frame = CGRectMake(200, 200, 50, 30)
button.backgroundColor = UIColor.redColor()
button.setTitleColor(UIColor.blackColor(), forState:.Normal)
button.setTitle("保存", forState: UIControlState.Normal)
button.titleLabel!.font = UIFont.boldSystemFontOfSize(CGFloat(20))
button.showsTouchWhenHighlighted = true
button.addTarget(self, action: "saveLocalNotificationButton", forControlEvents: UIControlEvents.TouchUpInside)
self.view.addSubview(button)
}
// 保存按钮方法
func saveLocalNotificationButton(){
var contentDic = ["KEY":"VALUE"]
locaNotifcationSchedule(chedulDate: datePicker!.date, alertBody: "通知看到 : \(wordTextField!.text)", content: contentDic)
var alertView = UIAlertView(title: "保存成功", message: nil, delegate: nil, cancelButtonTitle: "返回")
alertView.show()
wordTextField?.resignFirstResponder()
dateTextField?.resignFirstResponder()
}
// 注册本地通知
func locaNotifcationSchedule(#chedulDate: NSDate ,alertBody: String ,content: NSDictionary) {
var localNotif = UILocalNotification()
localNotif.fireDate = chedulDate
localNotif.timeZone = NSTimeZone.defaultTimeZone()
// localNotif.repeatInterval = repeatInterval 0代表不重复
localNotif.soundName = "iPhone.caf"//此属性可以不写(默认系统声音UILocalNotificationDefaultSoundName)
// localNotif.hasAction = true;
// localNotif.alertAction = "查看";
localNotif.alertBody = alertBody
localNotif.userInfo = content
UIApplication.sharedApplication().scheduleLocalNotification(localNotif)
}
// 删除所有注册的本地通知
func locaNotifcationDeleteAll() {
let application = UIApplication.sharedApplication()
application.cancelAllLocalNotifications()
var alertView = UIAlertView(title: "所有本地通知都已移除", message: nil, delegate: nil, cancelButtonTitle: "返回")
alertView.show()
}
// 动态改变textfield内容
func datePickerSelected(datePicker:UIDatePicker){
let dateString = timeDateFormatter().stringFromDate(datePicker.date)
dateTextField!.text = dateString
}
override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
wordTextField?.resignFirstResponder()
dateTextField?.resignFirstResponder()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}