日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[iOS] 通知详解: iOS 10 UserNotifications -- 附加包Media Attachments

發布時間:2024/8/1 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [iOS] 通知详解: iOS 10 UserNotifications -- 附加包Media Attachments 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

通知相關系列文章
iOS10 之前通知使用介紹
[iOS] 通知詳解: UIUserNotification
iOS10 相關API
[iOS] 通知詳解:iOS 10 UserNotifications API
iOS10 本地/遠程通知
[iOS] 通知詳解: iOS 10 UserNotifications
iOS10 通知附加包
[iOS] 通知詳解: iOS 10 UserNotifications – 附加包Media Attachments
iOS10 自定義UI
[iOS] 通知詳解: iOS 10 UserNotifications – 自定義通知UI

無論是遠程通知還是本地通知,都可以添加附加包,自己根據文件URL來創建UNNotificationAttachment實例,然后添加到相應的通知請求的UNMutableNotificationContent實例中。區別是獲取附件的方式,一般本地通知的附件是放在本地的Bundle中的,只需要在創建本地通知的時候,根據附件的URL創建相應的UNNotificationAttachment即可;遠程通知,需要根據遠程的通知攜帶的URL地址,去初始化UNNotificationAttachment,接著就會通過Service Extensions服務來下載這些附件數據,在通知中進行顯示。

本地通知添加附加包

上面說了,本地通知的附加包數據是放在本地的,直接根據其文件的URL地址創建即可,下面給出一個示例:

// 創建通知內容let content = UNMutableNotificationContent()content.title = "ios 10 local push test"content.subtitle = "local push subtitle"content.body = "這是一個iOS 10 之后的本地通知測試文本,這里顯示的是消息的詳細內容,另外這是一個添加的附件圖片的通知"content.sound = .defaultcontent.userInfo = ["info": "這里的信息是傳遞給app的payload內容"]// 加載本地的一張圖片作為附件if let url = Bundle.main.url(forResource: "111", withExtension: "png") {if let attch = try? UNNotificationAttachment(identifier: "identifierAttachment", url: url, options: nil) {content.attachments = [attch]}}// 創建觸發方式,10s后觸發let timer = UNTimeIntervalNotificationTrigger(timeInterval: 10, repeats: false)// 創建通知請求let req = UNNotificationRequest(identifier: "reqid", content: content, trigger: timer)// 添加請求到通知中心UNUserNotificationCenter.current().add(req) { (error) inprint(error)print("prepare for local push")}

通知執行后,在鎖屏狀態通知中心顯示為:

彈框的顯示效果

彈框下拉后會顯示一個大圖

也可以加載一段音樂,例如加載一首歌,只需要把上面的加載附件的部分代碼修改為:

// 加載本地的一張圖片作為附件if let url = Bundle.main.url(forResource: "music", withExtension: "mp3") {if let attch = try? UNNotificationAttachment(identifier: "identifierAttachment", url: url, options: nil) {content.attachments = [attch]}}

彈框下拉后如下圖效果:

可以看到,這里可以直接播放,視頻的加載方式類似,只要不超過大小限制即可!

遠程通知攜帶附加包

遠程通知的附件數據是存放在服務端的,所以我們發送的Payload需要添加mutable-content字段,并設置其值為1 ,告訴系統此通知是可變的,然后再通過Service Extensions服務來下載對應的數據創建attachments,添加到相應的通知里面,顯示在通知里。
Payload 模板:

{ "aps":{"alert":{"title":"iOS10遠程推送標題","subtitle" : "iOS10 遠程推送副標題","body":"這是在iOS10以上版本的推送內容,并且攜帶來一個圖片附件"},"badge":1,"mutable-content":1,"sound":"default","image":"http://pic29.nipic.com/20130511/9252150_174018365301_2.jpg"} }

添加 Service Extension 服務

首先,添加一個擴展服務Target
選擇:導航欄 File -> New -> Target

在彈出的頁面中選擇Notification Service Extension,下一步,起一個名稱,完成即可!可以看到,項目中多了一個Target,以及幾個相關的文件:

我需要在生成的NotificationService文件里處理我們發送的通知,添加相應的附件,可以看到NotificationService是繼承自UNNotificationContentExtension的,并重寫了他的兩個方法,定義了兩個屬性:

import UserNotificationsclass NotificationService: UNNotificationServiceExtension {var contentHandler: ((UNNotificationContent) -> Void)?var bestAttemptContent: UNMutableNotificationContent?override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {self.contentHandler = contentHandlerbestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)if let bestAttemptContent = bestAttemptContent {// Modify the notification content here...bestAttemptContent.title = "\(bestAttemptContent.title) [modified]"contentHandler(bestAttemptContent)}}override func serviceExtensionTimeWillExpire() {// Called just before the extension will be terminated by the system.// Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent {contentHandler(bestAttemptContent)}}

如果我們什么都不更改,使用上面的Payload模版發送一個遠程通知試試,會發現我們設置的標題后面多了個**[modified]**,這是因為修改了標題。可見,通知調用了這個方法,但是,當我們在這個文件內添加打印log的print,或者斷點,log信息并沒有輸出,斷點也沒有停,雖然這個方法確實是被系統調用了,這給我們的調試帶來了一些不方便。

我們主要是在didReceive方法里添加相應的處理:下載附件的數據,保存到本地,然后根據本地的文件URL創建UNNotificationAttachment實例對象,添加到通知里,并回調給系統。

以攜帶一張圖為例:

if let bestAttemptContent = bestAttemptContent {// Modify the notification content here...bestAttemptContent.title = "\(bestAttemptContent.title) [modified]"print(bestAttemptContent.userInfo)// 1. 獲取payload內容// 此處的 userInfo 即我們發送的Payload內容if let aps = bestAttemptContent.userInfo["aps"] as? [String: Any] {// 2. 獲取到payload內的圖片地址if let imagePath = aps["image"] as? String {// bestAttemptContent.body = "\(bestAttemptContent.body) +imagePath \(imagePath)"if let url = URL(string: imagePath) {// bestAttemptContent.body = "\(bestAttemptContent.body) +url \(url)"// 3. 根據URL地址獲取圖片數據if let data = try? Data.init(contentsOf: url) {let path = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).first// 4. 創建本地文件地址,最好在payload中添加一個文件名稱,或者文件格式,在這里使用文件原名稱/格式進行存儲;這里直接寫死let fileUrl = URL.init(fileURLWithPath: path! + "/image.jpg")// bestAttemptContent.body = "\(bestAttemptContent.body) +file \(fileUrl)"// 5. 保存圖片數據到本地try? data.write(to: fileUrl)// 6. 根據本地URL地址創建UNNotificationAttachmentif let att = try? UNNotificationAttachment(identifier: "imageattac", url: fileUrl, options: nil) {bestAttemptContent.attachments = [att]}} /* if let data = end*/} /* if let url = end*/}/* if ler imagePath = end*/}/* if let aps = end*/// 7. 回調contentHandler(bestAttemptContent)}

實例代碼中的1.–7.是相關需要操作的步驟,還有注釋掉的bestAttemptContent.body = 部分代碼,因為無法打印log,為了能看到相關的信息,我就把這些信息添加到body里面,然后顯示在通知里了。

這時,再去發送一個通知:
在鎖屏頁面,或者彈框,是這樣的

點擊查看,或者下拉彈框,會顯示大圖

如果是其他的文件,例如視頻、音頻文件,都可以按此步驟來操作,下載的方式可以使用自己項目中使用的網絡框架進行。需要注意的是,此處下載的時間只有30s,所以附件一定要控制大小,如果在此時間內沒有下載完成,或者下載失敗,將會以原通知的內容進行推送,不含有附件。

PS: 這里需要注意,使用到這個功能的時候,一定要有訪問網絡的權限,也就是要在彈出那個網絡權限的選擇框之后。我在寫demo的時候,因為沒有用到網絡,在此之前沒有申請網絡的授權訪問,所以一直沒有出現圖片!

總結

以上是生活随笔為你收集整理的[iOS] 通知详解: iOS 10 UserNotifications -- 附加包Media Attachments的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲淫片 | 精品福利一区二区三区 | 在线免费成人 | 国产成人a人亚洲精品无码 在线aa | 少妇太紧太爽又黄又硬又爽小说 | 中文字幕日日夜夜 | 欧美一级黄 | 中国精品毛片 | 亚洲国产色图 | 污污的视频在线观看 | 91网页版 | 91精品久久久久久久久中文字幕 | 亚洲男人天堂 | 日本国产中文字幕 | 欧美三级欧美成人高清 | 欧美综合自拍 | 在线能看的av | 青青草狠狠操 | 最新国产黄色网址 | 波多野在线观看 | 99夜色| 欧美日韩综合视频 | av日韩一区二区三区 | 按摩害羞主妇中文字幕 | 黄在线免费观看 | 日韩精品人妻一区二区三区免费 | 国产三级午夜理伦三级 | 不卡的在线视频 | 夜夜高潮夜夜爽国产伦精品 | 久久午夜片 | 欧美三极片 | 亚洲男女视频在线观看 | 精品国产一二三区 | 午夜精品久久久久久久蜜桃 | 特级做a爰片毛片免费69 | 91青青青| 欧美老女人性生活视频 | 岛国av毛片 | 中国第一毛片 | 中文字幕日韩一区二区三区 | 狠狠gao| 波多野结衣av一区二区全免费观看 | 在线观看亚洲精品视频 | 亚洲人成电影在线 | 女性向片在线观看 | 18岁成年人网站 | 国产精品成人在线观看 | 国产精品jizz在线观看无码 | 国产在线日韩 | 久久精品国产亚洲AV高清综合 | 精品久久久久成人码免费动漫 | 樱桃成人精品视频在线播放 | 中文字幕色图 | 无码人妻精品一区二区三区99不卡 | 黑人巨茎大战欧美白妇 | 国产精品久久久久久久一区二区 | 狠狠干in| 久久99精品视频 | 国产精品久久777777 | 美女狂揉羞羞的视频 | 六月丁香色婷婷 | 狠狠做深爱婷婷久久综合一区 | 国产乱淫av片免费看 | 国产欧美三级 | 日本天堂在线视频 | 一级黄色大片免费 | a级淫片| 99re这里只有精品首页 | 欧美日韩午夜 | 欧美在线免费观看视频 | 国产三级在线看 | 日本一区二区在线不卡 | 少妇床戏av| 国产在线激情视频 | 国产视频一区二区在线播放 | 色婷婷91| 丰满人妻一区二区三区53视频 | 男人天堂v | 欧美又大又硬又粗bbbbb | 日韩一级欧美一级 | 国产欧美日韩专区 | 亚洲欧美一区二区三区四区五区 | 一级淫片免费看 | 住在隔壁的她动漫免费观看全集下载 | 456亚洲影院 | 青青青在线视频观看 | 九九热播视频 | 亚洲最大的av网站 | 国产日韩中文字幕 | 亚洲激情四射 | 蜜臀av性久久久久蜜臀aⅴ | 久久国产成人精品国产成人亚洲 | 欧美成人精品一区二区综合免费 | 爱情岛亚洲品质自拍极速福利网站 | 正在播放国产一区 | 日韩一区二区三区在线免费观看 | 69国产精品视频免费观看 | 亚洲一区网 | 国产精品免费一区 |