趁热来一波,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 著做权归做者全部,转载请联系做者得到受权,并标注“简书做者”。
相关文章
相关标签/搜索