轉自:http://www.jianshu.com/p/be79b8729bf8瀏覽器
WWDC 2016關於iMessage App的兩個視頻已經放出(iMessage Apps and Stickers, Part1 iMessage Apps and Stickers, Part2)。從iOS 10開始,消息擴展(Messages Extension)能夠獨立於宿主App(Container App)開發,而且提供了全新的消息模式,開始支持iap和Apple Pay等等。iMessage App有充足的理由讓咱們興奮,用如今流行的話來說,iMessage App將會是一個「風口」。app
本文主要是對最新的WWDC關於iMessage App視頻的翻譯和筆者的我的理解,英文好的童鞋仍是推薦看WWDC的視頻資料。閱讀本文以前,須要讀者掌握基本的iOS Extension知識,能夠參考iOS App Extension入門ide
iMessage App是一種全新的應用擴展,載體是iOS系統的Message應用,經過iMessage App,用戶能夠發送更加豐富的消息內容,享受更具交互性的會話體驗。咱們來看看它都有什麼新鮮玩意:ui
Stickersatom
Interactive Messagesspa
能夠發送圖片,音視頻,文本,連接等等翻譯
就是這貨:3d
用來幹什麼的呢?code
顯示iMessage App;視頻
爲未安裝應用的用戶提供安裝途徑(Inline App Attribution);
提供iap,Apple Pay和訪問相機功能。
iMessage App只能在iOS(10+)系統運行,iWatch和mac能夠收到消息,可是不能解析。iWatch能夠發送Stickers。
iMessage App自己是一個Extension,可是它能夠獨立開發,不依賴任何Container App。咱們也能夠在現有的項目中添加iMessage App,系統會自動將其添加到Messages App Store。
若是不想建立Container App,在Xcode 8中,直接建立一個Messages Application(File->New->Project->Application->Messages Application);在現有項目中添加iMessage App,能夠經過添加Extension的方式添加(File->New->Target->Application Extension->Messages Extension)。
Sticker是iOS 10 iMessage引入的一種新的交互方式,能夠當作消息發送,也能夠附加在已有消息上,支持PNG,APNG,GIF,JPEG的圖片格式(推薦使用PNG或APNG格式),圖片大小最大500KB。
Stickers的建立很是簡單,首先建立一個Sticker Pack Application(File->New->Project->Application->Sticker Pack Application),而後在Assets.xcassets
中添加一個Sticker Pack
,而後添加相應的資源文件便可。Sticker Pack Application不須要任何代碼,當用戶在Messages App Store中打開咱們的Messages App時,系統會自動將圖片資源顯出。系統爲Stickers提供了三種尺寸:Large,Medium,Small,咱們能夠在Sticker Pack
中進行設置
自定義Stickeryou 有以下優點:
1.自定義UI
2.能夠動態改變Sticker
3.可使用相機功能
4.支持IAP
自定義Sticker須要建立一個Messages Application。Messages Application會自動生成一個Sticker Pack和一個Messages Extension,以下圖:
若是想在已有項目中添加Sticker,只能添加一個Messages Extension,而後用自定義Sticker的方法來實現。
自定義Sticker須要咱們本身控制Sticker的顯示,因此咱們不在Assets.xcassets
中添加stickers,咱們須要修改MessagesExtension
中的MessagesViewController
。MessagesViewController
是MSMessagesAppViewController
的子類,後者是iMessage App中一個重要的組建,它的生命週期咱們會在後面介紹,在此咱們只須要知道MessagesViewController
就是iMessage App的顯示界面。
想要自定義Sticker,須要自定義MSStickerBrowserViewController
。MSStickerBrowserViewController
顧名思義,是用來顯示Sticker的,咱們將MSStickerBrowserViewController
添加到MessagesViewController
,這樣咱們的iMessage App的顯示界面就是Sticker的界面了。
在MSStickerBrowserViewController
中重寫以下兩個方法:
@protocol MSStickerBrowserViewDataSource <NSObject> - (NSInteger)numberOfStickersInStickerBrowserView:(MSStickerBrowserView *)stickerBrowserView;//返回Sticker數量 - (MSSticker *)stickerBrowserView:(MSStickerBrowserView *)stickerBrowserView stickerAtIndex:(NSInteger)index;//返回MSSticker對象
MSStickerBrowserViewDataSource
的用法跟UITableViewDataSource
很像,甚至連reloadData
都很像。MSStickerBrowserViewController
有一個stickerBrowserView
對象
@property (nonatomic, strong, readonly) MSStickerBrowserView *stickerBrowserView;
刷新數據的時候,調用[stickerBrowserView reloadData]
(是否是跟tableView的reloadData很像!)
/*! @abstract Asks the Sticker Browser View to reload its data from its data source. */ - (void)reloadData;
細心的讀者可能已經發現,
MSStickerBrowserViewDataSource
和UITableViewDataSource
有一個不一樣的地方:- (MSSticker *)stickerBrowserView:(MSStickerBrowserView *)stickerBrowserView stickerAtIndex:(NSInteger)index
返回的是一個MSSticker
,而- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
返回的是一個UIView
。
其實,這是MSStickerBrowserViewController
幫咱們作的一層額外封裝,真正顯示的是一個叫MSStickerView
的view。由此能夠發現,自定義Sticker不必定非要用MSStickerBrowserViewController
,咱們也能夠用一個普通的UIViewController
,在顯示Sticker的地方,咱們只須要用MSStickerView
就能夠了。
附一張視頻中的截圖,方便你們理解
交互型消息(Interactive Messages)是一種特殊的消息類型,由圖片、文字、音視頻等組成,用戶能夠對該消息進行交互操做(由iMessage App定義)。
交互型消息由消息擴展(Message Extension)顯示和建立,以後由用戶主動發送出去;接受者收到消息以後能夠點擊查看,進行交互操做,而且能夠回覆消息。這些步驟都在MSMessagesAppViewController
中完成。
在咱們深刻了解以前,先來認識幾個關鍵對象。
咱們在上面已經介紹過了MSMessagesAppViewController
,它用來展現消息擴展(Message Extension)的界面。
MSMessagesAppViewController
有兩種展示方式:
Expanded-MSMessagesAppPresentationStyleExpanded
在Compact模式下,不能訪問鍵盤和相機,同時也不能使用橫向滑動操做(Compact模式下,橫向操做會由系統捕獲),可是能夠訪問用戶輸入框。
在Expanded模式下,咱們不能訪問用戶輸入框,可是能夠訪問鍵盤、相機,而且可使用橫向滑動操做。
MSConversation
指當前的會話,咱們能夠經過MSConversation
「發送消息」(這裏的發送消息並非真正的發送消息,只是把消息添加到輸入框中,真正的消息發送是用戶點擊發送按鈕完成的),獲取會話的用戶信息等。
MSMessage
是消息體,它包含兩個主要部分
MSSession
用來描述消息如何發送; MSMessageLayout
用來描述消息如何展現理解了上面的概念,咱們來看下Message App的生命週期。
啓動過程:
- (void)didBecomeActiveWithConversation:(MSConversation *)conversation;
- (void)viewWillAppear:(BOOL)animated;
- (void)viewDidAppear:(BOOL)animated;
銷燬過程:
- (void)viewWillDisappear:(BOOL)animated;
- (void)viewDidDisappear:(BOOL)animated;
- (void)willResignActiveWithConversation:(MSConversation *)conversation;
上面列出的回調方法均出如今MSMessagesAppViewController
中,可見,iMessage App的生命週期就是MSMessagesAppViewController
的生命週期。當啓動Message Extension以後,系統會馬上調用- (void)didBecomeActiveWithConversation:(MSConversation *)conversation;
方法,在MSMessagesAppViewController
被用戶關閉或經過其它方式dismiss以後,會執行- (void)willResignActiveWithConversation:(MSConversation *)conversation;
,以後系統隨時能夠終止Message Extension(通常狀況下會馬上終止)。
除此以外,還有一個特殊的過程:
-(void)willTransitionToPresentationStyle:(MSMessagesAppPresentationStyle)presentationStyle;
-(void)didTransitionToPresentationStyle:(MSMessagesAppPresentationStyle)presentationStyle;
喚起過程發生在MSMessagesAppViewController
的presentationStyle
發生變化時。
PS:Message Extension啓動的時候,老是以Compact Style的方式顯示。
MSMessage
就是消息自己,咱們能夠經過修改MSMessage
的屬性來決定消息的展現內容。消息的展示方式由MSMessageLayout
決定,不過MSMessageLayout
是一個抽象類,目前系統只提供了一種展示方法MSMessageTemplateLayout
,以下圖
咱們能夠設置MSMessage
的URL
屬性,用來描述消息內容。由於iMessage App只能在iOS系統運行,mac收到該消息以後不會解析消息內容,若是用戶點擊該消息而且URL
是http(s)類型的,系統會經過瀏覽器打開相應的頁面。
咱們所說的「發送 Message」其實是添加消息到用戶輸入框。這一過程由MSConversation
完成。在MSMessagesAppViewController
中咱們能夠經過成員變量activeConversation
獲取當前的MSConversation
,隨後可調用一下方法插入不一樣的消息。
- (void)insertMessage:(MSMessage *)message localizedChangeDescription:(nullable NSString *)changeDescription completionHandler:(nullable void (^)(NSError * _Nullable))completionHandler; - (void)insertSticker:(MSSticker *)sticker completionHandler:(nullable void (^)(NSError * _Nullable))completionHandler; - (void)insertText:(NSString *)text completionHandler:(nullable void (^)(NSError * _Nullable))completionHandler; - (void)insertAttachment:(NSURL *)URL withAlternateFilename:(nullable NSString *)filename completionHandler:(nullable void (^)(NSError * _Nullable))completionHandler;
其中第一個方法添加的是交互型消息,其他三個依次添加Sticker,文本以及音視頻。
MSSession
,如何聚合消息,獲取會話者信息等,咱們之後再聊!建議你們去認真看下原版視頻!最後,若是你以爲本文對你有幫助,請點贊😊!