关于iOS10 - iMessage App的总结
说在前面:
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的总结相关推荐
- jmplayer苹果app怎么用_iMessage App Store怎么用?苹果iOS10 iMessage应用商店使用教程...
iMessage App Store可以说是 iOS10一个非常重要的变化,这个商店在信息应用中,进入商店可以直接获取到苹果官网推送的iMessage表情包.那么你知道它怎么用吗?下面就来为你展示如何 ...
- iMessage app 开发
说在前面: iMessage app 是iOS10中嵌入到Message内容的iMessage apps,包含简单的表情包以及自定义的复杂界面. iMessage App类别: * Sticker p ...
- ROCKOUT软件测试工程师,具透丨这才是让 iMessage 变得好玩有用的原因:iMessage App Store 详解...
关于栏目 苹果.谷歌每年一次大更新的新系统都值得关注,我们始终不建议普通用户提前尝鲜稳定性不佳的测试版,但我们理解想要尝鲜的心情,于是有了「具透」这个栏目.「具透」会挖掘.详解新系统的各个功能细节,并 ...
- 半岛电视台员工遭iOS iMessage app零点击0day 漏洞利用攻击
聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 今天,多伦多大学网络安全和人权滥用研究机构公民实验室 (Citizen Lab) 的研究人员指出,至少有36名半岛电视台 (AI Ja ...
- 趁热来一波,WWDC 2016 iMessage App开发
趁热来一波,WWDC 2016 iMessage App开发 字数2156 阅读3420 评论14 喜欢37 WWDC 2016关于iMessage App的两个视频已经放出(iMessage App ...
- iMessage App 创建
iMessage App iMessage App 主要分以下 4 类. 贴纸包应用.这是一种由图片或动图组成的基本贴纸包,无需编写代码即可构建.开发者可以在 iMessage 版 App Stor ...
- iOS10 优化APP首次安装网络权限提示方案
我刚经历了一场末日(停电),特别是在你想写文档的时候... 言归正传,今天的问题是解决iOS10系统下首次按钮APP弹出的网络权限提示所带来了问题以及优化. 起因 查了相关文章知道由于大陆工信部出台的 ...
- iOS10 打开APP设置界面和WIFI界面
在iOS10以上,权限这块有了一些变化 首先在info的URL Types 添加 prefs 1.打开APP设置界面 //打开设置let url:NSURL = NSURL(string: UIAp ...
- ios10 部分app无法连接到网络
最近不少手机都升级了ios10.0系统,在调试的过程中发现,咱家的app无法连接到网络,然后去手动设置网络权限开启,但是根本找不到这个app. 据说这是ios10的bug,解决办法之一就是升级ios1 ...
最新文章
- oracle查看联机日志,oracle联机日志和归档日志
- 为什么现在的人越来越不幸福
- 海量数据处理之蓄水池抽样算法
- 【大数据-Hadoop】Hadoop架构
- unity, eulerAngle
- Java面向对象(二、继承)
- linux挂载NTFS分区
- Java的一些学习心得
- golang redis获取所有key_Redis 内存分析神器
- excel服务器没有响应怎么办,勤哲Excel服务器技术支持|Excel服务器常见问题解答...
- 16进制 dat matlab_MATLAB中的常量与变量
- 101与金根回顾敏捷个人:(82)《把时间当做朋友》
- 开源项目:测试安卓设备摄像头的帧率
- SHA256算法原理详解图
- 标准Lena测试图像下载
- 【项目管理】项目管理四要素
- 人工智能技术涉及到的学科有哪些,22年最新
- java % 负数_Java如何在括号中显示负数?
- UIStackView Masonry
- VB.net (窗体应用)的速成式学习
热门文章
- seq2seq模型_对话生成:seq2seq模型原理及优化
- java入门之contine和break的区别
- 程序员危!传OpenAI全球招外包大军,手把手训练ChatGPT取代码农
- 51单片机 c语言 yl236,基于亚龙YL236单片机设备的矩阵键盘程序设计.doc
- 晶圆测试开发软件,晶圆级可靠性测试:器件开发的关键步骤(一)
- 想赚大钱,最快的方法就是--自己当老板
- ARM体系结构学习总结
- 抗扰度试验--EMS--电快速瞬变脉冲群--EFT
- 西电“智能星“第一届自动驾驶小车比赛 参赛记录 暨 JetRacer 使用心得
- Maven依赖junit @Test报错