iOS注冊通知中心UserNotifications基礎(chǔ)使用(Swift)

讀完這篇文章你將了解到, 在項目開發(fā)中, 如何快速掌握消息推送的API調(diào)用, 完成本地通知的注冊芒划、消息的發(fā)送以及接受消息, 本文不做詳細(xì)的關(guān)于推送的高級用法介紹, 僅為了能在日常開發(fā)中, 避免一些很基礎(chǔ)的坑,在此記錄一下而已

注冊本地通知

便于觀察我們在didFinishLaunchingWithOptions中完成通知注冊:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    registerNotification(application)  
    return true
}

其中注冊通知的方法實現(xiàn)如下:

func registerNotification(_ application: UIApplication) {
    if #available(iOS 10.0, *) {
        let center = UNUserNotificationCenter.current()
        center.delegate = self
        center.requestAuthorization(options: [.alert, .sound, .badge]) { (granted: Bool, error: Error?) in
            DispatchQueue.main.async {
                if granted { application.registerForRemoteNotifications() }
            }
        }  
    } else {
        let settings = UIUserNotificationSettings(types: [.alert, .sound, .badge], categories: nil)
        application.registerForRemoteNotifications()
        application.registerUserNotificationSettings(settings)
    }

}

在AppDelegate中, 可以通過重寫協(xié)議的方法, 來接收通知注冊成功或失敗的結(jié)果:

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    //TODO: 注冊遠(yuǎn)程通知, 將deviceToken傳遞過去
    //registerAPS(with: deviceToken.hexString)
}
    
func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
    //TODO: 注冊失敗后的結(jié)果, 可以在這里記錄失敗結(jié)果, 以后再伺機彈框給用戶打開通知
}

發(fā)送本地通知

通常我們需要調(diào)用本地通知, 來提醒用戶進(jìn)行某項操作, 這里要注意一下, 傳遞消息的userInfo僅支持基礎(chǔ)類型(String, Float, Int, Data, Date)當(dāng)做value, 不支持自定義類型

class Sender {
    var id: String
}

?這種方式會引起崩潰 
UIApplication.localNotification(title: "標(biāo)題", body: "內(nèi)容", userInfo: ["sender": sender])
?將消息內(nèi)容單獨作為Key發(fā)送 
UIApplication.localNotification(title: "標(biāo)題", body: "內(nèi)容", userInfo: ["sender": sender.id])

方法實現(xiàn)如下:

extension UIApplication {
    public static func localNotification(title: String, body: String, dateComponents: DateComponents? = nil, userInfo : [AnyHashable : Any]? = nil) {
        if #available(iOS 10, *) {
            let content = UNMutableNotificationContent()
            content.title = title
            content.body = body
            content.userInfo = userInfo ?? [:]
        
            var trigger: UNNotificationTrigger?
            if let dataCompontnts = dateComponents {
                trigger = UNCalendarNotificationTrigger(dateMatching: dataCompontnts, repeats: false)
            }
        
            let request = UNNotificationRequest(identifier: "id", content: content, trigger: trigger)
            UNUserNotificationCenter.current().add(request, withCompletionHandler: { error in
                //printLogDebug(error)
            })
        } else {
            let localNotification = UILocalNotification()
            localNotification.fireDate = dateComponents?.date ?? Date()
            localNotification.alertBody = body
            localNotification.alertTitle = title
            localNotification.userInfo = userInfo
            localNotification.timeZone = NSTimeZone.default
            localNotification.soundName = UILocalNotificationDefaultSoundName
            UIApplication.shared.scheduleLocalNotification(localNotification)
        }
    }
}
        

接收消息的推送通知

蘋果工程師在iOS10版本為我們設(shè)計了全新的通知中心, 為了兼容以前的版本, 在有消息推送過來時要考慮到在兩個地方都要處理, 這里我通過onResponseNotification方法統(tǒng)一接收消息回調(diào):

//iOS10以下接收消息的回調(diào)
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable:Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    //TODO: 接收通知的回調(diào), 當(dāng)用戶點擊通知欄, 會調(diào)起這里, iOS10以上的系統(tǒng)專門增加了一個協(xié)議方法處理, 這里做主要是兼容iOS10以下的設(shè)備
    onResponseNotification(userInfo: userInfo)
    completionHandler(.newData)
}

extension AppDelegate: UNUserNotificationCenterDelegate {
    
    @available(iOS 10.0, *)
    public func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
        onResponseNotification(userInfo: response.notification.request.content.userInfo)
        completionHandler()
    }
    
}

//接收通知的回調(diào)方法, 有兩個地方會調(diào)用此方法, 接收推送的通知在iOS10以上版本和iOS以下版本都要進(jìn)行處理
private func onResponseNotification(userInfo: userInfo) {
    guard let content = userInfo["****"] as? String {
        return 
    }
    //TODO: 通過點擊通知欄進(jìn)入App后,打開收到的消息, 做跳轉(zhuǎn)處理
}

以上是作為平時開發(fā)中, 需要經(jīng)常使用到的方法, 當(dāng)然關(guān)于UNUserNotificicationCenter的用法還有很多, 網(wǎng)上也可以找到類似的文章,這里我就不詳細(xì)翻開來說了, 有遇到問題的朋友歡迎在下面留言, 一起討論下.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末冬竟,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子民逼,更是在濱河造成了極大的恐慌泵殴,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缴挖,死亡現(xiàn)場離奇詭異袋狞,居然都是意外死亡,警方通過查閱死者的電腦和手機映屋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門苟鸯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人棚点,你說我怎么就攤上這事早处。” “怎么了瘫析?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵砌梆,是天一觀的道長默责。 經(jīng)常有香客問我,道長咸包,這世上最難降的妖魔是什么桃序? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮烂瘫,結(jié)果婚禮上媒熊,老公的妹妹穿的比我還像新娘。我一直安慰自己坟比,他們只是感情好芦鳍,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著葛账,像睡著了一般柠衅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上籍琳,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天菲宴,我揣著相機與錄音,去河邊找鬼巩割。 笑死裙顽,一個胖子當(dāng)著我的面吹牛付燥,可吹牛的內(nèi)容都是我干的宣谈。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼键科,長吁一口氣:“原來是場噩夢啊……” “哼闻丑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起勋颖,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤嗦嗡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后饭玲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體侥祭,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年茄厘,在試婚紗的時候發(fā)現(xiàn)自己被綠了矮冬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡次哈,死狀恐怖胎署,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情窑滞,我是刑警寧澤琼牧,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布恢筝,位于F島的核電站,受9級特大地震影響巨坊,放射性物質(zhì)發(fā)生泄漏撬槽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一趾撵、第九天 我趴在偏房一處隱蔽的房頂上張望恢氯。 院中可真熱鬧,春花似錦鼓寺、人聲如沸勋拟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽敢靡。三九已至,卻和暖如春苦银,著一層夾襖步出監(jiān)牢的瞬間啸胧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工幔虏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留纺念,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓想括,卻偏偏與公主長得像陷谱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子瑟蜈,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容