
iPod.gif

iPhone.gif
- 上一篇已實現(xiàn)多張圖片的發(fā)送
- 接下來實現(xiàn)傳輸進度的回調(diào)
- 實現(xiàn)單個及多個視頻的發(fā)送,視頻的傳輸跟圖片傳輸策略是一樣的 只是獲取視頻流比圖片多幾部操作而已
一.傳輸進度回調(diào) 新建 HJProgressHub 類,在ChatMessageCell 根據(jù)狀態(tài)顯示隱藏
#import "HJProgressHub.h"
@interface HJProgressHub()
/// 菊花
@property (nonatomic, strong) UIActivityIndicatorView *indicatorView;
/// 灰色的板子
@property (nonatomic, strong) UIView *grayView;
/// 進度label
@property (nonatomic, strong) UILabel *progressLabel;
@end
SocketManager 代理回調(diào)中 取出當前cell賦值操作
#pragma mark - SocketManagerDelegate
- (void)socketManager:(SocketManager *)manager itemUpingrefresh:(ChatMessageModel *)upingItem{
// 刷新當前進度
ChatMessageCell *cell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:upingItem.locationIndex inSection:0]];
cell.progressHub.progress = 1.0 * upingItem.upSize / upingItem.fileSize;
}
二.視頻資源的獲取 同樣是由 ESKeyboardToolView 觸發(fā)
- (void)sendImageOrVideo{
WS(weakSelf);
[[PickerImageVideoTool sharePickerImageVideoTool] showImagePickerWithMaxCount:9 completion:^(NSArray<UIImage *> *photos, NSArray *assets) {
NSInteger count = assets.count;
id objc = nil;
for (NSInteger i = 0; i < count; i++) {
objc = assets[i];
if (![objc isKindOfClass:[PHAsset class]]) {
continue;
}
PHAsset *asset = (PHAsset *)objc;
ChatMessageModel *messageM = [ChatMessageModel new];
messageM.isFormMe = YES;
messageM.userName = [UIDevice currentDevice].name;
messageM.asset = asset;
messageM.fileName = [ZPPublicMethod getAssetsName:asset only:YES];
if (asset.mediaType == PHAssetMediaTypeImage){
messageM.temImage = photos[i];
[weakSelf pickImageHandle:messageM];
}else if (asset.mediaType == PHAssetMediaTypeVideo) {
messageM.chatMessageType = ChatMessageVideo;
[weakSelf pickVideoHandle:messageM];
}else if (asset.mediaType == PHAssetMediaTypeAudio){
messageM.chatMessageType = ChatMessageAudio;
}
}
}];
}
// 獲取圖片的操作
- (void)pickImageHandle:(ChatMessageModel*)messageM{
messageM.chatMessageType = ChatMessageImage;
messageM.fileSize = UIImagePNGRepresentation(messageM.temImage).length;
SDImageCache *cache = [SDImageCache sharedImageCache];
[cache storeImage:messageM.temImage forKey:messageM.fileName toDisk:YES completion:^{
messageM.showImageUrl = [NSURL fileURLWithPath:[cache defaultCachePathForKey:messageM.fileName]];
NSLog(@"imgMessageUrl = %@",messageM.mediaMessageUrl);
}];
[self sendMessageWithItem:messageM];
}
獲取視頻的操作
- (void)pickVideoHandle:(ChatMessageModel *)messageM{
// 視頻getPhotoWithAsset
[ZPPublicMethod getfilePath:messageM.asset Complete:^(NSURL *fileUrl) {
messageM.fileSize = [ZPPublicMethod getFileSize:[[fileUrl absoluteString] substringFromIndex:8]];
[ZPPublicMethod getThumbnail:messageM.asset size:CGSizeMake(375, 667) result:^(UIImage *thumImage) {
if (messageM.temImage == nil) {
messageM.temImage = thumImage;
SDImageCache *cache = [SDImageCache sharedImageCache];
NSString *keyStr = [messageM.fileName stringByAppendingString:@".JPG"];
[cache storeImage:messageM.temImage forKey:keyStr toDisk:YES completion:^{
messageM.showImageUrl = [NSURL fileURLWithPath:[cache defaultCachePathForKey:keyStr]];
}];
[self sendMessageWithItem:messageM];
}
}];
}];
}
通過PHAsset 獲取資源URL地址方法實現(xiàn)
/// 通 PHAsset 獲取文件url
+ (void)getfilePath:(PHAsset *)asset Complete:(void(^)(NSURL *fileUrl))result{
if (asset.mediaType == PHAssetMediaTypeVideo) {
PHVideoRequestOptions *videoOption = [[PHVideoRequestOptions alloc] init];
videoOption.version = PHVideoRequestOptionsVersionOriginal;
[[PHImageManager defaultManager] requestAVAssetForVideo:asset options:videoOption resultHandler:^(AVAsset * _Nullable videoAsset, AVAudioMix * _Nullable audioMix, NSDictionary * _Nullable info) {
AVURLAsset *urlAsset = (AVURLAsset *)videoAsset;
result(urlAsset.URL);
}];
}else if (asset.mediaType == PHAssetMediaTypeImage){
// 獲取圖片資源路徑
PHContentEditingInputRequestOptions *reqOption = [[PHContentEditingInputRequestOptions alloc] init];
reqOption.canHandleAdjustmentData = ^(PHAdjustmentData * _Nonnull adjustmentData) {
return YES;
};
[asset requestContentEditingInputWithOptions:reqOption completionHandler:^(PHContentEditingInput * _Nullable contentEditingInput, NSDictionary * _Nonnull info) {
result(contentEditingInput.fullSizeImageURL);
}];
}
}
通過PHAsset 獲取資源縮略圖
+ (void)getThumbnail:(PHAsset *)asset size:(CGSize)size result:(void(^)(UIImage *thumImage))result{
PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
options.version = PHImageRequestOptionsVersionCurrent;
[[PHImageManager defaultManager] requestImageForAsset:asset
targetSize:size
contentMode:PHImageContentModeAspectFill
options:nil
resultHandler:^(UIImage *image, NSDictionary *info) {
dispatch_async(dispatch_get_main_queue(), ^{
if (result) {
result(image);
}
});
}];
}
SocketManager 中只需把昨天預留處理視頻的地方寫下就OK
// 圖片或者視頻文件傳輸
- (void)imageOrVideoFileSend:(ChatMessageModel *)sendItem{
if (sendItem.chatMessageType == ChatMessageImage) {
NSData *sendData = UIImagePNGRepresentation(sendItem.temImage);
[self writeMediaMessageWithData:sendData];
}else if (sendItem.chatMessageType == ChatMessageVideo){
PHAsset *asset = (PHAsset *)sendItem.asset;
[ZPPublicMethod getfilePath:asset Complete:^(NSURL *fileUrl) {
dispatch_sync(dispatch_get_main_queue(), ^{
sendItem.mediaMessageUrl = fileUrl;
NSData *sendData = [NSData dataWithContentsOfURL:sendItem.mediaMessageUrl options:NSDataReadingMappedIfSafe error:nil];
[self writeMediaMessageWithData:sendData];
});
}];
}
}