趁熱來一波,WWDC 2016 iMessage App開發


轉自: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

就是這貨:


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中進行設置


sticker size

Custom Sticker

自定義Stickeryou 有如下優勢:

1.自定義UI

2.可以動態改變Sticker

3.可以使用相機功能

4.支持IAP

自定義Sticker需要創建一個Messages Application。Messages Application會自動生成一個Sticker Pack和一個Messages Extension,如下圖:


Messages Application Project

如果想在已有項目中添加Sticker,只能添加一個Messages Extension,然后用自定義Sticker的方法來實現。

自定義Sticker需要我們自己控制Sticker的顯示,所以我們不在Assets.xcassets中添加stickers,我們需要修改MessagesExtension中的MessagesViewController
MessagesViewControllerMSMessagesAppViewController的子類,后者是iMessage App中一個重要的組建,它的生命周期我們會在后面介紹,在此我們只需要知道MessagesViewController就是iMessage App的顯示界面。

想要自定義Sticker,需要自定義MSStickerBrowserViewControllerMSStickerBrowserViewController顧名思義,是用來顯示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;

細心的讀者可能已經發現,MSStickerBrowserViewDataSourceUITableViewDataSource有一個不同的地方:
- (MSSticker *)stickerBrowserView:(MSStickerBrowserView *)stickerBrowserView stickerAtIndex:(NSInteger)index返回的是一個MSSticker,而- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath返回的是一個UIView
其實,這是MSStickerBrowserViewController幫我們做的一層額外封裝,真正顯示的是一個叫MSStickerView的view。由此可以發現,自定義Sticker不一定非要用MSStickerBrowserViewController,我們也可以用一個普通的UIViewController,在顯示Sticker的地方,我們只需要用MSStickerView就可以了。

附一張視頻中的截圖,方便大家理解


custom sticker demo

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的生命周期。

  • 啟動過程:

    1. Message Extension啟動
    2. - (void)didBecomeActiveWithConversation:(MSConversation *)conversation;
    3. - (void)viewWillAppear:(BOOL)animated;
    4. - (void)viewDidAppear:(BOOL)animated;
  • 銷毀過程:

    1. - (void)viewWillDisappear:(BOOL)animated;
    2. - (void)viewDidDisappear:(BOOL)animated;
    3. - (void)willResignActiveWithConversation:(MSConversation *)conversation;
    4. Message Extension被系統銷毀

上面列出的回調方法均出現在MSMessagesAppViewController中,可見,iMessage App的生命周期就是MSMessagesAppViewController的生命周期。當啟動Message Extension之后,系統會立刻調用- (void)didBecomeActiveWithConversation:(MSConversation *)conversation;方法,在MSMessagesAppViewController被用戶關閉或通過其它方式dismiss之后,會執行- (void)willResignActiveWithConversation:(MSConversation *)conversation;,之后系統隨時可以終止Message Extension(一般情況下會立刻終止)。

除此之外,還有一個特殊的過程:

  • 喚起過程:
    1. -(void)willTransitionToPresentationStyle:(MSMessagesAppPresentationStyle)presentationStyle;
    2. -(void)didTransitionToPresentationStyle:(MSMessagesAppPresentationStyle)presentationStyle;

喚起過程發生在MSMessagesAppViewControllerpresentationStyle發生變化時。

PS:Message Extension啟動的時候,總是以Compact Style的方式顯示。

創建 MSMessage

MSMessage就是消息本身,我們可以通過修改MSMessage的屬性來決定消息的展示內容。消息的展現方式由MSMessageLayout決定,不過MSMessageLayout是一個抽象類,目前系統只提供了一種展現方法MSMessageTemplateLayout,如下圖


MSMessageTemplateLayout

我們可以設置MSMessageURL屬性,用來描述消息內容。因為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,如何聚合消息,獲取會話者信息等,我們以后再聊!建議大家去認真看下原版視頻!最后,如果你覺得本文對你有幫助,請點贊😊!



文/joshualiyz(簡書作者)
原文鏈接:http://www.jianshu.com/p/be79b8729bf8
著作權歸作者所有,轉載請聯系作者獲得授權,並標注“簡書作者”。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM