本文轉載至 http://www.tuicool.com/articles/zIFvQn7
在iOS10中使用iMessage
2016-06-22iMessage
在iOS中新增了兩種iMessage的方式,1.內置表情包,2.iMessage應用
1.內置表情包(Sticker Packs)
可以通過在Xcode中新建Sticker Pack Application來創建。這種方式可以簡單地通過添加圖片來在iMessage中添加表情包。添加的貼紙需要滿足一下條件
- 圖片類型必須是 png、apng、gif或者jpeg
- 文件大小必須 小於500K
- 圖片大小必須在 100 100 到 206 206 之間
需要注意的是:必須要永遠提供 @3x 大小的圖片(即 300 300 到 618 618 )。系統可以根據當前設備通過 runtime 自動調整圖片來呈現 @2x 和 @1x
系統能夠自適應的展示貼紙,所以為了更好的展示貼紙,最好提供的貼紙是以下三種大小的類型
- 小型 100*100
- 中型 136*136
- 大型 206*206
添加方法也很簡單,方式直接如下圖
2.iMessage應用
iMessage app使用完整的框架和Message app進行交互。使用iMessage app能夠
- 在消息應用內呈現一個自定義的用戶交互界面。 使用MSMessagesAppViewController
- 創建一個自定義或者動態的表情包瀏覽器。使用 MSStickerBrowserViewController
- 添加文本、表情、或者媒體文件到消息應用的文本輸入框。使用 MSConversation
- 創建帶有特定的應用數據交互的消息。使用 MSMessage
- 更新可以相互影響的消息(例如,創建游戲或者可以合作的應用)。使用 MSSession
我們可以通過iMessage完成以上五種事情,下面分別來說:
-
新建一個空白應用后,會有一個MessagesViewController,繼承自MSMessagesAppViewController,這個是我們看到啊的主頁,在這里進行自定義界面的創建。
同時還有幾個方法
//當拓展從不活動進入到活動狀態時會被調用,這個會發生在呈現UI的時候。使用這個方法來配置拓展和恢復之前的狀態。 -(void)willResignActiveWithConversation:(MSConversation *)conversation //當拓展從活動進入到不活動時會被調用。這個會發生在界面消失、改變會話或者退出Message應用時。使用這個方法來釋放共有的資源、存儲用戶數據、注銷timer和存貯足夠的狀態信息來當它崩潰時可以來恢復你的拓展的狀態. -(void)didBecomeActiveWithConversation:(MSConversation *)conversation
//這個方法當接收到一個從對方發送並且是通過此拓展發送的消息時會被調用。用這個方法來觸發UI更新來相應這個消息. -(void)didReceiveMessage:(MSMessage *)message conversation:(MSConversation *)conversation //點擊發送按鈕時會被調用 -(void)didStartSendingMessage:(MSMessage *)message conversation:(MSConversation *)conversation //當用戶刪除而不發送消息時調用.使用這個方法來清理相關刪除消息狀態。 -(void)didCancelSendingMessage:(MSMessage *)message conversation:(MSConversation *)conversation
//在拓展從一個過渡到一個新的外觀狀態前會被調用.使用這個方法來為改變外觀狀態做准備 -(void)willTransitionToPresentationStyle:(MSMessagesAppPresentationStyle)presentationStyle //在拓展已經過度到新的外觀狀態后會被調用。使用這個方法來完成與外觀風格變化有關的任何行為. -(void)didTransitionToPresentationStyle:(MSMessagesAppPresentationStyle)presentationStyle
-
MSStickerBrowserViewController自帶拖動添加、長按預覽、點擊添加。使用這個類來自定義表情瀏覽器的話,可定制性會更高,她可以根據data source來動態改變數據,也可以自定義每個貼紙的大小。創建后需要實現它的兩個代理numberOfStickersInStickerBrowserView: 和 stickerBrowserView:stickerAtIndex:來返回相應的內容。
需要注意的是1.內容要是本地圖片 2.表情的大小是可以調整的,但是還是只支持是三種樣式
-
MSConversation
如果想要發送其他內容可以使用MSConversation來進行操作.
當前MessagesViewController中包含了一個當前的conversation->activeConversation
發送消息時可以通過如下方法
//文件 -insertAttachment:withAlternateFilename:completionHandler: //消息 -insertMessage:localizedChangeDescription:completionHandler: //表情 -insertSticker:completionHandler: //文本 -insetText:completionHandler:
這些方法在發送相應內容的時候進行調用,需要注意的是,這里進行的不是發送消息,而是將消息添加到文本框,用戶還需要自己點擊發送按鈕進行發送.
除了文本和貼紙外,還要說下MSMessage對象,他可以包含特有的數據、持有一個會話、讓參與者更新消息,但是這個對象的呈現需要layout屬性.
其中有一個URL屬性,這個屬性要求是一個HTTP(S)鏈接或者是一個數據URL。要是一個有效的鏈接,如果是一個網址,那么會在瀏覽器中加載。
layout屬性必須是MSMessTemplateLay,並且你不能在創建子類或者新建MSMessageLayout。消息模板包含消息擴展的圖標,圖像,視頻或音頻文件,以及一些文本元素(標題,副標題,標題,subcaption,尾隨標題和尾隨subcaption)。如下圖
需要注意的是,發送的內容必須是本地內容,而且MSMessageTempLayout的mediaFileURL屬性會在設置image屬性后被忽略.
selectedMessage
想要實現具備特殊交互的,除了發送類型是MSMessage消息外,還需要處理點擊事件.
*. 如果用戶點擊了拓展消息中的一個,這個屬性會被設置成當前消息,否則會被設置成nil。
*. 如果你的拓展因用戶點擊消息而啟動,那么這個屬性會被設置成拓展啟動時的消息。可以在 didBecomeActiveWithConversation 中監聽
*. 如果用戶在你的拓展運行時點擊消息,這個屬性的值會改變。 可以在willTransitionToPresentationStyle 中監聽
*. 頁使用KVO來監聽這個屬性來響應相應的變化. (其實說實話,這個我沒能實現)
應用的數據可以在message的url屬性來解析。
如果消息與會話關聯,你可以使用用一個會話實力一個新的消息來更新消息。使用conversation的 insertMessage:localizedChangeDescription:completionHandler: 方法來發送新消息。當用戶發送消息時,系統將其移動到底部,並更新其內容。
你還可以保存相應內容.
最后是我的demo。可能有點亂
點我跳轉