Swift - 本地消息的推送通知(附样例)

使用UILocalNotification可以很方便的实现消息的推送功能。我们可以设置这个消息的推送时间,推送内容等。

当推送时间一到,不管用户在桌面还是其他应用中,屏幕上方会都显示出推送消息。

1,推送消息的发送

 原文:Swift - 本地消息的推送通知(附样例)  原文:Swift - 本地消息的推送通知(附样例)

--- AppDelegate.swift ---

 
import UIKit
 
@UIApplicationMain
class AppDelegateUIResponderUIApplicationDelegate {
 
    var window: UIWindow?
 
    func application(application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [NSObjectAnyObject]?) -> Bool {
        //开启通知
        let settings = UIUserNotificationSettings(forTypes: [.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 ---

 
import UIKit
 
class ViewControllerUIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
         
        //发送通知消息
        scheduleNotification(12345);
        //清除所有本地推送
        //UIApplication.sharedApplication().cancelAllLocalNotifications()
    }
     
    //发送通知消息
    func scheduleNotification(itemID:Int){
        //如果已存在该通知消息,则先取消
        cancelNotification(itemID)
         
        //创建UILocalNotification来进行本地消息通知
        let localNotification = UILocalNotification()
        //推送时间(设置为30秒以后)
        localNotification.fireDate = NSDate(timeIntervalSinceNow: 30)
        //时区
        localNotification.timeZone = NSTimeZone.defaultTimeZone()
        //推送内容
        localNotification.alertBody = "来自hangge.com的本地消息"
        //声音
        localNotification.soundName = UILocalNotificationDefaultSoundName
        //额外信息
        localNotification.userInfo = ["ItemID":itemID]
        UIApplication.sharedApplication().scheduleLocalNotification(localNotification)
    }
     
    //取消通知消息
    func cancelNotification(itemID:Int){
        //通过itemID获取已有的消息推送,然后删除掉,以便重新判断
        let existingNotification = self.notificationForThisItem(itemID) as UILocalNotification?
        if existingNotification != nil {
            //如果existingNotification不为nil,就取消消息推送
            UIApplication.sharedApplication().cancelLocalNotification(existingNotification!)
        }
    }
     
    //通过遍历所有消息推送,通过itemid的对比,返回UIlocalNotification
    func notificationForThisItem(itemID:Int)-> UILocalNotification? {
        let allNotifications = UIApplication.sharedApplication().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, didReceiveLocalNotification notification: UILocalNotification)代理方法。
在这个方法中我们可以根据推送的消息内容实现相关的功能。
原文:Swift - 本地消息的推送通知(附样例)

 
func application(application: UIApplication,
    didReceiveLocalNotification notification: UILocalNotification) {
        //设定Badge数目
        UIApplication.sharedApplication().applicationIconBadgeNumber = 0
             
        let info = notification.userInfo as! [String:Int]
        let number = info["ItemID"]
             
        let alertController = UIAlertController(title: "本地通知",
                message: "消息内容:\(notification.alertBody)用户数据:\(number)",
                preferredStyle: UIAlertControllerStyle.Alert)
        

        

              let cancel = UIAlertAction(title: "取消", style: UIAlertActionStyle.Cancel, handler: nil);

        

                   alertController.addAction(cancel);

     
        self.window?.rootViewController!.presentViewController(alertController,
                animated: true, completion: nil)
}
posted @ 2016-10-17 14:25  brave-sailor  阅读(700)  评论(0编辑  收藏  举报