iOS 10 推送Notification新特性

前言
在今年6月14號蘋果WWDC開發(fā)者大會上郊丛,蘋果帶來了新的iOS系統(tǒng)——iOS 10蜂厅。蘋果為iOS 10帶來了十大項更新蝇摸。蘋果高級副總裁Craig Federighi稱此次對iOS的更新是“蘋果史上最大的iOS更新”宿刮。

1467010311344431.jpg

新的屏幕通知查看方式:蘋果為iOS 10帶來了全新的通知查看功能是辕,即抬起iPhone的屏幕眉反,用戶就能看到目前的通知和更新情況昙啄。

蘋果將Siri開放給第三方開發(fā)者: 現(xiàn)在用戶可以讓Siri實現(xiàn)更多的功能,例如讓Siri向自己的聯(lián)系人發(fā)送微信信息等寸五。目前Siri可以直接支持的應(yīng)用有微信梳凛、WhatsApp以及Uber、滴滴梳杏、Skype等韧拒。

Siri將會更加智能:Siri將擁有更多對語境的意識∈裕基于用戶的地點(diǎn)叛溢、日歷、聯(lián)系人劲适、聯(lián)系地址等楷掉,Siri會做出智能建議。Siri將越來越成為一個人工智能機(jī)器人霞势,具備深度學(xué)習(xí)功能烹植。

照片應(yīng)用更新:基于深度學(xué)習(xí)技術(shù),iOS 10對照片應(yīng)用有比較大的更新愕贡。iOS 10對照片的搜索能力進(jìn)一步增強(qiáng)草雕,可以檢測到新的人物和景色。未來的iPhone能夠?qū)⑾嚓P(guān)的照片組織在一起固以,比如某次旅行的照片促绵、某個周末的照片,并且能夠進(jìn)行自動編輯嘴纺。iOS 10照片還新增了一個“記憶”標(biāo)簽败晴。

蘋果地圖:有點(diǎn)類似Siri和照片的更新,蘋果地圖也增加了很多預(yù)測功能栽渴,例如蘋果地圖能夠?qū)⑻峁└浇牟蛷d建議尖坤。蘋果地圖的界面也得到了重新設(shè)計,更加的簡潔闲擦,并增加了交通實時信息慢味。新的蘋果地圖還將整合在蘋果CarPlay中场梆,將為用戶提供turn-by-turn導(dǎo)航功能。和Siri一樣纯路,地圖也將開放給開發(fā)者或油。

蘋果音樂:蘋果音樂的界面得到了更新,界面會更加簡潔驰唬、支持多任務(wù)顶岸,增加最近播放列表。蘋果音樂現(xiàn)在已經(jīng)有1500萬付費(fèi)用戶叫编。

HomeKit:iOS 10新增智能家庭應(yīng)用辖佣,支持一鍵場景模式,HomeKit可以與Siri相連接搓逾。

1467010742980067.jpg

蘋果電話:蘋果更新了電話功能卷谈,來電時可以區(qū)別出騷擾電話。

1467010894357337.jpg

iMesseage:在iMessage方面霞篡,用戶可以直接在文本框內(nèi)發(fā)送視頻世蔗、鏈接,分享實時照片朗兵。另外污淋,蘋果還增添了表情預(yù)測功能,打出的文字若和表情相符矛市,將會直接推薦相關(guān)表情芙沥。

以下是我關(guān)于關(guān)于iOS 10中變化比較大的推送通知的學(xué)習(xí)筆記诲祸。
目錄
1.Notification User Interface
2.Media Attachments
3.Customize user interface
4.Customize Actions
一. Notification User Interface
讓我們先來看看用戶推送在iOS X中的樣子浊吏,如下圖:

1467011160771897.jpg

上圖這是在鎖屏界面下的推送。支持抬起手機(jī)喚醒功能救氯。
1467011213392479.jpg

上圖是Banner找田,可以看到這個推送更加的易讀,并且包含更多的內(nèi)容着憨。
[圖片上傳中墩衙。。甲抖。(6)]
上圖是通知中心漆改。從上面三種圖可以看到,它們都長一個樣准谚。
1467011251463529.jpg

在iOS 8 中,我們可以給推送增加用戶操作柱衔,這樣使推送更加具有交互性樊破,并且允許用戶去處理用戶推送更加的迅速愉棱。到了iOS 9 中顺少,蘋果又再次增加了快速回復(fù)功能簇爆,進(jìn)一步的提高了通知的響應(yīng)性话浇。開發(fā)者可以允許用戶通過點(diǎn)擊推送捶箱,并用文字進(jìn)行回復(fù)。再就到了iOS 10 中动漾,推送變得更加給力丁屎。因為在iOS X中,推送對iOS系統(tǒng)來說旱眯,是很重要的一部分晨川。在日常使用中,我們會經(jīng)常和推送打交道删豺。推送是我們和設(shè)備進(jìn)行互動非常重要的方式共虑。
在iOS X 中,你可以按壓推送呀页,推送就會被展開妈拌,展示出更加詳細(xì)的用戶界面。展示出來的詳細(xì)界面對用戶來說蓬蝶,提供了更加有用的信息尘分。用戶可以通過點(diǎn)擊下面的按鈕,來處理一些事件丸氛,并且推送的詳細(xì)界面也會跟著用戶的操作進(jìn)行更新UI界面培愁。
1467012541300441.jpg

iOS 8 中iMessage支持了快速回復(fù)功能,但是你只能看見一條信息缓窜,并且你也只能回復(fù)一條信息定续。但是在iOS X中,你可以展開推送禾锤,這個時候你就可以看到整個對話的內(nèi)容了私股。你可以等待你的朋友回復(fù),你再回復(fù)他时肿,并且可以回復(fù)很多條庇茫。
以上就是iOS X的強(qiáng)大功能港粱。以上的所有功能都能通過iOS X的新API來實現(xiàn)螃成。所有的新特性都能在我們開發(fā)者開發(fā)的app里面有所體現(xiàn)。
二. Media Attachments
1467012570942124.jpg

如果經(jīng)常使用iMessage的朋友們查坪,就會經(jīng)常收到一些信息寸宏,附帶了一些照片或者視頻,所以推送中能附帶這些多媒體是非常重要的偿曙。如果推送中包含了這些多媒體信息氮凝,可以使用戶不用打開app,不用下載就可以快速瀏覽到內(nèi)容望忆。眾所周知罩阵,推送通知中帶了push payload竿秆,及時去年蘋果已經(jīng)把payload的size提升到了4k bites,但是這么小的容量也無法使用戶能發(fā)送一張高清的圖片稿壁,甚至把這張圖的縮略圖包含在推送通知里面幽钢,也不一定放的下去。在iOS X中傅是,我們可以使用新特性來解決這個問題匪燕。我們可以通過新的service extensions來解決這個問題。
為了能去下載service extension 里面的attachment喧笔,我們必須去按照如下的要求去設(shè)置你的推送通知帽驯,使你的推送通知是動態(tài)可變的。
{
aps: {
alert : {……}
mutable-content : 1
}

my-attachment : https:
//example.com/phtos.jpg"

}

在上面代碼中书闸,可以看到加載了一個mutable-content 的flag尼变,然后我們就可以引用一個鏈接,把你想加入到推送里面的attachments加入到里面來浆劲。在上面的例子里面享甸,我們就加入了一個URL。更復(fù)雜的梳侨,你甚至可以去加入一個identifier來標(biāo)示你想加入到推送里面的內(nèi)容蛉威,這個identifier是你app知道的,app能通過拿到identifier走哺,然后知道去你自己的服務(wù)器哪里去下載內(nèi)容蚯嫌。


1467012616388318.jpg

通過設(shè)置完上述的部分,推送就被推送到了每個設(shè)備的Service Extension那里了丙躏。在每個設(shè)備里面的Service Extension里面择示,就可以下載任意想要的attachment了。然后推送就會帶著下載好的attachment推送到手機(jī)并顯示出來了晒旅。
如果來設(shè)置Service Extension呢栅盲?來看看如下的代碼:
// Adding an attachment to a user notification
public class NotificationService: UNNotificationServiceExtension {
override public func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: (UNNotificationContent) -> Void)
{
let fileURL = // ...
let attachment = UNNotificationAttachment(identifier: "image",
url: fileURL,
options: nil)
let content = request.content.mutableCopy as! UNMutableNotificationContent
content.attachments = [ attachment ]
contentHandler(content)
}
}
首先定義了一個didReceive的方法,用來接收request废恋,后面跟著withContentHandler的回調(diào)函數(shù)谈秫。
這個NotificationServiceExtension會在收到推送之后,被調(diào)用鱼鼓,然后在這個方法里面去下載自己的attachment拟烫。下載可以通過URL,或者任何你喜歡的方式迄本。當(dāng)下載完成之后硕淑,就可以創(chuàng)建attachment對象了。創(chuàng)建完UNMutableNotificationContent,我們就可以把這個加入到推送的content中了置媳。最后于樟,通過contentHandler回調(diào),把它傳遞給iOS系統(tǒng)拇囊,iOS 系統(tǒng)就會展示給用戶隔披。


1467012645824290.jpg

通過以上的設(shè)置,我們就能在推送中看到豐富的媒體信息了寂拆。用戶并不需要去打開app奢米,也不用去點(diǎn)擊下載。
簡單的概述一下Media Attachments:

新特性使推送支持附帶Media Attachments纠永。本地推送和遠(yuǎn)程推送同時都可支持鬓长。

attachment支持圖片,音頻尝江,視頻涉波,系統(tǒng)會自動提供一套可自定義化的UI,專門針對這3種內(nèi)容炭序。

在service extension里面去下載attachment啤覆,但是需要注意,service extension會限制下載的時間惭聂,并且下載的文件大小也會同樣被限制窗声。這里畢竟是一個推送,而不是把所有的內(nèi)容都推送給用戶辜纲。所以你應(yīng)該去推送一些縮小比例之后的版本笨觅。比如圖片,推送里面附帶縮略圖耕腾,當(dāng)用戶打開app之后见剩,再去下載完整的高清圖。視頻就附帶視頻的關(guān)鍵幀或者開頭的幾秒扫俺,當(dāng)用戶打開app之后再去下載完整視頻苍苞。

把下載完成的attachment加入到notification中。

推送里面包含的attachment這些文件狼纬,是由系統(tǒng)幫你管理的羹呵,系統(tǒng)會把這些文件放在單獨(dú)的一個地方,然后統(tǒng)一管理畸颅。

額外說明一點(diǎn)担巩,推送的attachment的圖片還可以包含GIF圖方援。

通過以上可以看出没炒,Media Attachments非常的酷,它為我們提供了更加豐富的推送內(nèi)容。
接下來我們再來看看如何自定義推送的用戶界面
三. Customize user interface
要想創(chuàng)建一個自定義的用戶界面送火,需要用到Notification content extension拳话。
先來說說下面這個例子的應(yīng)用場景:
比如有個朋友在日歷中給我了一個聚會的邀請,這個時候就來了推送种吸,推送里面的內(nèi)容就是包含了聚會的時間地點(diǎn)信息弃衍,推送下面有三個按鈕,接受坚俗,謝絕镜盯。下面的例子都以此為例。
Notification content extension允許開發(fā)者加入自定義的界面猖败,在這個界面里面速缆,你可以繪制任何你想要的東西。但是有一個最重要的限制就是恩闻,這個自定義的界面沒有交互艺糜。它們不能接受點(diǎn)擊事件,用戶并不能點(diǎn)擊它們幢尚。但是推送通知還是可以繼續(xù)與用戶進(jìn)行交互破停,因為用戶可以使用notificaiton的actions。extension可以處理這些actions尉剩。
接下來我們就來說說如何自定義界面
1. 推送的四部分
先來看一個日歷的推送例子:

1467012706770305.jpg

上圖真慢,整個推送分4段。用戶可以通過點(diǎn)擊Header里面的icon來打開app理茎,點(diǎn)擊取消來取消顯示推送晤碘。Header的UI是系統(tǒng)提供的一套標(biāo)準(zhǔn)的UI。這套UI會提供給所有的推送通知功蜓。
Header下面是自定義內(nèi)容园爷,這里就是顯示的Notification content extension。在這里式撼,就可以顯示任何你想繪制的內(nèi)容了童社。你可以展示任何額外的有用的信息給用戶。
content extension下面就是default content著隆。這里是系統(tǒng)的界面扰楼。這里的系統(tǒng)界面就是上面推送里面payload里面附帶的內(nèi)容。這也就是iOS 9 之前的推送的樣子美浦。
最下面一段就是notification action了弦赖。在這一段,用戶可以觸發(fā)一些操作浦辨。并且這些操作還會相應(yīng)的反映到上面的自定義的推送界面content extension中蹬竖。
2.創(chuàng)建Notification content extension
接下來我們就來看看如何創(chuàng)建一個Notification content extension
1467012741461416.jpg

第一件事就是去創(chuàng)建一個新的target。創(chuàng)建好了之后,Xcode會自動幫我們生成一個template币厕。template會在新的target里面生成3個文件列另,一個新的ViewController,main Interface storyboard旦装,info.plist页衙。info.plist中就是可以定義化一些target的配置。
1467012788934009.jpg

打開Notification content extension的ViewController

// Minimal Content Extension
class NotificationViewController: UIViewController, UNNotificationContentExtension {
@IBOutlet var label: UILabel?
override func viewDidLoad() {
super.viewDidLoad()
// Do any required interface initialization here.
}
func didReceive(_ notification: UNNotification) {
label?.text = notification.request.content.body
}
}

我們會發(fā)現(xiàn)阴绢,這個ViewController是UIViewController的子類店乐,其實就是一個很普通的ViewController,和我們平時使用的沒有啥兩樣呻袭。后面是UNNotificationContentExtension的protocol响巢,這里是系統(tǒng)要求你必須實現(xiàn)的協(xié)議。
UNNotificationContentExtension只有一個required的方法棒妨,就是didReceive方法踪古。當(dāng)推送到達(dá)你的設(shè)備之后,這個didReceive方法會隨著ViewController的生命周期的方法 券腔,一起被調(diào)用伏穆。當(dāng)開發(fā)者給推送加上expands的時候,一旦推送送達(dá)以后纷纫,這時會接到所有的ViewController生命周期的方法枕扫,和didReceive方法。這樣辱魁,我們就可以接收notification object 烟瞧,接著更新UI。
3. 配置target
接下來染簇,我們需要做的是参滴,告訴iOS系統(tǒng),推送送達(dá)之后锻弓,iOS系統(tǒng)如何找到你自定義的Notification content extension砾赔。

1467012819718082.jpg

Notification content extension和我們注冊notification actions一樣,注冊的相同的category青灼。這個例子中暴心,我們使用event-invite。值得提到的一點(diǎn)是杂拨,這里的extension是可以為一個數(shù)組的专普,里面可以為多個category,這樣做的目的是多個category共用同一套UI弹沽。
1467012846191744.jpg

上圖中檀夹,event-invite 和 event-update就共用了一套UI筋粗。這樣我們就可以把他們打包到一個extension里面來。但是不同的category是獨(dú)立的击胜,他們可以相應(yīng)不同的actions亏狰。
通過以上設(shè)置役纹,iOS系統(tǒng)就知道了我們的target了偶摔。
4. 自定義用戶UI界面
接下來我們來自定義UI界面。

// Notification Content Extension
class NotificationViewController: UIViewController, UNNotificationContentExtension {
@IBOutlet var eventTitle: UILabel!
@IBOutlet var eventDate: UILabel!
@IBOutlet var eventLocation: UILabel!
@IBOutlet var eventMessage: UILabel!
func didReceive(_ notification: UNNotification) {
let content = notification.request.content
eventTitle.text = content.title
eventDate.text = content.subtitle
eventMessage.text = content.body
if let location = content.userInfo["location"] as? String {
eventLocation.text = location
}
}
}

上述代碼中促脉,我們在stroyboard 里面加入了一些labels 辰斋。當(dāng)接收到推送的時候,我們提取出內(nèi)容瘸味,得到我們想要的內(nèi)容宫仗,然后把這些內(nèi)容設(shè)置到label上面去,并展示出來旁仿。在content的userinfo里面我們還能加入一些額外的信息藕夫,這些信息是標(biāo)準(zhǔn)的payload無法展示的,比如說位置信息等等枯冈。

1467012887153413.jpg

代碼完成之后就是如上的樣子毅贮,中間就是我們自定義的UIView了。但是這樣子會有2個問題尘奏。第一個問題就是這個自定義的View實在太大了滩褥。大量的空白不需要顯示出來。第二個問題就是我們自定義的內(nèi)容和下面默認(rèn)的推送內(nèi)容重復(fù)了炫加。我們需要去掉一份瑰煎。
5.改進(jìn)
我們先來改進(jìn)上面說的第二個問題。
這個問題很簡單俗孝,其實就是一個plist的設(shè)置酒甸。我們可以在plist里面把默認(rèn)的content隱藏。設(shè)置如下圖赋铝。
1467012919982324.jpg

再來說說第一個問題烘挫,界面大小的問題。
我們可以通過平時我們Resize其他ViewController一樣柬甥,來Resize這個ViewController饮六。來看看如下的代碼。
// Notification Content Extension
class NotificationViewController: UIViewController, UNNotificationContentExtension {
override func viewDidLoad() {
super.viewDidLoad()
let size = view.bounds.size
preferredContentSize = CGSize(width: size.width, height: size.width / 2)
}
func didReceive(_ notification: UNNotification) {
// ...
}
}
這里我們也可以加入constraints來做autolayout苛蒲。
1467012951689066.jpg

解決完上面2個問題卤橄,界面就會變成這個樣子”弁猓看上去比之前好很多了窟扑。正常的尺寸喇颁,沒有多余的空白。沒有重復(fù)信息嚎货。但是這又出現(xiàn)了另外一個問題橘霎。當(dāng)通知展示出來之后,它的大小并不是正常的我們想要的尺寸殖属。iOS系統(tǒng)會去做一個動畫來Resize它的大小姐叁。如下圖,系統(tǒng)會先展現(xiàn)出第一張圖洗显,然后緊接著展示第二張圖外潜,這個用戶體驗很差。
1467012981105092.jpg

1467013016284006.jpg

會出現(xiàn)上面這張圖的原因是挠唆,在推送送達(dá)的那一刻处窥,iOS系統(tǒng)需要知道我們推送界面的最終大小。但是我們自定義的extension在系統(tǒng)打算展示推送通知的那一刻玄组,并還沒有啟動滔驾。所以這個時候,在我們代碼都還沒有跑起來之前俄讹,我們需要告訴iOS系統(tǒng)哆致,我們的View最終要展示的大小。
現(xiàn)在問題又來了颅悉。這些通知會跑在不同的設(shè)備上沽瞭,不同的設(shè)備的屏幕尺寸不同。為了解決這個問題剩瓶,我們需要設(shè)置一個content size ratio驹溃。
1467013048433045.jpg

這個屬性定義了寬和高的比例。當(dāng)然設(shè)置了這個比例以后延曙,也并不是萬能的豌鹤。因為你并不知道你會接受到多長的content。當(dāng)你僅僅只設(shè)置比例枝缔,還是不能完整的展示所有的內(nèi)容布疙。有些時候如果我們可以知道最終的尺寸,那么我們固定尺寸會更好愿卸。
6. 進(jìn)一步美化
我們可以給這個extension加上Media Attachments灵临。一旦我們加入Media Attachments,我們可以在content extension里面使用這些內(nèi)容趴荸。

// Notification Content Extension Attachments
class NotificationViewController: UIViewController, UNNotificationContentExtension {
@IBOutlet var eventImage: UIImageView!
func didReceive(_ notification: UNNotification) {
let content = notification.request.content
if let attachment = content.attachments.first {
if attachment.url.startAccessingSecurityScopedResource() {
eventImage.image = UIImage(contentsOfFile: attachment.url.path!)
attachment.url.stopAccessingSecurityScopedResource()
}
}
}
}

我們可以提取content的attachments儒溉。前文提到過,attachment是由系統(tǒng)管理的发钝,系統(tǒng)會把它們單獨(dú)的管理顿涣,這意味著它們存儲在我們sandbox之外波闹。所以這里我們要使用attachment之前,我們需要告訴iOS系統(tǒng)涛碑,我們需要使用它精堕,并且在使用完畢之后告訴系統(tǒng)我們使用完畢了。對應(yīng)上述代碼就是startAccessingSecurityScopedResource()和stopAccessingSecurityScopedResource()的操作蒲障。當(dāng)我們獲取到了attachment的使用權(quán)之后歹篓,我們就可以使用那個文件獲取我們想要的信息了。
上述例子中晌涕,我們從attachment中獲取到圖片滋捶,并展示到UIImageView中痛悯。于是notification就變成下面這個樣子了余黎。

1467013198723993.jpg

四.Customize Actions
說道這里,我們不得不說一下iOS8開始引入的action的工作原理:
默認(rèn)系統(tǒng)的Action的處理是载萌,當(dāng)用戶點(diǎn)擊的按鈕惧财,就把a(bǔ)ction傳遞給app,與此同時扭仁,推送通知會立即消失垮衷。這種做法很方便。
但是還有一種情況乖坠,當(dāng)用戶點(diǎn)擊了按鈕搀突,希望接受一些日歷上的邀請拭抬,我們需要把這個操作即時的展示在我們自定義的UI上饲帅,這是我們就只能用Notification content extension來處理這些用戶點(diǎn)擊事件了。這個時候耐薯,用戶點(diǎn)擊完按鈕顽分,我們把這個action直接傳遞給extension徐许,而不是傳遞給app。當(dāng)actions傳遞給extension時卒蘸,它可以延遲推送通知的消失時間雌隅。在這段延遲的時間之內(nèi),我們就可以處理用戶點(diǎn)擊按鈕的事件了缸沃,并且更新UI恰起,一切都處理完成之后,我們再去讓推送通知消失掉趾牧。
這里我們可以運(yùn)用UNNotificationContentExtension協(xié)議的第二個方法检盼,這方法是Optional

// Intercepting notification action response
class NotificationViewController: UIViewController, UNNotificationContentExtension {
func didReceive(_ response: UNNotificationResponse, completionHandler done: (UNNotificationContentExtensionResponseOption) -> Void) {
server.postEventResponse(response.actionIdentifier) {
if response.actionIdentifier == "accept" {
eventResponse.text = "Going!"
eventResponse.textColor = UIColor.green()
} else if response.actionIdentifier == "decline" {
eventResponse.text = "Not going :("
eventResponse.textColor = UIColor.red()
}
done(.dismiss)
}
}
}

不用這個方法的時候就可以不聲明出來。但是一旦聲明了武氓,那么你就需要在這個方法里面處理推送通知里面所有的actions梯皿。這就意味著你不能只處理一個action仇箱,而不管其他的action。
在上述代碼中东羹,當(dāng)用戶點(diǎn)擊了按鈕剂桥,這個時候我們同步一下服務(wù)器信息,當(dāng)接收到了服務(wù)器應(yīng)答之后属提,然后我們更新UI权逗。用戶點(diǎn)擊了“accept”之后,表示接受了這次聚會邀請冤议,于是我們把text的顏色變成綠色斟薇。當(dāng)用戶點(diǎn)擊了“decline”,表示謝絕恕酸,于是我們把text的顏色變成紅色堪滨。當(dāng)用戶點(diǎn)擊之后,更新完界面蕊温,我們就讓推送通知消失掉袱箱。
這里值得一提的是,如果你還想把這個action傳遞給app义矛,那么最后的參數(shù)應(yīng)該是這樣发笔。

done(.dismissAndForwardAction)

參數(shù)設(shè)置成這樣之后,用戶的action就會再傳遞給app凉翻。
如果此時用戶還想輸入寫文字來評論這條推送了讨,我們該如何做?
這個輸入文字的需求是來自于iOS 9制轰。這個的使用方法和9是相同的前计。
// Text Input Action
private func makeEventExtensionCategory() -> UNNotificationCategory {
let commentAction = UNTextInputNotificationAction(
identifier: "comment",
title: "Comment",
options: [],
textInputButtonTitle: "Send",
textInputPlaceholder: "Type here...")
return UNNotificationCategory(identifier: "event-invite", actions: [ acceptAction, declineAction, commentAction ],
}

我們可以創(chuàng)建一個UNTextInputNotificationAction,并把它設(shè)置到plist里面的Category中艇挨。當(dāng)推送通知到來之后残炮,用戶點(diǎn)擊了按鈕,textfield就會顯示出來缩滨。同樣的處理action代碼如下:
// Text input action response
class NotificationViewController: UIViewController, UNNotificationContentExtension {
func didReceive(_ response: UNNotificationResponse,
completionHandler done: (UNNotificationContentExtensionResponseOption) -> Void) {
if let textResponse = response as? UNTextInputNotificationResponse {
server.send(textResponse.userText) {
}
}
}
}

這個時候當(dāng)用戶點(diǎn)擊了評論按鈕势就,就會彈出textfield。
這里還有一個問題脉漏,就是用戶點(diǎn)完評論按鈕之后苞冯,之前的接受和謝絕的按鈕就消失了。這個時候用戶可能有這個需求侧巨,想又評論舅锄,又接受或者謝絕。那么我們就需要在下面鍵盤上加入這兩個按鈕司忱。如下圖這樣子皇忿。


1467013283104781.jpg

這里并沒有新的API畴蹭,還是用原來的API。我們可以使用已經(jīng)存在的UIKit的API去定制輸入的input accessory view鳍烁。它可以讓我們開發(fā)者加入自定義的按鈕叨襟。
// Custom input accessory view
class NotificationViewController: UIViewController, UNNotificationContentExtension {
override func canBecomeFirstResponder() -> Bool {
return true
}
override var inputAccessoryView: UIView { get {
return inputView
}
}
func didReceive(_ response: UNNotificationResponse,
completionHandler done: (UNNotificationContentExtensionResponseOption) -> Void) {
if response.actionIdentifier == "comment" {
becomeFirstResponder()
textField.becomeFirstResponder()
}
}
}

解析一下上述的代碼。首先我們需要讓ViewController BecomeFirstResponder幔荒。這里做了2件事情糊闽,一是告訴responder chain,我成為了第一響應(yīng)者爹梁,二是告訴iOS系統(tǒng)右犹,我不想使用系統(tǒng)標(biāo)準(zhǔn)的text field。接著就可以創(chuàng)建自定義化的inputAccessoryView姚垃。如上圖中顯示的念链,帶自定義的兩個按鈕。然后莉炉,當(dāng)extension接受到了用戶點(diǎn)擊按鈕后產(chǎn)生的action钓账,這時自定義的textfield就會變成第一響應(yīng)者碴犬,并且伴隨著鍵盤的彈起絮宁。
注意,這里需要2個becomeFirstResponder服协,第一個becomeFirstResponder是使viewController變成第一響應(yīng)者绍昂,這樣textfield就會出現(xiàn)。第二個becomeFirstResponder是使我們自定義的textfield變成第一響應(yīng)者偿荷,這樣鍵盤才會彈起窘游。
總結(jié)
以上就是iOS X中notification的所有新特性,通過上文跳纳,我們學(xué)到的以下的知識忍饰,總結(jié)一下:
什么是attachment

如何在service extension中使用attachment

如何定義content extension的用戶UI界面

如何響應(yīng)用戶操作action

最后,請大家多多指教寺庄。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末艾蓝,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子斗塘,更是在濱河造成了極大的恐慌赢织,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件馍盟,死亡現(xiàn)場離奇詭異于置,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)贞岭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門八毯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來搓侄,“玉大人,你說我怎么就攤上這事话速⌒莼洌” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵尿孔,是天一觀的道長俊柔。 經(jīng)常有香客問我,道長活合,這世上最難降的妖魔是什么雏婶? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮白指,結(jié)果婚禮上留晚,老公的妹妹穿的比我還像新娘。我一直安慰自己告嘲,他們只是感情好错维,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著橄唬,像睡著了一般赋焕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上仰楚,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天隆判,我揣著相機(jī)與錄音,去河邊找鬼僧界。 笑死侨嘀,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的捂襟。 我是一名探鬼主播咬腕,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼葬荷!你這毒婦竟也來了涨共?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤闯狱,失蹤者是張志新(化名)和其女友劉穎煞赢,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哄孤,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡照筑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凝危。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡波俄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蛾默,到底是詐尸還是另有隱情懦铺,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布支鸡,位于F島的核電站冬念,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏牧挣。R本人自食惡果不足惜急前,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瀑构。 院中可真熱鬧裆针,春花似錦、人聲如沸寺晌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽呻征。三九已至耘婚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間怕犁,已是汗流浹背边篮。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留奏甫,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓凌受,卻偏偏與公主長得像阵子,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子胜蛉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

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