Skip to content

Commit d643b58

Browse files
author
mengyaoyao
committed
新增语音发送部分
1 parent f56f283 commit d643b58

File tree

16 files changed

+546
-175
lines changed

16 files changed

+546
-175
lines changed

CocoaAsyncSocket_TCP/ChatHandler/ChatUtil.h

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,13 @@
1515
//消息高度计算
1616
+ (CGFloat)heightForMessage:(ChatModel *)currentChatmodel premodel:(ChatModel *)premodel;
1717

18-
//创建消息模型
19-
+ (ChatModel *)creatMessageModel:(ChatModel *)config;
20-
21-
//创建本地资源缓存 , 图片写入本地
22-
+ (void)creatLocalCacheSource:(ChatAlbumModel *)albumModel chat:(ChatModel *)chatModel;
18+
//初始化文本消息模型
19+
+ (ChatModel *)initTextMessage:(NSString *)text config:(ChatModel *)config;
20+
//初始化语音消息模型
21+
+ (ChatModel *)initAudioMessage:(ChatAlbumModel *)audio config:(ChatModel *)config;
22+
//初始化图片消息模型
23+
+ (NSArray<ChatModel *> *)initPicMessage:(NSArray<ChatAlbumModel *> *)pics config:(ChatModel *)config;
24+
//初始化视频消息模型
25+
+ (ChatModel *)initVideoMessage:(ChatAlbumModel *)video config:(ChatModel *)config;
2326

2427
@end

CocoaAsyncSocket_TCP/ChatHandler/ChatUtil.m

Lines changed: 129 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ + (CGFloat)heightForMessage:(ChatModel *)currentChatmodel premodel:(ChatModel *)
5151
//语音
5252
}else if (hashEqual(currentChatmodel.contenType, Content_Audio)){
5353

54+
height = 50;
55+
//验证是否群聊
56+
[self groupChatConfig:currentChatmodel];
5457
return currentChatmodel.messageHeight += currentChatmodel.shouldShowTime ? height + 50 : height + 15;
5558
//图片
5659
}else if (hashEqual(currentChatmodel.contenType, Content_Picture)){
@@ -74,6 +77,8 @@ + (CGFloat)heightForMessage:(ChatModel *)currentChatmodel premodel:(ChatModel *)
7477
}else{
7578
height = 120;
7679
}
80+
//验证是否群聊
81+
[self groupChatConfig:currentChatmodel];
7782
return currentChatmodel.messageHeight += currentChatmodel.shouldShowTime ? height + 50 : height + 15;
7883
//视频
7984
}else if (hashEqual(currentChatmodel.contenType, Content_Video)){
@@ -102,90 +107,150 @@ + (void)groupChatConfig:(ChatModel *)chatModel
102107
#pragma marl - 创建发送消息模型
103108
+ (ChatModel *)creatMessageModel:(ChatModel *)config
104109
{
105-
ChatModel *messageModel = [[ChatModel alloc]init];
106-
ChatContentModel *content = [[ChatContentModel alloc]init];
107-
messageModel.content = content;
108-
messageModel.fromUserID = [Account account].myUserID;
109-
messageModel.toUserID = config.toUserID;
110-
messageModel.messageType = @"normal";
111-
messageModel.chatType = config.chatType;
112-
messageModel.deviceType = @"iOS";
113-
messageModel.versionCode = TCP_VersionCode;
114-
messageModel.byMyself = @1;
115-
messageModel.isSend = @0;
116-
messageModel.isRead = @0;
117-
messageModel.beatID = TCP_beatBody;
118-
messageModel.fromPortrait = [Account account].portrait;
119-
messageModel.toNickName = config.toNickName;
120-
messageModel.groupID = config.groupID;
121-
messageModel.noDisturb = config.noDisturb;
122-
return messageModel;
110+
ChatModel * chatModel = [[ChatModel alloc]init];
111+
ChatContentModel *content = [[ChatContentModel alloc]init];
112+
chatModel.content = content;
113+
chatModel.fromUserID = [Account account].myUserID;
114+
chatModel.toUserID = config.toUserID;
115+
chatModel.messageType = @"normal";
116+
chatModel.chatType = config.chatType;
117+
chatModel.deviceType = @"iOS";
118+
chatModel.versionCode = TCP_VersionCode;
119+
chatModel.byMyself = @1;
120+
chatModel.isSend = @0;
121+
chatModel.isRead = @0;
122+
chatModel.isSending = @1;
123+
chatModel.beatID = TCP_beatBody;
124+
chatModel.fromPortrait = [Account account].portrait;
125+
chatModel.toPortrait = config.toPortrait;
126+
chatModel.toNickName = config.toNickName;
127+
chatModel.groupID = config.groupID;
128+
chatModel.groupName = config.groupName;
129+
chatModel.noDisturb = config.noDisturb;
130+
131+
return chatModel;
123132
}
124133

125-
#pragma mark - 创建聊天资源缓存
126-
+ (void)creatLocalCacheSource:(ChatAlbumModel *)albumModel chat:(ChatModel *)chatModel
134+
//初始化文本消息模型
135+
+ (ChatModel *)initTextMessage:(NSString *)text config:(ChatModel *)config
136+
{
137+
ChatModel *textModel = [self creatMessageModel:config];
138+
textModel.contenType = Content_Text;
139+
textModel.content.text = text;
140+
return textModel;
141+
}
142+
//初始化语音消息模型
143+
+ (ChatModel *)initAudioMessage:(ChatAlbumModel *)audio config:(ChatModel *)config
127144
{
145+
ChatModel *audioModel = [self creatMessageModel:config];
146+
audioModel.contenType = Content_Audio;
147+
audioModel.content.seconds = audio.duration;
148+
128149
NSString *basePath = nil;
129-
if (hashEqual(chatModel.chatType, @"userChat")) {
130-
basePath = [ChatCache_Path stringByAppendingPathComponent:chatModel.toUserID];
150+
if (hashEqual(config.chatType, @"userChat")) {
151+
basePath = [ChatCache_Path stringByAppendingPathComponent:config.toUserID];
131152
}else{
132-
basePath = [ChatCache_Path stringByAppendingPathComponent:chatModel.groupID];
153+
basePath = [ChatCache_Path stringByAppendingPathComponent:config.groupID];
133154
}
134155

135156
NSFileManager *manager = [NSFileManager defaultManager];
136157
BOOL exist = [manager fileExistsAtPath:basePath];
137158
if (!exist) {
138159
[manager createDirectoryAtPath:basePath withIntermediateDirectories:YES attributes:nil error:NULL];
139160
}
140-
141-
//////////////////资源缓存
142-
//压缩比
143-
CGFloat compressScale = 1;
144-
NSData *smallAlbumData = nil;
145-
NSData *albumData = nil;
146-
//用户选择了原图
147-
if (albumModel.isOrignal) {
161+
//语音写入缓存
162+
NSString *name = [NSString stringWithFormat:@"ChatAudio_%@.mp3",audioModel.sendTime];
163+
[audio.audioData writeToFile:[basePath stringByAppendingPathComponent:name] atomically:YES];
164+
return audioModel;
165+
}
166+
//初始化图片消息模型
167+
+ (NSArray<ChatModel *> *)initPicMessage:(NSArray<ChatAlbumModel *> *)pics config:(ChatModel *)config
168+
{
169+
NSMutableArray *tmpArray = [NSMutableArray array];
170+
for (ChatAlbumModel *pic in pics) {
148171

149-
//压缩过的小图缓存 (用户界面展示,节省资源)
150-
if (albumModel.orignalData.length/1024.0) { //小于3M的
151-
152-
compressScale = 0.1; //压缩10倍
153-
}else{ //大于3M
154-
155-
compressScale = 0.05; //压缩20倍
172+
//创建图片模型
173+
ChatModel *picModel = [self creatMessageModel:config];
174+
picModel.contenType = Content_Picture;
175+
picModel.content.picSize = pic.picSize;
176+
picModel.content.fileName = pic.name;
177+
[tmpArray addObject:picModel];
178+
179+
NSString *basePath = nil;
180+
if (hashEqual(config.chatType, @"userChat")) {
181+
basePath = [ChatCache_Path stringByAppendingPathComponent:config.toUserID];
182+
}else{
183+
basePath = [ChatCache_Path stringByAppendingPathComponent:config.groupID];
156184
}
157-
UIImage *image = [UIImage imageWithData:albumModel.orignalData];
158-
//小图data
159-
smallAlbumData = UIImageJPEGRepresentation(image, compressScale);
160-
//原图data
161-
albumData = albumModel.orignalData;
162185

163-
//默认选择,未选择原图
164-
}else{
186+
NSFileManager *manager = [NSFileManager defaultManager];
187+
BOOL exist = [manager fileExistsAtPath:basePath];
188+
if (!exist) {
189+
[manager createDirectoryAtPath:basePath withIntermediateDirectories:YES attributes:nil error:NULL];
190+
}
165191

166-
//压缩过的小图缓存 (用户界面展示,节省资源)
167-
if (albumModel.normalData.length/1024.0) { //小于3M的
192+
//////////////////资源缓存
193+
//压缩比
194+
CGFloat compressScale = 1;
195+
NSData *smallAlbumData = nil;
196+
NSData *albumData = nil;
197+
//用户选择了原图
198+
if (pic.isOrignal) {
199+
200+
//压缩过的小图缓存 (用户界面展示,节省资源)
201+
if (pic.orignalPicData.length/1024.0/1024.0 < 3) { //小于3M的
202+
203+
compressScale = 0.1; //压缩10倍
204+
}else{ //大于3M
205+
206+
compressScale = 0.05; //压缩20倍
207+
}
208+
UIImage *image = [UIImage imageWithData:pic.orignalPicData];
209+
//小图data
210+
smallAlbumData = UIImageJPEGRepresentation(image, compressScale);
211+
//原图data
212+
albumData = pic.orignalPicData;
213+
214+
//默认选择,未选择原图
215+
}else{
168216

169-
compressScale = 0.1; //压缩10倍
170-
}else{ //大于3M
217+
//压缩过的小图缓存 (用户界面展示,节省资源)
218+
if (pic.normalPicData.length/1024.0/1024.0 < 3) { //小于3M的
219+
220+
compressScale = 0.1; //压缩10倍
221+
}else{ //大于3M
222+
223+
compressScale = 0.05; //压缩20倍
224+
}
171225

172-
compressScale = 0.05; //压缩20倍
226+
UIImage *image = [UIImage imageWithData:pic.normalPicData];
227+
//小图data
228+
smallAlbumData = UIImageJPEGRepresentation(image, compressScale);
229+
//原图data
230+
albumData = pic.normalPicData;
173231
}
174-
175-
UIImage *image = [UIImage imageWithData:albumModel.normalData];
176-
//小图data
177-
smallAlbumData = UIImageJPEGRepresentation(image, compressScale);
178-
//原图data
179-
albumData = albumModel.normalData;
232+
//小图缓存路径
233+
NSString *smallDetailPath = [basePath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@_%@",@"small",pic.name]];
234+
//原图缓存路径
235+
NSString *detailPath = [basePath stringByAppendingPathComponent:pic.name];
236+
//小图写入缓存
237+
[smallAlbumData writeToFile:smallDetailPath atomically:YES];
238+
//原图写入缓存
239+
[albumData writeToFile:detailPath atomically:YES];
180240
}
181-
//小图缓存路径
182-
NSString *smallDetailPath = [basePath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@_%@",@"small",albumModel.name]];
183-
//原图缓存路径
184-
NSString *detailPath = [basePath stringByAppendingPathComponent:albumModel.name];
185-
//小图写入缓存
186-
[smallAlbumData writeToFile:smallDetailPath atomically:YES];
187-
//原图写入缓存
188-
[albumData writeToFile:detailPath atomically:YES];
241+
return tmpArray;
242+
}
243+
//初始化视频消息模型
244+
+ (ChatModel *)initVideoMessage:(ChatAlbumModel *)video config:(ChatModel *)config
245+
{
246+
return nil;
189247
}
190248

249+
250+
251+
252+
253+
254+
255+
191256
@end

CocoaAsyncSocket_TCP/ChatModel/ChatAlbumModel.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,18 @@
1717
//大小
1818
@property (nonatomic, copy) NSString *size;
1919
//图片压缩过的data
20-
@property (nonatomic, strong) NSData *normalData;
20+
@property (nonatomic, strong) NSData *normalPicData;
2121
//图片无压缩data
22-
@property (nonatomic, strong) NSData *orignalData;
22+
@property (nonatomic, strong) NSData *orignalPicData;
23+
//音频data
24+
@property (nonatomic, strong) NSData *audioData;
2325
//图片尺寸
2426
@property (nonatomic, assign) CGSize picSize;
2527
//视频缓存地址
2628
@property (nonatomic, copy) NSString *videoCachePath;
2729
//视频缩略图
2830
@property (nonatomic, strong) UIImage *videoCoverImg;
29-
//视频时长
30-
@property (nonatomic, copy) NSString *videoDuration;
31+
//视频 , 语音时长
32+
@property (nonatomic, copy) NSString *duration;
3133

3234
@end

CocoaAsyncSocket_TCP/ChatModel/ChatModel.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,8 @@ typedef NS_ENUM(NSInteger){
128128

129129
@property (nonatomic, assign) CGSize picSize; //图片尺寸
130130

131+
@property (nonatomic, strong) NSString *seconds; //时长
132+
131133
@property (nonatomic, copy) NSString *fileName; //文件名
132134

133135
@property (nonatomic, strong) NSNumber *videoDuration; //语音时长

CocoaAsyncSocket_TCP/Comon/Category/UIImage+photoPicker.m

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ + (void)getVideoPathFromPHAsset:(PHAsset *)asset cachePath:(NSString *)basePath
8181
//缓存路径
8282
videoModel.videoCachePath = PATH_MOVIE_FILE;
8383
//视频时长
84-
videoModel.videoDuration = [@(asset.duration)stringValue];
84+
videoModel.duration = [@(asset.duration)stringValue];
8585

8686
//异步存储
8787
dispatch_async(dispatch_get_global_queue(0, 0), ^{
@@ -239,7 +239,7 @@ + (void)openPhotoPickerGetImages:(photoPickerImagesCallback)imagesCallback targe
239239

240240
NSString *name = [[info[@"PHImageFileSandboxExtensionTokenKey"]componentsSeparatedByString:@"/"]lastObject];
241241
imageModel.name = [NSString stringWithFormat:@"chatPicture_%@%@",getCurrentTime(),name];
242-
imageModel.orignalData = data;
242+
imageModel.orignalPicData = data;
243243
imageModel.picSize = photo.size;
244244
imageModel.size = [@(data.length)stringValue];
245245

@@ -278,7 +278,7 @@ + (void)openPhotoPickerGetImages:(photoPickerImagesCallback)imagesCallback targe
278278
UIImage *orignalImg = orignalImageArray[idx];
279279
NSString *name = [[info[@"PHImageFileSandboxExtensionTokenKey"]componentsSeparatedByString:@"/"]lastObject];
280280
imageModel.name = [NSString stringWithFormat:@"chatPicture_%@%@",getCurrentTime(),name];
281-
imageModel.normalData = normalData;
281+
imageModel.normalPicData = normalData;
282282
imageModel.picSize = orignalImg.size;
283283
imageModel.size = [@(normalData.length)stringValue];
284284
//回调数据 2

CocoaAsyncSocket_TCP/Comon/Constant.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,10 @@ static NSString *defaulUserIcon = @"userhead"; //文本,表情消息
5151
*/
5252
static NSString *ChatlistTitle = @"聊天列表"; //聊天列表标题
5353

54-
55-
54+
/*
55+
聊天通知
56+
*/
57+
static NSString *ChatKeyboardResign = @"ChatKeyboardShouldResignFirstResponder"; //键盘失去第一响应者
5658

5759

5860

CocoaAsyncSocket_TCP/Comon/Helper/MYCoreTextLabel/MYCoreTextLabel.m

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ - (void)layoutSubviews
139139
#pragma mark - 添加链接,公共接口
140140
- (void)setText:(NSString *)text customLinks:(NSArray<NSString *> *)customLinks keywords:(NSArray<NSString *> *)keywords
141141
{
142+
if (!text.length) text = @" ";
142143
_text = text;
143144
_customLinks = customLinks;
144145
_keywords = keywords;

0 commit comments

Comments
 (0)