日韩性视频-久久久蜜桃-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的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 精品欧美久久久 | 欧美日韩国产伦理 | 午夜剧场福利社 | 欧美播放 | 欧美经典一区二区 | 午夜生活片 | 91华人在线 | 午夜影院试看 | 欧美日韩专区 | 91宅男| 91成人精品 | 成人av在线播放网站 | 国产一区二 | 91网站在线免费观看 | 欧美亚洲久久 | 国产日韩欧美精品在线 | 国产精品久久久久影院色老大 | 国产在线一二 | 四虎影院免费视频 | 国产三级中文字幕 | 国产日韩成人内射视频 | 精品国产一区二区三区四区精华 | 欧美黑人一区二区 | 伊人伊网| 亚洲精品www久久久久久 | 手机看片久久 | 玖玖热在线视频 | 无码精品国产一区二区三区免费 | 日本老小玩hd老少配 | 欧美亚洲综合在线 | 成人亚洲一区二区 | 免费成人在线看 | 久久久久人妻一区二区三区 | 国产成人日韩 | 国产日本欧美一区二区 | 日本少妇色视频 | 国产精品一区久久久 | 亚洲一区二区高清 | 红桃视频一区二区三区免费 | 亚洲一区二区中文 | 欧美视频 | 岛国av一区二区 | 欧美一区二区三区啪啪 | 色屁屁视频 | a在线天堂 | 轮乱 | 香蕉尹人网 | 久久久久久91香蕉国产 | 精品视频大全 | 中文字幕18页 | 超碰人人91 | 91精品国产高潮对白 | 欧美一区二区久久久 | 日本久久久久久久久久 | 美女日批在线观看 | 国产成人+综合亚洲+天堂 | 欧美成人精品一区二区综合免费 | 国产色在线 | 日韩污污 | 香蕉视频在线免费播放 | 老熟妇精品一区二区三区 | 国产又大又粗又爽的毛片 | 精品国产午夜福利在线观看 | 亚洲高潮 | 欧美一区亚洲一区 | 美国式禁忌1980 | 国产精品videos | 久久接色 | 那个网站可以看毛片 | 中文字幕在线观看日韩 | 村姑电影在线播放免费观看 | √资源天堂中文在线视频 | 美女裸体跪姿扒开屁股无内裤 | 日本xxxxxxxxx18| 欧美日韩一级大片 | 中文字幕无码乱码人妻日韩精品 | 亚洲色视频| 青青青在线视频免费观看 | 男女草逼网站 | 四虎永久免费 | 亚洲精品美女久久久 | 香蕉久久国产av一区二区 | 九九视频国产 | av大片在线看 | 国产资源在线观看 | 日韩免费一区二区 | 人妻丝袜一区二区三区 | 男人的天堂你懂的 | 在线观看日韩国产 | 成人h视频 | 成人欧美一区二区三区黑人 | 姐姐av| 蜜臀视频在线观看 | 亚洲免费福利视频 | 免费观看黄色一级视频 | 亚洲综合在线五月 | 欧美人伦 | 亚洲成人动漫在线观看 | 九九热re |