在做即时通讯时,自定义消息

作者: Lionel_Messi | 来源:发表于2017-06-22 10:33 被阅读33次

前言:

(有可能您是高手,并不觉的怎么样,我第一次搞即时通讯,最初还是懵逼状态的,感觉有点变态☺,项目用的是阿里百川的旺信集成的哦)

我们的产品需要的效果是“当用户通过输入框输入特殊字的时候,在消息中用蓝色标记这个字体,并实现点击跳转”。

实现思路:

经过一天多的思考,最终确定下了解决方案,第一,检测消息的发送周期(需要设置代理,遵循YWMessageLifeDelegate),当文本消息将要发送的时候,检测是否含有关键字,(参考了demo中,关于关键字屏蔽的原理,就像你聊天时输入骂人的话会被取消发送并本地提示你含有违规字体一样。)当检测到含有关键字的时候,用自己定义的消息体发送,当没有的时候,走正常的逻辑。第二,自定义完消息体后,也要根据demo中所写的一样,自己实现viewmodel(所用到的数据)和view(所要显示的样式),这样才能将三者联系到一起,就能实现需求了。

检测生命周期的方法:

/**

*  监听自己发送的消息的生命周期

*/

- (void)exampleListenMyMessageLife

{

[[self.ywIMKit.IMCore getConversationService] addMessageLifeDelegate:self forPriority:YWBlockPriorityDeveloper];

}

/// 当你监听了消息生命周期,IMSDK会回调以下两个函数

- (YWMessageLifeContext *)messageLifeWillSend:(YWMessageLifeContext *)aContext

{

/// 你可以通过返回context,来实现改变消息的能力

if ([aContext.messageBody isKindOfClass:[YWMessageBodyText class]]) {

NSString *text = [(YWMessageBodyText *)aContext.messageBody messageText];

if ([text rangeOfString:@"发轮功事件"].location != NSNotFound) {

YWMessageBodySystemNotify *bodyNotify = [[YWMessageBodySystemNotify alloc] initWithContent:@"消息包含违禁词语"];

[aContext setMessageBody:bodyNotify];

NSDictionary *params = @{kYWMsgCtrlKeyClientLocal:@{kYWMsgCtrlKeyClientLocalKeyOnlySave:@(YES)}};

[aContext setControlParameters:params];

return aContext;

}

}

return nil;

}

- (void)messageLifeDidSend:(NSString *)aMessageId conversationId:(NSString *)aConversationId result:(NSError *)aResult

{

/// 你可以在消息发送完成后,做一些事情,例如播放一个提示音等等

}

这段是demo中的代码,应该都能看懂,就在将要发送的代理中,根据自己的需求,返回自己的消息体即可。下面是添加自定义的view和viewmodel的方法:

/// 设置用于显示自定义消息的ChatView

/// ChatView一般从ViewModel中获取已经解析的数据,用于显示

[self setHook4BubbleView:^YWBaseBubbleChatView *(YWBaseBubbleViewModel *viewModel) {

if ([viewModel isKindOfClass:[SPCallingCardBubbleViewModel class]]) {

SPCallingCardBubbleChatView *chatView = [[SPCallingCardBubbleChatView alloc] init];

return chatView;

}

else if ([viewModel isKindOfClass:[SPGreetingBubbleViewModel class]]) {

SPGreetingBubbleChatView *chatView = [[SPGreetingBubbleChatView alloc] init];

return chatView;

}

else if ([viewModel isKindOfClass:[SPBubbleViewModelCustomize class]]) {

SPBaseBubbleChatViewCustomize *chatView = [[SPBaseBubbleChatViewCustomize alloc] init];

return chatView;

}

return nil;

}];

/// 设置用于显示自定义消息的ViewModel

/// ViewModel,顾名思义,一般用于解析和存储结构化数据

[self setHook4BubbleViewModel:^YWBaseBubbleViewModel *(idmessage) {

if ([[message messageBody] isKindOfClass:[YWMessageBodyCustomize class]]) {

YWMessageBodyCustomize *customizeMessageBody = (YWMessageBodyCustomize *)[message messageBody];

NSData *contentData = [customizeMessageBody.content dataUsingEncoding:NSUTF8StringEncoding];

NSDictionary *contentDictionary = [NSJSONSerialization JSONObjectWithData:contentData

options:0

error:NULL];

NSString *messageType = contentDictionary[kSPCustomizeMessageType];

if ([messageType isEqualToString:@"CallingCard"]) {

SPCallingCardBubbleViewModel *viewModel = [[SPCallingCardBubbleViewModel alloc] initWithMessage:message];

return viewModel;

}

else if ([messageType isEqualToString:@"Greeting"]) {

SPGreetingBubbleViewModel *viewModel = [[SPGreetingBubbleViewModel alloc] initWithMessage:message];

return viewModel;

}

else {

SPBubbleViewModelCustomize *viewModel = [[SPBubbleViewModelCustomize alloc] initWithMessage:message];

return viewModel;

}

}

return nil;

}];

实现了这三个,就能完成这个需求了!

相关文章

  • 在做即时通讯时,自定义消息

    前言: (有可能您是高手,并不觉的怎么样,我第一次搞即时通讯,最初还是懵逼状态的,感觉有点变态☺,项目用的是阿里百...

  • 环信SDK 自定义扩展消息

    项目中集成了环信即时通讯,但是项目需要自定义消息类型,看环信发送消息方法,在发送消息的时候可以附加自定义的内容。 ...

  • 如何选择即时通讯应用的数据传输格式

    前言 即时通讯应用(包括IM聊天应用、实时消息推送应用等)开发的前期技术选型时,关于数据传输格式的选择,在即时通讯...

  • 自定义消息

    基于窗体应用程序使用自定义的消息 在头文件中定义消息编号 WM_USER以下的消息都是系统消息,所以自定义消息时,...

  • git上传文件大小超限

    最近在做集成融云IM即时通讯功能时,git push提交代码更新时遇到了错误提示:remote: error: F...

  • Swift JPush极光推送通知和自定义消息

    在开始之前,首先了解下自定义消息和通知的几点区别。 自定义消息和通知的区别 收到推送自定义消息时推送通知栏不显示 ...

  • layer-list被拉伸问题

    在 layer-list 中的自定义 shape设定的大小无效 最近在做自定义 shape 效果时发现,自定义sh...

  • 到底什么是高并发?

    在即时通讯网社区里,多是做IM、消息推送、客服系统、音视频聊天这类实时通信方面的开发者,在涉及到即时通讯技术时聊的...

  • 小程序自定义组件如何自适应高度

    自定义组件高度问题 下图可以看出:在做一个展示聊天消息的组件时,由于“组件高度”依赖于聊天内容,所以导致没有显式指...

  • Android-IM消息接收事件之EventBus的应用

    在即时通讯中需要不断接收服务端的消息。 JMessage提供了Event来匹配本地和服务端的消息接收。 在即时通讯...

网友评论

    本文标题:在做即时通讯时,自定义消息

    本文链接:https://www.haomeiwen.com/subject/bcwxcxtx.html