说在前面:

iMessage app 是iOS10中嵌入到Message内容的iMessage apps,包含简单的表情包以及自定义的复杂界面。

iMessage App类别:

* Sticker pack app :单独的表情包应用,不需要编写任何代码,只需拖动图片即可,包括静态和动态表情。

* iMessage app :单独的iMessage应用,要编写代码,可以发送表情包、文字、视频、音频。

上面两个也可以以一个app的扩展嵌入到iMessage应用中。

一、创建独立的表情包应用(Sticker pack app ):无需代码

表情包限制:

* Small :100 x 100   @3x scale (300 x 300 pixel image)

* Medium : 136 x 136  @3x scale (378 x 378 pixel image)

* Large : 206 x 206  @3x scale (618 x 618 pixel image)

其他限制(表情包大小):

* 文件中的 images 不可以大于500kb

* image 不可以小于100 x 100 pt (300 x 300 pixels)

* image 不可以大于206 x 206 pt (618 x 618 pixels)

* image 格式必须是PNG、APNG、JPEG、GIF

1、添加静态表情包 

< 1 > 创建Sticker Pack 工程

create a new Xcode project > iOS > Sticker Pack Application > Next

< 2 > 拖入图片

选中Stickers.xcsstickers > 选中右边的Sticker Pack文件夹 > 选中素材中的所有图片 > 拖入Sticker Pack中

< 2 > 运行效果

这样就完成了Sticker pack静态表情包

2、添加动态表情包

< 1 >  选中Sticker Pack文件夹 > 点击下方➕号 > 选择New Sticker Sequence添加动态表情

< 2 > 拖入该动态图片的各个帧图片即可(拖入Frame1位置)。

< 3 > 可设置动态表情包的时间

选中Sticker Sequence > 点击右面板中的属性检查器 > 设置Sticker Sequence分类下的Frame Per Second

< 4 >运行效果

这样就已经完成了Sticker pack app

二、创建 iMessage 应用(iMessage app ):

个人理解有三种实现方式:

* 直接在MessagesAppViewController 类中添加View。简单,复杂的View不好管理。

* 创建MSStickerBrowserViewController ,作为子类添加到 MessagesAppViewController 中,只需要实现贴纸界面可以选择这种方式比较简单。

* 自定义一个ViewController,作为子类添加到 MessagesAppViewController 中,添加过后和扑通的App开发基本没区别,但是要注意View高度的变化,自动布局。

Message框架的几个基础类介绍:

MessagesAppViewController :iMessage App 程序的入口,工程默认创建其子类MessagesAppViewController 。

MSSticker : 表情。是 NSObject 的子类 。

MSStickerBrowserView : 表情View 。

MSStickerBrowViewController : 表情ViewController 。

MSStickerBrowViewDataSource :表情数据来源代理 。

其实,上面四个类就类似于 UITableViewCell 、 UITableViewController 、 UITableViewDataSource 的关系。

1、自定义贴纸布局

< 1 > Create a new Xcode project > IOS > iMessage Application > Next

生成的目录结构,主要是针对 MessageExtension 文件夹开发。

< 2 > 将图片资源添加到工程中 。

< 3 > 在 MessagesAppViewController 中加载表情包数据,创建MSStickerBrowserViewController 实现MSStickerBrowserVie wDataSource 代理数据 。

#import "MessagesViewController.h"@interface MessagesViewController ()<MSStickerBrowserViewDataSource>
//创建数据原数组来存储我们的表情包
@property (nonatomic,strong) NSMutableArray *stickersArray;@end@implementation MessagesViewController- (void)viewDidLoad {[super viewDidLoad];// 初始化本地表情包[self loadStickers];// 创建本地表情包控制器[self createStickerBrowserViewController];}//加载表情包,上面设置了数据源,所以我们要加载图片(数据)
- (void)loadStickers{NSMutableArray *mArray = [NSMutableArray array];for (int i = 1; i < 11; i++) {
<span style="white-space:pre">  </span>//传入对应的urlNSURL *url = [[NSBundle mainBundle] URLForResource:[NSString stringWithFormat:@"scoops%02d_sticker", i] withExtension:@"png"];MSSticker *sticker = [[MSSticker alloc]initWithContentsOfFileURL:url localizedDescription:@"" error:nil];[mArray addObject:sticker];}self.stickersArray = mArray;}// 要想显示图片表情,必须要初始化一个MSStickerBrowserViewController作为根视图
- (void)createStickerBrowserViewController{MSStickerBrowserViewController *browserVc = [[MSStickerBrowserViewController alloc]initWithStickerSize:MSStickerSizeSmall];[self addChildViewController:browserVc];[self.view addSubview:browserVc.view];browserVc.stickerBrowserView.backgroundColor = [UIColor cyanColor];//设置数据源browserVc.stickerBrowserView.dataSource = self;browserVc.view.translatesAutoresizingMaskIntoConstraints = NO;//自动布局[self.view.topAnchor constraintEqualToAnchor:browserVc.view.topAnchor].active = YES;[self.view.bottomAnchor constraintEqualToAnchor:browserVc.view.bottomAnchor].active = YES;[self.view.leftAnchor constraintEqualToAnchor:browserVc.view.leftAnchor].active = YES;[self.view.rightAnchor constraintEqualToAnchor:browserVc.view.rightAnchor].active = YES;}#pragma mark - MSStickerBrowserViewDataSource 数据源代理方法(必须实现)
// 一共有多少个
-(NSInteger)numberOfStickersInStickerBrowserView:(MSStickerBrowserView *)stickerBrowserView{return self.stickersArray.count;
}// 每一个要显示什么
- (MSSticker *)stickerBrowserView:(MSStickerBrowserView *)stickerBrowserView stickerAtIndex:(NSInteger)index{return self.stickersArray[index];
}@end

这样就实现了在代码中添加贴图 。

2、自定义ViewController可发送图片、音频、视频文件

创建方式:

* 可以像上面一样添加一个 iMessage 应用

* 可以再一个普通的APP中加入iMessage扩展(APP)。

接下来我们主要讲一讲如何在已有的项目中添加 iMessage APP 扩展。

< 1 > 首先创建一个普通的工程,点击➕号添加 iMessage 扩展

点击Finish,弹框选Yes ,完成添加扩展生成的目录和创建的 iMessage App 在 MyMessage2Extension 目录下是一样的 。

完整代码:

#import "MessagesViewController.h"@implementation MessagesViewController- (void)viewDidLoad {[super viewDidLoad];[self setupButton];
}// 创建按钮 (懒加载的方法)
-(UIButton *)createButtonWithTitle:(NSString *)title action:(SEL)action{UIButton *button = [[UIButton alloc] init];[button setBackgroundColor:[self randomColor]];button.translatesAutoresizingMaskIntoConstraints = NO;[button setTitle:title forState:UIControlStateNormal];[button addTarget:self action:action forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:button];return button;
}//button的背景颜色设置(随机颜色)
-(UIColor *)randomColor{CGFloat red = (CGFloat)random() / (CGFloat)RAND_MAX;CGFloat green = (CGFloat)random() / (CGFloat)RAND_MAX;CGFloat blue = (CGFloat)random() / (CGFloat)RAND_MAX;return [UIColor colorWithRed:red green:green blue:blue alpha:1.0];
}//设置按钮
- (void)setupButton {UIButton *photoButton = [self createButtonWithTitle:@"图片" action:@selector(sendPhoto)];UIButton *musicButton = [self createButtonWithTitle:@"音乐" action:@selector(sendMusic)];UIButton *videoButton = [self createButtonWithTitle:@"视频" action:@selector(sendVideo)];UIButton *stickerButton = [self createButtonWithTitle:@"贴纸" action:@selector(sendStick)];UIButton *alterButton = [self createButtonWithTitle:@"自定义" action:@selector(sendAlter)];[photoButton.leftAnchor constraintEqualToAnchor:self.view.leftAnchor].active = YES;[photoButton.rightAnchor constraintEqualToAnchor:musicButton.leftAnchor].active = YES;[photoButton.centerYAnchor constraintEqualToAnchor:self.view.centerYAnchor].active = YES;[photoButton.heightAnchor constraintEqualToConstant:50].active = YES;[musicButton.rightAnchor constraintEqualToAnchor:videoButton.leftAnchor].active = YES;[musicButton.widthAnchor constraintEqualToAnchor:photoButton.widthAnchor].active = YES;[musicButton.centerYAnchor constraintEqualToAnchor:self.view.centerYAnchor].active = YES;[musicButton.heightAnchor constraintEqualToConstant:50].active = YES;[videoButton.rightAnchor constraintEqualToAnchor:stickerButton.leftAnchor].active = YES;[videoButton.widthAnchor constraintEqualToAnchor:photoButton.widthAnchor].active = YES;[videoButton.centerYAnchor constraintEqualToAnchor:self.view.centerYAnchor].active = YES;[videoButton.heightAnchor constraintEqualToConstant:50].active = YES;[stickerButton.rightAnchor constraintEqualToAnchor:alterButton.leftAnchor].active = YES;[stickerButton.widthAnchor constraintEqualToAnchor:photoButton.widthAnchor].active = YES;[stickerButton.centerYAnchor constraintEqualToAnchor:self.view.centerYAnchor].active = YES;[stickerButton.heightAnchor constraintEqualToConstant:50].active = YES;[alterButton.rightAnchor constraintEqualToAnchor:self.view.rightAnchor].active = YES;[alterButton.widthAnchor constraintEqualToAnchor:photoButton.widthAnchor].active = YES;[alterButton.centerYAnchor constraintEqualToAnchor:self.view.centerYAnchor].active = YES;[alterButton.heightAnchor constraintEqualToConstant:50].active = YES;
}//发送图片
-(void)sendPhoto{NSURL *url = [[NSBundle mainBundle] URLForResource:@"image" withExtension:@"png"];[self sendMessageWithURL:url];
}
//发送音乐
-(void)sendMusic{NSURL *url = [[NSBundle mainBundle] URLForResource:@"blank" withExtension:@"mp3"];[self sendMessageWithURL:url];
}
//发送视频
-(void)sendVideo{NSURL *url = [[NSBundle mainBundle] URLForResource:@"moments" withExtension:@"mp4"];[self sendMessageWithURL:url];
}
//发送贴纸
-(void)sendStick{[self requestPresentationStyle:MSMessagesAppPresentationStyleCompact];NSURL *url = [[NSBundle mainBundle] URLForResource:@"sticker" withExtension:@"png"];MSSticker *sticker = [[MSSticker alloc] initWithContentsOfFileURL:url localizedDescription:@"localizedDescription" error:nil];[self.activeConversation insertSticker:sticker completionHandler:^(NSError * _Nullable error) {if (error) {NSLog(@"%@",error);}}];
}
//发送自定义消息
-(void)sendAlter{[self requestPresentationStyle:MSMessagesAppPresentationStyleCompact];MSMessageTemplateLayout *layout = [[MSMessageTemplateLayout alloc] init];layout.image = [UIImage imageNamed:@"image"];layout.imageTitle = @"老虎";MSMessage *message = [[MSMessage alloc] init];message.layout =layout;[self.activeConversation insertMessage:message completionHandler:^(NSError * _Nullable error) {if (error) {NSLog(@"%@",error);}}];
}// 通过 URL 发送消息
-(void)sendMessageWithURL:(NSURL *)url{[self requestPresentationStyle:MSMessagesAppPresentationStyleCompact];[self.activeConversation insertAttachment:url withAlternateFilename:nil completionHandler:^(NSError * _Nullable error) {if (error) {NSLog(@"%@",error);}}];
}@end

代码分析:

发送图片、音视频文件

activeConversation 是 MSMessagesAppViewController 里面的一个属性,发送音视频文件,都是通过这个方法。

[self.activeConversation insertAttachment:url withAlternateFilename:nil completionHandler:^(NSError * _Nullable error) {if (error) {NSLog(@"%@",error);}
}];

传入对应文件的URL即可。

NSURL *url = [[NSBundle mainBundle] URLForResource:@"image" withExtension:@"png"];

有时候可能找不到对应的URL, 可以再这里查看是否有加入的文件,如果没有加入,店家➕号加入该文件即可。

发送贴纸

发送贴纸通过这个方法,同理传入对应的URL 即可,注意贴纸的尺寸问题 。

MSSticker *sticker = [[MSSticker alloc] initWithContentsOfFileURL:url localizedDescription:@"localizedDescription" error:nil];[self.activeConversation insertSticker:sticker completionHandler:^(NSError * _Nullable error) {if (error) {NSLog(@"%@",error);}
}];

发送自定义消息
发送自定义消息主要是自定义 message 的 layout 属性以及其他的相关属性。

MSMessageTemplateLayout *layout = [[MSMessageTemplateLayout alloc] init];
layout.image = [UIImage imageNamed:@"image"];
layout.imageTitle = @"老虎";
MSMessage *message = [[MSMessage alloc] init];
message.layout =layout;
[self.activeConversation insertMessage:message completionHandler:^(NSError * _Nullable error) {if (error) {NSLog(@"%@",error);}
}];

关于iOS10 - iMessage App的总结相关推荐

  1. jmplayer苹果app怎么用_iMessage App Store怎么用?苹果iOS10 iMessage应用商店使用教程...

    iMessage App Store可以说是 iOS10一个非常重要的变化,这个商店在信息应用中,进入商店可以直接获取到苹果官网推送的iMessage表情包.那么你知道它怎么用吗?下面就来为你展示如何 ...

  2. iMessage app 开发

    说在前面: iMessage app 是iOS10中嵌入到Message内容的iMessage apps,包含简单的表情包以及自定义的复杂界面. iMessage App类别: * Sticker p ...

  3. ROCKOUT软件测试工程师,具透丨这才是让 iMessage 变得好玩有用的原因:iMessage App Store 详解...

    关于栏目 苹果.谷歌每年一次大更新的新系统都值得关注,我们始终不建议普通用户提前尝鲜稳定性不佳的测试版,但我们理解想要尝鲜的心情,于是有了「具透」这个栏目.「具透」会挖掘.详解新系统的各个功能细节,并 ...

  4. 半岛电视台员工遭iOS iMessage app零点击0day 漏洞利用攻击

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 今天,多伦多大学网络安全和人权滥用研究机构公民实验室 (Citizen Lab) 的研究人员指出,至少有36名半岛电视台 (AI Ja ...

  5. 趁热来一波,WWDC 2016 iMessage App开发

    趁热来一波,WWDC 2016 iMessage App开发 字数2156 阅读3420 评论14 喜欢37 WWDC 2016关于iMessage App的两个视频已经放出(iMessage App ...

  6. iMessage App 创建

    iMessage App  iMessage App 主要分以下 4 类. 贴纸包应用.这是一种由图片或动图组成的基本贴纸包,无需编写代码即可构建.开发者可以在 iMessage 版 App Stor ...

  7. iOS10 优化APP首次安装网络权限提示方案

    我刚经历了一场末日(停电),特别是在你想写文档的时候... 言归正传,今天的问题是解决iOS10系统下首次按钮APP弹出的网络权限提示所带来了问题以及优化. 起因 查了相关文章知道由于大陆工信部出台的 ...

  8. iOS10 打开APP设置界面和WIFI界面

    在iOS10以上,权限这块有了一些变化 首先在info的URL Types 添加  prefs 1.打开APP设置界面 //打开设置let url:NSURL = NSURL(string: UIAp ...

  9. ios10 部分app无法连接到网络

    最近不少手机都升级了ios10.0系统,在调试的过程中发现,咱家的app无法连接到网络,然后去手动设置网络权限开启,但是根本找不到这个app. 据说这是ios10的bug,解决办法之一就是升级ios1 ...

最新文章

  1. oracle查看联机日志,oracle联机日志和归档日志
  2. 为什么现在的人越来越不幸福
  3. 海量数据处理之蓄水池抽样算法
  4. 【大数据-Hadoop】Hadoop架构
  5. unity, eulerAngle
  6. Java面向对象(二、继承)
  7. linux挂载NTFS分区
  8. Java的一些学习心得
  9. golang redis获取所有key_Redis 内存分析神器
  10. excel服务器没有响应怎么办,勤哲Excel服务器技术支持|Excel服务器常见问题解答...
  11. 16进制 dat matlab_MATLAB中的常量与变量
  12. 101与金根回顾敏捷个人:(82)《把时间当做朋友》
  13. 开源项目:测试安卓设备摄像头的帧率
  14. SHA256算法原理详解图
  15. 标准Lena测试图像下载
  16. 【项目管理】项目管理四要素
  17. 人工智能技术涉及到的学科有哪些,22年最新
  18. java % 负数_Java如何在括号中显示负数?
  19. UIStackView Masonry
  20. VB.net (窗体应用)的速成式学习

热门文章

  1. seq2seq模型_对话生成:seq2seq模型原理及优化
  2. java入门之contine和break的区别
  3. 程序员危!传OpenAI全球招外包大军,手把手训练ChatGPT取代码农
  4. 51单片机 c语言 yl236,基于亚龙YL236单片机设备的矩阵键盘程序设计.doc
  5. 晶圆测试开发软件,晶圆级可靠性测试:器件开发的关键步骤(一)
  6. 想赚大钱,最快的方法就是--自己当老板
  7. ARM体系结构学习总结
  8. 抗扰度试验--EMS--电快速瞬变脉冲群--EFT
  9. 西电“智能星“第一届自动驾驶小车比赛 参赛记录 暨 JetRacer 使用心得
  10. Maven依赖junit @Test报错