iOS10本地通知 一.發送一個簡單的本地通知php 1.註冊通知git
- 須要導入頭文件或者框架
UserNotifications
- 在iOS8.0以後,若是想要用戶接收通知須要主動請求受權,爲了能讓該代碼必定被執行,通常寫在Appdelegate中
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
-
// 1.獲取通知中心
let center = UNUserNotificationCenter.current()
-
// 2.註冊通知(會彈框請求用戶受權)
-
// 若是有錯誤則直接返回
if error != nil {
return
}
-
// 受權成功則爲true
if granted {
print("用戶贊成通知")
} else {
print("用戶拒絕通知")
}
-
}
2.發送通知(點擊控制器View的時候發送通知)api
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
-
// 建立通知標識(用於標識哪個通知)
let identifier = "SimpleNotificationIdentifier"
-
// 建立通知中的內容
let content = UNMutableNotificationContent()
// 設置內容
content.body = "我是內容"
-
// 設置通知發送的時間
// 注意:重複時間必須大於60秒
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 3, repeats: false)
-
// 建立請求對象
let request = UNNotificationRequest(identifier: identifier, content: content, trigger: trigger)
// 獲取通知中心
let center = UNUserNotificationCenter.current()
-
// 添加本地通知
center.add(request, withCompletionHandler: {(error: Error?) in
-
if error == nil {
print("本地通知添加成功")
}
})
}
3.展現效果服務器
- 前臺沒有彈框
- 後臺/退出應用/通知中心/鎖屏都可以接收到彈框
二.發送一個帶附件的通知閉包
- 在iOS10以後發送通知的時候能夠附帶一些內容
- 內容包含圖片、GIF圖片、視頻以及音頻(格式最好是caf,不然沒有效果)
/* 設置其餘內容 */
// 應用文字
content.badge = 10
-
// 設置通知的聲音
content.sound = UNNotificationSound(named: "win.aac")
-
// 設置標題
content.title = "我是標題"
-
// 設置子標題
content.subtitle = "我是子標題"
-
// 設置附件內容
// 附件標識
let attachmentIdentifier = "ImageAttachmentIdentifier"
// 附件URL
if let url = Bundle.main.url(forResource: "70s Electric Piano 52.caf", withExtension: nil) {
do {
let attachment = try UNNotificationAttachment(identifier: attachmentIdentifier, url: url, options: nil)
content.attachments = [attachment]
print("---")
} catch {
print(error)
}
}
圖片 app Gif 框架 音頻 ide 視頻 ui 三.對通知的操做url
- 當一個通知添加成功以後,能夠對添加成功的通知作一些操做,分別爲:
- 查看即將發送的通知
- 取消即將發送的通知
- 查看已經發送的通知
- 取消已經發送的通知
/// 查看即將發送的通知
@IBAction func showUnsendNotification() {
UNUserNotificationCenter.current().getPendingNotificationRequests { (request: [UNNotificationRequest]) in
print("即將發送的通知:\(request)")
}
}
-
/// 刪除即將發送的通知
@IBAction func removeUnsendNotification() {
-
// 經過標識刪除某一個通知
// UNUserNotificationCenter.current().removePendingNotificationRequests(withIdentifiers: <#T##[String]#>)
-
// 刪除全部
UNUserNotificationCenter.current().removeAllPendingNotificationRequests()
}
-
/// 查看發送成功的通知
@IBAction func showSendedNotification() {
UNUserNotificationCenter.current().getDeliveredNotifications { (notification: [UNNotification]) in
print("查看發送成功的通知:\(notification)")
}
}
-
/// 刪除發送成功的通知
@IBAction func removeSendedNotification() {
-
// 經過標識刪除某一個發送成功的通知
// UNUserNotificationCenter.current().removeDeliveredNotifications(withIdentifiers: <#T##[String]#>)
-
// 刪除全部發送成功的通知
UNUserNotificationCenter.current().removeAllDeliveredNotifications()
-
}
四.監聽通知的點擊
- 當用戶點擊通知進入App後,監聽用戶通知行爲
- 須要設置通知的代理,當用戶點擊了通知後,會經過代理告訴咱們
設置代理
UNUserNotificationCenter.current().delegate = self
遵照協議並實現代理方法
extension ViewController: UNUserNotificationCenterDelegate {
-
/// 當接收到通知的時候會來到該方法
///
/// - Parameters:
/// - center: 通知中心
/// - response: 響應
/// - completionHandler: 成功回調
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
print("接收到通知\(response)")
completionHandler()
}
-
-
/// 當一個通知發送成功後會來到該方法
///
/// - Parameters:
/// - center: 通知中心
/// - notification: 發送的通知
/// - completionHandler: 回調閉包,能夠設置在前臺收到通知橫幅
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
print("發送通知成功\(notification)")
-
// 在前臺也能接收到通知
completionHandler([.alert,.badge,.sound])
-
}
}
五.通知的觸發條件
- iOS10與以前的通知的觸發條件一共有三種
- 多少時間以後發送通知
- 指定日期發送通知
- 觸發區域發送通知
- 在iOS10以後,觸發條件的類爲
UNNotificationTrigger
- 而具體設置須要使用到它的子類
- UNTimeIntervalNotificationTrigger : 多少時間以後
- UNCalendarNotificationTrigger : 指定日期
- UNLocationNotificationTrigger : 指定區域
1.多少時間以後發送通知 注意: 若是須要重複,那麼時間必須大於60秒
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 3, repeats: false)
2.指定日期發送通知 能夠經過添加年月日時,來固定一個時間發送通知
// 建立時間組件
var components = DateComponents()
// 設置爲日曆時間
components.calendar = Calendar(identifier: .gregorian)
// 天天的早上10點10分發送通知
components.hour = 10
components.minute = 10
print(components.date)
let trigger = UNCalendarNotificationTrigger(dateMatching: components, repeats: true)
3.指定區域發送通知 注意:在使用模擬器調試的過程當中,可能會沒法顯示,重置模擬器,或者換個模擬器則會解決該問題
// 1.請求受權(iOS8.0以後獲取用戶的位置要主動請求受權,注意在info.plist中配置對應的key)
lazy var locationM: CLLocationManager = {
let locationM = CLLocationManager()
locationM.requestAlwaysAuthorization()
return locationM
}()
-
// 2.建立區域觸發器
let region = CLCircularRegion(center: CLLocationCoordinate2D(latitude: 12.123, longitude: 123.456), radius: 1000, identifier: "RegionNotification")
locationM.startMonitoring(for: region)
let trigger = UNLocationNotificationTrigger(region: region, repeats: true)
六.額外操做項 1.設置通知的額外信息
// 1.設置額外信息
content.userInfo = ["name": "張三", "age": 18]
-
// 2.在接收到通知後,能夠獲取到額外信息
-
/// 當接收到通知的時候會來到該方法
///
/// - Parameters:
/// - center: 通知中心
/// - response: 響應
/// - completionHandler: 成功回調
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
print("接收到通知獲取額外信息\(response.notification.request.content.userInfo)")
completionHandler()
}
// 打印爲:接收到通知獲取額外信息[AnyHashable("name"): 張三, AnyHashable("age"): 18]
2.設置額外操做項
- 步驟
- 註冊操做集合
- 註冊操做組,添加到操做集合中
- 註冊操做行爲,添加到操做組中
- 設置通知所用到的操做組
// 1.註冊操做項
// 1.建立操做項
let action1: UNNotificationAction = UNNotificationAction(identifier: "huifu", title: "回覆", options: .foreground)
let action2: UNNotificationAction = UNNotificationAction(identifier: "jujue", title: "拒絕", options: .destructive)
let actions: [UNNotificationAction] = [action1, action2]
// 建立操做組
// identifier: 操做組標識
// actions: 操做組行爲
// intentIdentifiers:暫時未發現該用途
// options: 支持的場景
-
let categoryIdentifier = "category1"
let category: UNNotificationCategory = UNNotificationCategory(identifier: categoryIdentifier, actions: actions, intentIdentifiers: [], options: .customDismissAction)
// 註冊操做集合(其中設置操做組)
let categories: Set<UNNotificationCategory> = [category]
center.setNotificationCategories(categories)
-
// 設置該通知用到的額外操做組
content.categoryIdentifier = "category1"
- 展現效果
- 點擊
回覆 打開app
- 點擊
拒絕 則不會打開app
- 二者都會調用接收通知的代理方法
*
七.設置快捷回覆
- 操做行爲有2個類來實現’UNNotificationAction’以及
UNTextInputNotificationAction
- 其中
UNTextInputNotificationAction 是’UNNotificationAction’的子類,用於實現快捷回覆
-
// 1.建立操做項
let action1: UNNotificationAction = UNNotificationAction(identifier: "huifu", title: "回覆", options: .foreground)
let action2: UNNotificationAction = UNNotificationAction(identifier: "jujue", title: "拒絕", options: .destructive)
-
let action3 = UNTextInputNotificationAction(identifier: "kuaijie", title: "快捷回覆", options: .foreground, textInputButtonTitle: "回覆按鈕", textInputPlaceholder: "佔位字符")
let actions: [UNNotificationAction] = [action1, action2,action3]
-
// 建立操做組
// identifier: 操做組標識
// actions: 操做組行爲
// intentIdentifiers:暫時未發現該用途
// options: 支持的場景
-
let categoryIdentifier = "category1"
let category: UNNotificationCategory = UNNotificationCategory(identifier: categoryIdentifier, actions: actions, intentIdentifiers: [], options: .customDismissAction)
// 註冊操做集合(其中設置操做組)
let categories: Set<UNNotificationCategory> = [category]
center.setNotificationCategories(categories)
- 展現效果
八.通知觸發的場景
- 在實際開發中,前臺獲取通知與後臺獲取通知所要執行的邏輯不一致,那麼就有必要去判斷一下,當前的通知觸發的場景
- 步驟
- 在獲取到通知的代理方法中獲取該應用的狀態
- 判斷當前狀態
/// 當接收到通知的時候會來到該方法
///
/// - Parameters:
/// - center: 通知中心
/// - response: 響應
/// - completionHandler: 成功回調
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
-
if let response = response as? UNTextInputNotificationResponse {
print(response.userText)
-
} else {
print("接收到通知獲取額外信息\(response.notification.request.content.userInfo)")
-
}
-
let status = UIApplication.shared.applicationState
-
switch status {
case .active:
print("在前臺")
case .inactive:
print("進入前臺")
default:
print("在後臺")
}
-
completionHandler()
}
iOS10遠程推送通知 一.獲取DeviceToken
- 此處省略配置
真機調試證書 、通知調試證書 以及通知生產證書 步驟
- 必須保證
BundleId 與在開發者中心的AppId 一致
- 必須使用真機
1.註冊通知
- 須要導入頭文件或者框架
UserNotifications
- 在iOS8.0以後,若是想要用戶接收通知須要主動請求受權,爲了能讓該代碼必定被執行,通常寫在Appdelegate中
// 1.獲取通知中心
let center = UNUserNotificationCenter.current()
-
// 2.註冊通知
center.requestAuthorization(options: [.alert,.carPlay,.badge,.sound], completionHandler: {(granted: Bool, error: Error?) in
if error != nil {
return
}
-
if granted {
print("用戶容許通知")
} else {
print("用戶拒絕通知")
}
})
2.向蘋果服務器申請DeviceToken
-
// 3.獲取deviceToken
application.registerForRemoteNotifications()
- 從代理中獲取deviceToken
- 此處Data打印的是32types,轉爲NSData便可
/// 當獲取到deviceToken會來到該方法
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
print(NSData(data: deviceToken))
}
-
/// 註冊失敗會來到該方法
func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
print(error)
}
3.開啓遠程推送功能
- 工程->target->Capabilities->Push
- 開啓的條件
- 1.Apple Id 必須配置了遠程推送通知
- 2.權利文件(打開會自動生成該文件)
4.運行真機,獲取DeviceToken 二.發送通知
- 藉助
PushMeBaby 做爲服務器向蘋果服務器發送消息,蘋果服務器推送通知
極光推送
- 註冊應用
- 上傳通知證書.p12
- 集成Jpush SDK
1.註冊Jpush並獲取DeviceToken
-
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
-
// 註冊通知
let entity = JPUSHRegisterEntity()
entity.types = Int(JPAuthorizationOptions.alert.rawValue | JPAuthorizationOptions.badge.rawValue | JPAuthorizationOptions.sound.rawValue)
-
JPUSHService.register(forRemoteNotificationConfig: entity, delegate: self)
-
// 初始化JUSH
JPUSHService.setup(withOption: launchOptions, appKey: "b29ccf03d1e6aca9baa3c34a", channel: "App Store", apsForProduction: false)
-
return true
}
-
/// 獲取DeviceToken
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
JPUSHService.registerDeviceToken(deviceToken)
}
-
/// 註冊失敗
func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
print(error)
}
2.設置代理,處理通知
extension AppDelegate : JPUSHRegisterDelegate {
-
/// 獲取通知
func jpushNotificationCenter(_ center: UNUserNotificationCenter!, didReceive response: UNNotificationResponse!, withCompletionHandler completionHandler: (() -> Void)!) {
-
}
-
/// 可設置在前臺獲取通知
func jpushNotificationCenter(_ center: UNUserNotificationCenter!, willPresent notification: UNNotification!, withCompletionHandler completionHandler: ((Int) -> Void)!) {
-
-
let userInfo = notification.request.content.userInfo
-
let isPushTrigger = notification.request.trigger?.isKind(of: UNPushNotificationTrigger.self) ?? false
-
if isPushTrigger {
JPUSHService.handleRemoteNotification(userInfo)
-
}
-
let value = Int(UNNotificationPresentationOptions.alert.rawValue | UNNotificationPresentationOptions.sound.rawValue | UNNotificationPresentationOptions.badge.rawValue)
-
completionHandler(value)
// 須要執行這個方法,選擇是否提醒用戶,有Badge、Sound、Alert三種類型能夠選擇設置
}
}
//原文:http://bbs.520it.com/forum.php?mod=viewthread&tid=3020 |