Swift - 本地消息的推送通知(附样例)
注意:UILocalNotification现在已经被废弃。推送功能改用UserNotifications框架实现。关于UserNotifications框架的具体用法可以参考我的另一篇文章:Swift - UserNotifications框架使用详解2(发送本地通知)
使用UILocalNotification可以很方便的实现消息的推送功能。我们可以设置这个消息的推送时间,推送内容等。
1,推送消息的发送
--- AppDelegate.swift ---
--- ViewController.swift ---
2,点击推送消息的响应
使用UILocalNotification可以很方便的实现消息的推送功能。我们可以设置这个消息的推送时间,推送内容等。
当推送时间一到,不管用户在桌面还是其他应用中,屏幕上方会都显示出推送消息。
下面通过一个样例演示如何实现本地的消息推送。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | import UIKit @UIApplicationMain class AppDelegate : UIResponder , UIApplicationDelegate { var window: UIWindow ? func application(_ application: UIApplication , didFinishLaunchingWithOptions launchOptions: [ UIApplicationLaunchOptionsKey : Any ]?) -> Bool { //开启通知 let settings = UIUserNotificationSettings (types: [.alert, .badge, .sound], categories: nil ) application.registerUserNotificationSettings(settings) return true } func applicationWillResignActive(_ application: UIApplication ) { } func applicationDidEnterBackground(_ application: UIApplication ) { } func applicationWillEnterForeground(_ application: UIApplication ) { } func applicationDidBecomeActive(_ application: UIApplication ) { } func applicationWillTerminate(_ application: UIApplication ) { } } |
--- ViewController.swift ---
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | import UIKit class ViewController : UIViewController { override func viewDidLoad() { super .viewDidLoad() //发送通知消息 scheduleNotification(itemID: 12345) //清除所有本地推送 //UIApplication.shared.cancelAllLocalNotifications() } //发送通知消息 func scheduleNotification(itemID: Int ){ //如果已存在该通知消息,则先取消 cancelNotification(itemID: itemID) //创建UILocalNotification来进行本地消息通知 let localNotification = UILocalNotification () //推送时间(设置为30秒以后) localNotification.fireDate = Date (timeIntervalSinceNow: 30) //时区 localNotification.timeZone = NSTimeZone . default //推送内容 localNotification.alertBody = "来自hangge.com的本地消息" //声音 localNotification.soundName = UILocalNotificationDefaultSoundName //额外信息 localNotification.userInfo = [ "ItemID" :itemID] UIApplication .shared.scheduleLocalNotification(localNotification) } //取消通知消息 func cancelNotification(itemID: Int ){ //通过itemID获取已有的消息推送,然后删除掉,以便重新判断 let existingNotification = self .notificationForThisItem(itemID: itemID) if existingNotification != nil { //如果existingNotification不为nil,就取消消息推送 UIApplication .shared.cancelLocalNotification(existingNotification!) } } //通过遍历所有消息推送,通过itemid的对比,返回UIlocalNotification func notificationForThisItem(itemID: Int )-> UILocalNotification ? { let allNotifications = UIApplication .shared.scheduledLocalNotifications for notification in allNotifications! { let info = notification.userInfo as ! [ String : Int ] let number = info[ "ItemID" ] if number != nil && number == itemID { return notification as UILocalNotification } } return nil } override func didReceiveMemoryWarning() { super .didReceiveMemoryWarning() } } |
2,点击推送消息的响应
收到推送,如果点击推送内容,则会重新进入到App,这个时候会调用 AppDelegate 中的 func application(_ application: UIApplication, didReceive notification: UILocalNotification) 代理方法。
在这个方法中我们可以根据推送的消息内容实现相关的功能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | func application(_ application: UIApplication , didReceive notification: UILocalNotification ) { //设定Badge数目 UIApplication .shared.applicationIconBadgeNumber = 0 let info = notification.userInfo as ! [ String : Int ] let number = info[ "ItemID" ] let alertController = UIAlertController (title: "本地通知" , message: "消息内容:\(notification.alertBody)用户数据:\(number)" , preferredStyle: .alert) self .window?.rootViewController!.present(alertController, animated: true , completion: nil ) } |
我感觉应该更新下这个,现在是用 UserNotification了,创建UNNotificationContent和UNNotificationTrigger,然后在 UNNotificationRequest中加入trigger和content,接下来在UNNotificationCenter中添加Request即可。
请问这个运行allNotifications数据都为nuull 然后遍历的时候就会报错。
能麻烦解决下有关极光推送或者百度推送的原理和简单使用方法吗?
还有就是怎么让后台自动发送通知的?
程序在推出状态,怎么还会接收到消息呢?
还请赐教。。感谢!!!
请教个问题:点击APP图标响应消息通知的方法是哪个呢?