Skip to content
This repository has been archived by the owner on Jul 2, 2019. It is now read-only.

Commit

Permalink
v0.6.3 支持群定向消息
Browse files Browse the repository at this point in the history
  • Loading branch information
ChenYilong committed Aug 23, 2016
1 parent c8dc323 commit 4498ff3
Show file tree
Hide file tree
Showing 9 changed files with 100 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ - (instancetype)initWithClientId:(NSString *)clientId conversationType:(LCCKCon
[self lcck_setObject:@"有人向您发送了一条名片消息,请打开APP查看" forKey:LCCKCustomMessageSummaryKey];
[self lcck_setObject:@(conversationType) forKey:LCCKCustomMessageConversationTypeKey];
[self lcck_setObject:clientId forKey:@"clientId"];
//定向群消息,仅部分用户可见,需要实现 `-setFilterMessagesBlock:`, 详情见 LCChatKitExample 中的演示
//[self lcck_setObject:@[ @"Tom", @"Jerry" ] forKey:LCCKCustomMessageOnlyVisiableForPartClientIds];
return self;
}

Expand Down
23 changes: 23 additions & 0 deletions ChatKit-OC/Example/LCChatKitExample.m
Original file line number Diff line number Diff line change
Expand Up @@ -391,6 +391,29 @@ - (void)exampleInit {
!completionHandler ?: completionHandler(NO, error);

}];

// //这里演示群定向消息:
// [[LCChatKit sharedInstance] setFilterMessagesBlock:^(AVIMConversation *conversation, NSArray<AVIMTypedMessage *> *messages, LCCKFilterMessagesCompletionHandler completionHandler) {
// if (conversation.lcck_type == LCCKConversationTypeSingle) {
// completionHandler(messages ,nil);
// return;
// }
// //群聊
// NSMutableArray *filterMessages = [NSMutableArray arrayWithCapacity:messages.count];
// for (AVIMTypedMessage *typedMessage in messages) {
// NSArray *visiableForPartClientIds = [typedMessage.attributes valueForKey:LCCKCustomMessageOnlyVisiableForPartClientIds];
// if (!visiableForPartClientIds) {
// [filterMessages addObject:typedMessage];
// } else if (visiableForPartClientIds.count > 0) {
// BOOL visiableForCurrentClientId = [visiableForPartClientIds containsObject:[LCChatKit sharedInstance].clientId];
// if (visiableForCurrentClientId) {
// [filterMessages addObject:typedMessage];
// }
// }
// }
// completionHandler([filterMessages copy] ,nil);
// }];

}

+ (void)tryPresentViewControllerViewController:(UIViewController *)viewController {
Expand Down
2 changes: 1 addition & 1 deletion ChatKit.podspec
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Pod::Spec.new do |s|
s.name = "ChatKit"
s.version = "0.6.2"
s.version = "0.6.3"
s.summary = "An IM App Framework, support sending text, pictures, audio, video, location messaging, managing address book, more interesting features."
s.homepage = "https://github.com/LeanCloud/ChatKit-OC"
s.license = { :type => 'MIT', :file => 'LICENSE' }
Expand Down
4 changes: 4 additions & 0 deletions ChatKit/Class/LCChatKit.m
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,10 @@ - (void)setLoadLatestMessagesHandler:(LCCKLoadLatestMessagesHandler)loadLatestMe
[self.conversationService setLoadLatestMessagesHandler:loadLatestMessagesHandler];
}

- (void)setFilterMessagesBlock:(LCCKFilterMessagesBlock)filterMessagesBlock {
[self.conversationService setFilterMessagesBlock:filterMessagesBlock];
}

- (void)createConversationWithMembers:(NSArray *)members type:(LCCKConversationType)type unique:(BOOL)unique callback:(AVIMConversationResultBlock)callback {
[self.conversationService createConversationWithMembers:members type:type unique:unique callback:callback];
}
Expand Down
40 changes: 28 additions & 12 deletions ChatKit/Class/Model/NSMutableArray+LCCKMessageExtention.m
Original file line number Diff line number Diff line change
Expand Up @@ -7,24 +7,40 @@
//

#import "NSMutableArray+LCCKMessageExtention.h"
#import "AVIMTypedMessage+LCCKExtension.h"
#import "LCCKMessage.h"
#if __has_include(<ChatKit/LCChatKit.h>)
#import <ChatKit/LCChatKit.h>
#else
#import "LCChatKit.h"
#endif

@implementation NSMutableArray (LCCKMessageExtention)

+ (NSMutableArray *)lcck_messagesWithAVIMMessages:(NSArray *)avimTypedMessage {
NSMutableArray *messages = @[].mutableCopy;
+ (NSMutableArray *)lcck_messagesWithAVIMMessages:(NSArray *)avimTypedMessages {
__block NSMutableArray *messages = @[].mutableCopy;
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
//dispatch_group_notify(group, queue, ^{//..});
NSLock *arrayLock = [[NSLock alloc] init];
dispatch_group_async(group, queue, ^{
for (AVIMTypedMessage *typedMessage in avimTypedMessage) {
id message = [LCCKMessage messageWithAVIMTypedMessage:typedMessage];
if (message) {
[messages addObject:message];

void(^filterdMessageCallback)(NSArray *_avimTypedMessages) = ^(NSArray *_avimTypedMessages) {
for (AVIMTypedMessage *typedMessage in _avimTypedMessages) {
id message = [LCCKMessage messageWithAVIMTypedMessage:typedMessage];
if (message) {
[messages addObject:message];
}
}
}
};

LCCKFilterMessagesBlock filterMessagesBlock = [LCCKConversationService sharedInstance].filterMessagesBlock;
if (filterMessagesBlock) {
LCCKFilterMessagesCompletionHandler filterMessagesCompletionHandler = ^(NSArray *filterMessages, NSError *error) {
if (!error) {
!filterdMessageCallback ?: filterdMessageCallback([filterMessages copy]);
}
};
filterMessagesBlock([LCCKConversationService sharedInstance].currentConversation, avimTypedMessages, filterMessagesCompletionHandler);
} else {
!filterdMessageCallback ?: filterdMessageCallback(avimTypedMessages);
}
});
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);//doSomethingWith:
return messages;
Expand All @@ -42,7 +58,7 @@ - (id)lcck_messageAtIndex:(NSUInteger)index {
return self[index];
}
NSLog(@" `self.avimTypedMessage` in `-loadOldMessages` has no object");
// NSAssert(valid, @" `self.avimTypedMessage` in `-loadOldMessages` has no object");
// NSAssert(valid, @" `self.avimTypedMessage` in `-loadOldMessages` has no object");
return nil;
}

Expand Down
39 changes: 28 additions & 11 deletions ChatKit/Class/Module/Conversation/Model/LCCKConversationViewModel.m
Original file line number Diff line number Diff line change
Expand Up @@ -102,24 +102,40 @@ - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPa

- (void)receiveMessage:(NSNotification *)notification {
NSDictionary *userInfo = notification.object;
NSArray<AVIMTypedMessage *> *messages = userInfo[LCCKDidReceiveMessagesUserInfoMessagesKey];
__block NSArray<AVIMTypedMessage *> *messages = userInfo[LCCKDidReceiveMessagesUserInfoMessagesKey];
AVIMConversation *conversation = userInfo[LCCKDidReceiveMessagesUserInfoConversationKey];
BOOL isCurrentConversationMessage = [conversation.conversationId isEqualToString:self.parentConversationViewController.conversation.conversationId];
if (isCurrentConversationMessage) {
AVIMConversation *currentConversation = self.parentConversationViewController.conversation;
if (currentConversation.muted == NO) {
[[LCCKSoundManager defaultManager] playReceiveSoundIfNeed];
}
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
NSArray *lcckMessages = [NSMutableArray lcck_messagesWithAVIMMessages:messages];
dispatch_async(dispatch_get_main_queue(),^{
[self receivedOneMessages:lcckMessages];

void(^filterdMessageCallback)(NSArray *messages) = ^(NSArray *messages) {
AVIMConversation *currentConversation = self.parentConversationViewController.conversation;
if (currentConversation.muted == NO) {
[[LCCKSoundManager defaultManager] playReceiveSoundIfNeed];
}
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
NSArray *lcckMessages = [NSMutableArray lcck_messagesWithAVIMMessages:messages];
dispatch_async(dispatch_get_main_queue(),^{
[self receivedNewMessages:lcckMessages];
});
});
});
};

LCCKFilterMessagesBlock filterMessagesBlock = [LCCKConversationService sharedInstance].filterMessagesBlock;
if (filterMessagesBlock) {
LCCKFilterMessagesCompletionHandler filterMessagesCompletionHandler = ^(NSArray *filterMessages, NSError *error) {
if (!error) {
!filterdMessageCallback ?: filterdMessageCallback([filterMessages copy]);
}
};
filterMessagesBlock(conversation, messages, filterMessagesCompletionHandler);
} else {
!filterdMessageCallback ?: filterdMessageCallback(messages);
}

}
}

- (void)receivedOneMessages:(NSArray *)messages {
- (void)receivedNewMessages:(NSArray *)messages {
[self appendMessagesToTrailing:messages];
if ([self.delegate respondsToSelector:@selector(reloadAfterReceiveMessage)]) {
[self.delegate reloadAfterReceiveMessage];
Expand Down Expand Up @@ -165,6 +181,7 @@ - (void)appendMessagesToDataArrayTrailing:(NSArray *)messages {
}
}
}

/*!
* 与`-addMessages`方法的区别在于,第一次加载历史消息时需要查找最后一条消息之余还有没有消息。
* 时间戳必须传0,后续方法会根据是否为了0,来判断是否是第一次进对话页面。
Expand Down
12 changes: 12 additions & 0 deletions ChatKit/Class/Tool/LCCKServiceDefinition.h
Original file line number Diff line number Diff line change
Expand Up @@ -355,6 +355,18 @@ typedef void (^LCCKConversationInvalidedHandler) (NSString *conversationId, LCCK
*/
- (void)setConversationInvalidedHandler:(LCCKConversationInvalidedHandler)conversationInvalidedHandler;

typedef void (^LCCKFilterMessagesCompletionHandler)(NSArray *filterMessages, NSError *error);
typedef void (^LCCKFilterMessagesBlock)(AVIMConversation *conversation, NSArray<AVIMTypedMessage *> *messages, LCCKFilterMessagesCompletionHandler completionHandler);

/*!
* 用于筛选消息,比如:群定向消息、筛选黑名单消息、黑名单消息
* @attention 同步方法异步方法皆可
*/
- (void)setFilterMessagesBlock:(LCCKFilterMessagesBlock)filterMessagesBlock;

@property (nonatomic, copy) LCCKFilterMessagesBlock filterMessagesBlock;

//TODO:未实现
typedef void (^LCCKLoadLatestMessagesHandler)(LCCKConversationViewController *conversationController, BOOL succeeded, NSError *error);

@property (nonatomic, copy) LCCKLoadLatestMessagesHandler loadLatestMessagesHandler;
Expand Down
1 change: 1 addition & 0 deletions ChatKit/Class/Tool/Service/LCCKConversationService.m
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ @implementation LCCKConversationService
@synthesize fetchConversationHandler = _fetchConversationHandler;
@synthesize conversationInvalidedHandler = _conversationInvalidedHandler;
@synthesize loadLatestMessagesHandler = _loadLatestMessagesHandler;
@synthesize filterMessagesBlock = _filterMessagesBlock;

/**
* 根据 conversationId 获取对话
Expand Down
2 changes: 1 addition & 1 deletion ChatKit/Class/Tool/Service/LCCKUserSystemService.m
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,7 @@ - (void)cacheUsers:(NSArray<id<LCCKUserDelegate>> *)users {
for (id<LCCKUserDelegate> user in users) {
@try {
NSString *clientId = [NSString stringWithString:user.clientId];
self.cachedUsers[clientId] = user;
[self.cachedUsers setObject:user forKey:clientId];
} @catch (NSException *exception) {}
}
}
Expand Down

0 comments on commit 4498ff3

Please sign in to comment.