讀完這篇文章你將了解到, 在項目開發(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ì)翻開來說了, 有遇到問題的朋友歡迎在下面留言, 一起討論下.