iOS10 推送extension之 Service Extension你玩過了嗎押搪?

看之前如果你對iOS10 的推送還處于一片空白窖梁,建議先看
iOS 10 推送你玩過了嗎瞪慧?


Notification Extension
iOS10 添加了很多的Extension,與通知相關(guān)的 extension 有兩個:Service ExtensionContent Extension恐锣。
我們先來了解一下Service Extension茅主,這個東西主要是干啥的呢?
主要是侥蒙,讓我們在收到遠(yuǎn)程推送的時候<注意哈暗膜,必須是遠(yuǎn)程推送>,展示之前對通知進(jìn)行修改鞭衩,因為我們收到遠(yuǎn)程推送之前會先去執(zhí)行Service Extension中的代碼学搜。這樣就可以在收到遠(yuǎn)程推送展示之前為所欲為了娃善。
用一張圖來表示下這種流程:

Paste_Image.png

Service Extension能干啥?
舉個栗子:
<1>瑞佩、通過遠(yuǎn)程推送聚磺,推送的內(nèi)容的title="1",我可以在收到推送將要顯示之前將標(biāo)題修改成title="2",那么推送條展示的title就是2炬丸。
<2>瘫寝、第一點(diǎn)也就是舉個栗子,一般不會有這種需求稠炬,既然能修改內(nèi)容焕阿,那么可以在發(fā)送推送的時候發(fā)送一段用公鑰加密的內(nèi)容,然后設(shè)備收到推送之后首启,用私鑰進(jìn)行解密然后再去展示暮屡。有啥好處呢,這么折騰毅桃。有很多的推送用的是三方的<極光推送褒纲,友盟推送,百度推送等等>钥飞。這樣你推送的東西莺掠,就不會讓三方看到了。如果是金融之類的读宙,要更注意保密吧彻秆。
<3>、當(dāng)遠(yuǎn)程推送需要展示多媒體的時候论悴,也需要在這下載掖棉,下載完畢之后墓律,獲取本地下載文件路徑再進(jìn)行展示膀估。對下載附件多媒體得需要Service Extension這玩意兒。

介紹完畢耻讽,開始玩一下察纯。
1、創(chuàng)建一個Service Extension

Paste_Image.png

Paste_Image.png

Paste_Image.png

Paste_Image.png

創(chuàng)建完畢之后看一下項目的變化
Paste_Image.png

Paste_Image.png

Paste_Image.png

大概這幾個比較明顯的地方
創(chuàng)建完畢针肥,看一下里面的相關(guān)的方法
方法override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void)

Paste_Image.png

大概理解下:
收到一個遠(yuǎn)程推送的時候就會調(diào)用這個方法饼记,你有30秒的時間來修改接收到的推送的內(nèi)容<你可以去修改通知的內(nèi)容,你也可以去下載推送的附件>慰枕,如果超過30秒了具则,你沒有做任何的處理,系統(tǒng)就會自動的調(diào)用override func serviceExtensionTimeWillExpire(),如果你還不做出相應(yīng)的操作具帮,那么將顯示最開始的通知的內(nèi)容博肋。

怎么進(jìn)行測試呢低斋?
第一步,選擇要測試的target匪凡,然后 run

Paste_Image.png

第二步膊畴,選擇自己的app


Paste_Image.png

第三步,來個小小的斷點(diǎn)


Paste_Image.png

第四步病游,發(fā)個遠(yuǎn)程推送唇跨,本地推送自己可以嘗試,是沒反應(yīng)的衬衬。

2买猖、玩一把

{
  "aps":{
    "alert":{
      "title":"iOS 10 title",
      "subtitle":"iOS 10 subtitle",
      "body":"iOS 10 body"
    },
    "category":"saySomethingCategory",
    "sound":"default",
    "badge":3
  }
}

推送收到了,但是沒有走斷點(diǎn)滋尉。
原因是推送的內(nèi)容中缺少一個字段

Paste_Image.png

mutable-content 表示我們會在接收到通知時對內(nèi)容進(jìn)行更改政勃。

{
  "aps":{
    "alert":{
      "title":"iOS 10 title",
      "subtitle":"iOS 10 subtitle",
      "body":"iOS 10 body"
    },
     "mutable-content":1,
    "category":"saySomethingCategory",
    "sound":"default",
    "badge":3
  }
}

添加上之后再玩一把,在展示推送之前進(jìn)行走斷點(diǎn)了兼砖。
放過斷點(diǎn)奸远,我們發(fā)現(xiàn)標(biāo)題已經(jīng)被更改了。


Paste_Image.png

Paste_Image.png

3讽挟、嘗試更改其他的內(nèi)容

 override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
        self.contentHandler = contentHandler
        bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
        
        if let bestAttemptContent = bestAttemptContent {
            // Modify the notification content here...
            bestAttemptContent.title = "\(bestAttemptContent.title) [modified]"
            bestAttemptContent.body = "我是新修改的body"
            bestAttemptContent.title = "我是新修改的title"
            bestAttemptContent.subtitle = "我是subTitle"
            
            contentHandler(bestAttemptContent)
        }
    }
    
Paste_Image.png

更改推送內(nèi)容懒叛,有沒有這種需求呢?
我感覺有耽梅,比如你是一家金融公司薛窥,你給用戶單獨(dú)推送的東西不想讓別人抓包或者其他的方式看到,那么你可以在推送的時候進(jìn)行加密眼姐,然后到了客戶端之后再進(jìn)行解密诅迷。這樣做的話就比較安全一些。

4众旗、展示遠(yuǎn)程推送過來的圖片
先說一下思路罢杉,收到推送之后,判斷有相關(guān)附件的話就去下載贡歧,下載完畢存儲到沙盒中滩租,然后顯示。即時是過了30秒如果圖片沒下載下來利朵,也會顯示最開始的推送的內(nèi)容的律想。
主要代碼:

override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
        self.contentHandler = contentHandler
        bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
        
        if let bestAttemptContent = bestAttemptContent {
            // Modify the notification content here...
            bestAttemptContent.title = "\(bestAttemptContent.title) [modified]"
            bestAttemptContent.body = "我是新修改的body"
            bestAttemptContent.title = "我是新修改的title"
            bestAttemptContent.subtitle = "我是subTitle"
            
            // 獲取相關(guān)的附件,看是不是有相關(guān)的附件
            let userInfoDic = bestAttemptContent.userInfo
            let apsDic:[AnyHashable : Any] = userInfoDic["aps"] as! [AnyHashable : Any]
            if apsDic["my-attachment"] != nil{
                // 如果說存在附件的話
                loadAttachmentForUrlString(urlStr: apsDic["my-attachment"] as! String, completionHandler: { (attachment) in
                    
                    if attachment != nil{
                        // 如果說 attachment 不為空的話
                        bestAttemptContent.attachments = [attachment!,attachment!]
                    }
                    contentHandler(bestAttemptContent)
                })
                
            }else{
                // 如果說不存在附件的話
                contentHandler(bestAttemptContent)
            }

        }
    }

下載方法绍弟,下載完畢之后通過block進(jìn)行回調(diào)

// MARK:- 下載相關(guān)的附件信息
    func loadAttachmentForUrlString(urlStr:String,completionHandler:@escaping CompletionHandlerBlock) -> Void {
        
        let attachmentURL:URL = URL(string: urlStr)!
        
        // 開啟線程去下載
        DispatchQueue.global().async {
            
            let urlSession = URLSession.shared.dataTask(with: attachmentURL, completionHandler: { (data, response, error) in
                
                // 下載完畢技即,或者報錯,轉(zhuǎn)到主線程中
                DispatchQueue.main.async {
                    var attachment : UNNotificationAttachment? = nil
                    if let data = data{
                        
                        // 加工目的 url樟遣,將下載好的推送附件添加到沙盒中
                        let ext = (urlStr as NSString).pathExtension
                        let cacheURL = URL(fileURLWithPath: FileManager.default.cachesDirectory)
                        let finalUrl = cacheURL.appendingPathComponent(urlStr.md5).appendingPathExtension(ext)
                        
                        print("finalUrl ************* \(finalUrl)")
                        // 將下載好的附件寫入沙盒
                        
                        if let _ = try? data.write(to: finalUrl) {
                            // 寫入
                            attachment = try? UNNotificationAttachment(identifier: "pushAttachment", url: finalUrl, options: nil)
                            completionHandler(attachment)
                        }else{
                            completionHandler(attachment)
                        }
                        
                    }else{
                        completionHandler(attachment)
                    }
                }
            })
            
            urlSession.resume()
        }
    }
    

這里沒有去寫用SDWebImageView下載而叼,也沒有用AFNetworking等三方庫去下載郭脂,我也想啊,但是報錯澈歉。報錯信息如下


Paste_Image.png

有知道怎么解決的展鸡,跪求。
推送如下,收到推送去下載埃难,但是說下載失敗,報錯原因

 MyServiceExtension[12788:2223445] App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.

解決方案:


Paste_Image.png

終于的終于莹弊,實現(xiàn)效果:

Paste_Image.png

當(dāng)然了對于這種推送附件緩存,建議每次推送的時候清理一下涡尘,不然越來越大了忍弛。并且還發(fā)現(xiàn)在不同的target下的沙盒地址是不一樣的
Paste_Image.png

我感覺要是清理的話,可以在每次收到遠(yuǎn)程推送的時候清理一下考抄。

遠(yuǎn)程推送視頻细疚,音樂的,我木有相關(guān)的url資源川梅,木有嘗試疯兼,不過應(yīng)該差不多。

有一些小伙伴問贫途,為什么配置完畢之后回報錯吧彪,真機(jī)運(yùn)行的時候也報錯
類似這樣的

myServiceExtension has conflicting provisioning settings.
myServiceExtension is automatically signed,
 but code signing identity iPhone Developer: xxxxxxx has been manually specified. Set the code signing identity value to "iPhone Developer" 
in the build settings editor, or switch to manual signing in the project editor.’

解決的辦法參考如下:
1、選擇 Automaticlly manage signing
選擇相關(guān)的team


Paste_Image.png

2丢早、signing的相關(guān)設(shè)置
都設(shè)置成Developer,這個真機(jī)調(diào)試姨裸,打包測試,上線這里都可以不用修改怨酝。Xcode會根據(jù)你的操作自動配置相關(guān)的證書和Profile文件傀缩,前提是你的相關(guān)環(huán)境下的證書和Profile文件都是齊全的<這個應(yīng)該不是問題,不然你選擇當(dāng)前環(huán)境下的包是怎么打出來的>

image.png

最后农猬,獻(xiàn)上參考Demo地址:https://github.com/RunOfTheSnail/PushDemo001

參考資料:
http://www.cocoachina.com/ios/20160628/16833.html
https://onevcat.com/2016/08/notification/
http://www.cnblogs.com/lidongq/p/5968923.html
https://developer.apple.com/reference/usernotifications/unnotificationattachment
圖畫的不錯
http://www.reibang.com/p/2f3202b5e758
http://www.cocoachina.com/ios/20161021/17820.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赡艰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子盛险,更是在濱河造成了極大的恐慌瞄摊,老刑警劉巖勋又,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件苦掘,死亡現(xiàn)場離奇詭異,居然都是意外死亡楔壤,警方通過查閱死者的電腦和手機(jī)鹤啡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蹲嚣,“玉大人递瑰,你說我怎么就攤上這事祟牲。” “怎么了抖部?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵说贝,是天一觀的道長。 經(jīng)常有香客問我慎颗,道長乡恕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任俯萎,我火速辦了婚禮傲宜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘夫啊。我一直安慰自己函卒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布撇眯。 她就那樣靜靜地躺著报嵌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪熊榛。 梳的紋絲不亂的頭發(fā)上沪蓬,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機(jī)與錄音来候,去河邊找鬼跷叉。 笑死,一個胖子當(dāng)著我的面吹牛营搅,可吹牛的內(nèi)容都是我干的云挟。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼转质,長吁一口氣:“原來是場噩夢啊……” “哼园欣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起休蟹,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤沸枯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后赂弓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绑榴,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年盈魁,在試婚紗的時候發(fā)現(xiàn)自己被綠了翔怎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖赤套,靈堂內(nèi)的尸體忽然破棺而出飘痛,到底是詐尸還是另有隱情,我是刑警寧澤容握,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布宣脉,位于F島的核電站,受9級特大地震影響剔氏,放射性物質(zhì)發(fā)生泄漏脖旱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一介蛉、第九天 我趴在偏房一處隱蔽的房頂上張望萌庆。 院中可真熱鬧,春花似錦币旧、人聲如沸践险。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽巍虫。三九已至,卻和暖如春鳍刷,著一層夾襖步出監(jiān)牢的瞬間占遥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工输瓜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瓦胎,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓尤揣,卻偏偏與公主長得像搔啊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子北戏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

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