趁熱來一波,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將會是一個「風口」。app

本文主要是對最新的WWDC關於iMessage App視頻的翻譯和筆者的我的理解,英文好的童鞋仍是推薦看WWDC的視頻資料。閱讀本文以前,須要讀者掌握基本的iOS Extension知識,能夠參考iOS App Extension入門ide


iMessage App簡介

iMessage App是一種全新的應用擴展,載體是iOS系統的Message應用,經過iMessage App,用戶能夠發送更加豐富的消息內容,享受更具交互性的會話體驗。咱們來看看它都有什麼新鮮玩意:ui

新增三種類型

  • Stickersatom

  • Interactive Messagesspa

  • 能夠發送圖片,音視頻,文本,連接等等翻譯

Messages App Store

就是這貨:3d


Messages App Store

用來幹什麼的呢?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)。


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 著做權歸做者全部,轉載請聯繫做者得到受權,並標註「簡書做者」。
相關文章
相關標籤/搜索