趁热来一波,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
就是这货:

用来干什么的呢?
显示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 StyleMSConversation
MSConversation
指当前的会话,我们可以通过MSConversation
“发送消息”(这里的发送消息并不是真正的发送消息,只是把消息添加到输入框中,真正的消息发送是用户点击发送按钮完成的),获取会话的用户信息等。MSConversationMSMessage
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
,如何聚合消息,获取会话者信息等,我们以后再聊!建议大家去认真看下原版视频!最后,如果你觉得本文对你有帮助,请点赞
趁热来一波,WWDC 2016 iMessage App开发的更多相关文章
- WWDC 2016 盛宴
转自:http://www.jianshu.com/p/72dd8306c817 整理和维护人:pmstGitHub 链接:WWDC-2016-Feast目前只是整理官方给出的 WWDC 2016 视 ...
- WWDC 2016 总结
一年一次的WWDC,是开发者充值信仰的时刻,今天你的信仰充值了吗?欢迎在本文下面留言吐槽. 有外媒称,这届WWDC苹果将“fun”伪装成“innovation”,的确,看看另两家老对手,微软有黑科技H ...
- WWDC 2016: Rich Notifications in iOS 10
Notifications have gotten more than a visual refresh in iOS 10. As part of the new UserNotifications ...
- Xcode 8 的 Debug 新特性 —- WWDC 2016 Session 410 & 412 学习笔记
Contents OverView Static Analyzer Localizability Instance Cleanup Nullablility Runtime Issue View De ...
- 2016中国APP分类排行榜参选入围产品公示
2016中国APP分类排行榜参选入围产品公示 由中国科学院<互联网周刊>.中国社会科学院信息化研究中心.eNet硅谷动力共同主办的2016中国APP分类排行榜发布暨颁奖晚宴即将举行.此 ...
- 2016年后web开发趋势是什么?
2016 年后 Web开发趋势是什么 来源:yafeilee.me 发布时间:2016-05-06 阅读次数:1378 3 近二年的进展 前端发展日新月异, 甚至有一句戏言: "每六星期 ...
- 你应该知道的2016年有关App开发的技术创新
上一篇简述了2016年有关App产品的年中总结,这篇开始历数有关App开发的技术创新!无论你是创业者,还是程序员,无论你是否懂编程.写代码,利用APICloud平台数据撰写的年中总结,集合了移动应用创 ...
- iOS 10 创建iMessage App
原文作者 澳大利亚19岁少年--Davis Allie ----原文地址 时值中秋佳节, 送给出门在外的程序猿们 ! 骚年们, 自己写个表情包斗图可否 ! 斗-seal.svg.png 第一. 介绍 ...
- 根据iOS 10 的新特性,创建iMessage App,可用于自定义表情
第一. 介绍(原文作者 澳大利亚19岁少年--Davis Allie ----原文地址) 随着iOS10的发布,苹果对开发者开放了Messages应用程序,开发人员现在可以创建他们自己的各种类型 并且 ...
随机推荐
- wifi各协议最高速率
- mysql忘记密码怎么办??
1.停掉mysql 1.1单实例停止方式 [root@qiuhom ~]# /etc/init.d/mysqld stop Shutting down MySQL. [ OK ] 1.2多实例停止方式 ...
- C语言程序设计100例之(10):最大公约数
例10 最大公约数 问题描述 有三个正整数a,b,c(0<a,b,c<10^6),其中c不等于b.若a和c的最大公约数为b,现已知a和b,求满足条件的最小的c. 输入数据 第 ...
- java面试题-Java集合相关
1. ArrayList 和 Vector 的区别 ArrayList和Vector底层实现原理都是一样得,都是使用数组方式存储数据 Vector是线程安全的,但是性能比ArrayList要低. Ar ...
- 理解Spark运行模式(三)(STANDALONE和Local)
前两篇介绍了Spark的yarn client和yarn cluster模式,本篇继续介绍Spark的STANDALONE模式和Local模式. 下面具体还是用计算PI的程序来说明,examples中 ...
- hdu 2527 Safe Or Unsafe (优先队列实现Huffman)
Safe Or UnsafeTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- nyoj 79-拦截导弹 (动态规划)
79-拦截导弹 内存限制:64MB 时间限制:3000ms 特判: No 通过数:9 提交数:11 难度:3 题目描述: 某国为了防御敌国的导弹袭击,发展中一种导弹拦截系统.但是这种导弹拦截系统有一个 ...
- 802.11r协议理解
首先阅读了相关协议内容整理出了如下的802.11r时序图所谓基础,然后会详细理解其中的每一个步骤:
- Linux注意事项
一.学习 Linux 的注意事项 1. Linux 严格区分大小写 Linux 是严格区分大小写的,这一点和 Windows 不一样,所以操作时要注意区分大小写的不同,包括文件名和目录名.命令.命令选 ...
- 力扣(LeetCode)键盘行 个人题解
给定一个单词列表,只返回可以使用在键盘同一行的字母打印出来的单词.键盘如下图所示. 示例: 输入: ["Hello", "Alaska", "Dad& ...
转自:http://www.jianshu.com/p/72dd8306c817 整理和维护人:pmstGitHub 链接:WWDC-2016-Feast目前只是整理官方给出的 WWDC 2016 视 ...
一年一次的WWDC,是开发者充值信仰的时刻,今天你的信仰充值了吗?欢迎在本文下面留言吐槽. 有外媒称,这届WWDC苹果将“fun”伪装成“innovation”,的确,看看另两家老对手,微软有黑科技H ...
Notifications have gotten more than a visual refresh in iOS 10. As part of the new UserNotifications ...
Contents OverView Static Analyzer Localizability Instance Cleanup Nullablility Runtime Issue View De ...
2016中国APP分类排行榜参选入围产品公示 由中国科学院<互联网周刊>.中国社会科学院信息化研究中心.eNet硅谷动力共同主办的2016中国APP分类排行榜发布暨颁奖晚宴即将举行.此 ...
2016 年后 Web开发趋势是什么 来源:yafeilee.me 发布时间:2016-05-06 阅读次数:1378 3 近二年的进展 前端发展日新月异, 甚至有一句戏言: "每六星期 ...
上一篇简述了2016年有关App产品的年中总结,这篇开始历数有关App开发的技术创新!无论你是创业者,还是程序员,无论你是否懂编程.写代码,利用APICloud平台数据撰写的年中总结,集合了移动应用创 ...
原文作者 澳大利亚19岁少年--Davis Allie ----原文地址 时值中秋佳节, 送给出门在外的程序猿们 ! 骚年们, 自己写个表情包斗图可否 ! 斗-seal.svg.png 第一. 介绍 ...
第一. 介绍(原文作者 澳大利亚19岁少年--Davis Allie ----原文地址) 随着iOS10的发布,苹果对开发者开放了Messages应用程序,开发人员现在可以创建他们自己的各种类型 并且 ...
1.停掉mysql 1.1单实例停止方式 [root@qiuhom ~]# /etc/init.d/mysqld stop Shutting down MySQL. [ OK ] 1.2多实例停止方式 ...
例10 最大公约数 问题描述 有三个正整数a,b,c(0<a,b,c<10^6),其中c不等于b.若a和c的最大公约数为b,现已知a和b,求满足条件的最小的c. 输入数据 第 ...
1. ArrayList 和 Vector 的区别 ArrayList和Vector底层实现原理都是一样得,都是使用数组方式存储数据 Vector是线程安全的,但是性能比ArrayList要低. Ar ...
前两篇介绍了Spark的yarn client和yarn cluster模式,本篇继续介绍Spark的STANDALONE模式和Local模式. 下面具体还是用计算PI的程序来说明,examples中 ...
Safe Or UnsafeTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
79-拦截导弹 内存限制:64MB 时间限制:3000ms 特判: No 通过数:9 提交数:11 难度:3 题目描述: 某国为了防御敌国的导弹袭击,发展中一种导弹拦截系统.但是这种导弹拦截系统有一个 ...
首先阅读了相关协议内容整理出了如下的802.11r时序图所谓基础,然后会详细理解其中的每一个步骤:
一.学习 Linux 的注意事项 1. Linux 严格区分大小写 Linux 是严格区分大小写的,这一点和 Windows 不一样,所以操作时要注意区分大小写的不同,包括文件名和目录名.命令.命令选 ...
给定一个单词列表,只返回可以使用在键盘同一行的字母打印出来的单词.键盘如下图所示. 示例: 输入: ["Hello", "Alaska", "Dad& ...