轉自: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將會是一個“風口”。
本文主要是對最新的WWDC關於iMessage App視頻的翻譯和筆者的個人理解,英文好的童鞋還是推薦看WWDC的視頻資料。閱讀本文之前,需要讀者掌握基本的iOS Extension知識,可以參考iOS App Extension入門
iMessage App簡介
iMessage App是一種全新的應用擴展,載體是iOS系統的Message應用,通過iMessage App,用戶可以發送更加豐富的消息內容,享受更具交互性的會話體驗。我們來看看它都有什么新鮮玩意:
新增三種類型
-
Stickers
-
Interactive Messages
-
可以發送圖片,音視頻,文本,鏈接等等
Messages App Store
就是這貨:
用來干什么的呢?
-
顯示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)。
Stickers
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中進行設置
Custom Sticker
自定義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
交互型消息(Interactive Messages)是一種特殊的消息類型,由圖片、文字、音視頻等組成,用戶可以對該消息進行交互操作(由iMessage App定義)。
交互型消息由消息擴展(Message Extension)顯示和創建,之后由用戶主動發送出去;接受者收到消息之后可以點擊查看,進行交互操作,並且可以回復消息。這些步驟都在MSMessagesAppViewController中完成。
在我們深入了解之前,先來認識幾個關鍵對象。
-
MSMessagesAppViewController
我們在上面已經介紹過了
MSMessagesAppViewController,它用來展示消息擴展(Message Extension)的界面。
MSMessagesAppViewController
MSMessagesAppViewController有兩種展現方式:
- Compact-MSMessagesAppPresentationStyleCompact
-
Expanded-
MSMessagesAppPresentationStyleExpanded在Compact模式下,不能訪問鍵盤和相機,同時也不能使用橫向滑動操作(Compact模式下,橫向操作會由系統捕獲),但是可以訪問用戶輸入框。
Compact Style在Expanded模式下,我們不能訪問用戶輸入框,但是可以訪問鍵盤、相機,並且可以使用橫向滑動操作。
Expanded Style -
MSConversation
MSConversation指當前的會話,我們可以通過MSConversation“發送消息”(這里的發送消息並不是真正的發送消息,只是把消息添加到輸入框中,真正的消息發送是用戶點擊發送按鈕完成的),獲取會話的用戶信息等。
MSConversation -
MSMessage
MSMessage是消息體,它包含兩個主要部分-
MSSession用來描述消息如何發送; -
MSMessageLayout用來描述消息如何展示
MSMessage -
iMessage App LifeCycle
理解了上面的概念,我們來看下Message App的生命周期。
-
啟動過程:
- Message Extension啟動
- (void)didBecomeActiveWithConversation:(MSConversation *)conversation;- (void)viewWillAppear:(BOOL)animated;- (void)viewDidAppear:(BOOL)animated;
-
銷毀過程:
- (void)viewWillDisappear:(BOOL)animated;- (void)viewDidDisappear:(BOOL)animated;- (void)willResignActiveWithConversation:(MSConversation *)conversation;- Message Extension被系統銷毀
上面列出的回調方法均出現在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就是消息本身,我們可以通過修改MSMessage的屬性來決定消息的展示內容。消息的展現方式由MSMessageLayout決定,不過MSMessageLayout是一個抽象類,目前系統只提供了一種展現方法MSMessageTemplateLayout,如下圖
我們可以設置MSMessage的URL屬性,用來描述消息內容。因為iMessage App只能在iOS系統運行,mac收到該消息之后不會解析消息內容,如果用戶點擊該消息並且URL是http(s)類型的,系統會通過瀏覽器打開相應的頁面。
“發送 Message”
我們所說的“發送 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,文本以及音視頻。
今天到此為止,WWDC視頻還提到了MSSession,如何聚合消息,獲取會話者信息等,我們以后再聊!建議大家去認真看下原版視頻!最后,如果你覺得本文對你有幫助,請點贊😊!
原文鏈接:http://www.jianshu.com/p/be79b8729bf8
著作權歸作者所有,轉載請聯系作者獲得授權,並標注“簡書作者”。
