网易云信自定义消息怎样实现ios端后台接收消息

16:12 提问
网易云信客服消息框弹出的代码是怎么搞的啊?
求大神来帮帮嘛啊。 开始看了文档但是还有些不明白的,想做一个东西 但是要用到云信来进行聊天的
按赞数排序网易云信CTO:通过IM云让开发者共享网易经验_网易科技
网易云信CTO:通过IM云让开发者共享网易经验
用微信扫码二维码
分享至好友和朋友圈
“网易出品,必属精品”,开发界流传的这句话对于大多数开发者并不陌生。网易云信,一个凝聚了网易公司15年技术积累的即时通讯云服务平台,凭借出色的稳定性以及对开发者的增益价值在上线8个月的时间内揽下7万+APP用户。近日,网易云信CTO阙杭宁向开发者分享了网易IM云的演变,云信的架构特点以及开发者生态等内容。(网易云信CTO阙杭宁)网易IM云演变云计算的架构,SOA)的自动化服务管理架构,其特征是资源池化、通过互联网交付的按需弹性、简单易用、可计量的服务。网易在即时通讯方面的自主研发已有近10年。网易泡泡是一款和QQ同一时期,也偏于PC时代的即时通讯产品,其架构也一直在持续迭代优化。在移动互联网发展的浪潮中,网易各种移动互联网产品也陆续上线发布,大多数产品都有很强的即时通讯需求,例如云音乐的私信功能、网易花田的社交通信、网易BoBo的连麦等等。云信即在网易泡泡架构的基础上,针对移动互联网的网络特性以及产品特性,做了全面的改造和升级,以基础设施的形态去承载了诸多网易亿级体量的产品稳定运行。(网易IM云的演变历程)2015年,为响应政府和总理“互联网+”计划,网易启动了云信对外服务的计划,并立项重构整个云信团队,聚集了网易公司内各团队的专家,并以产品团队牵头,对云信平台对外服务体系进行了设计与落地。也正是因为云信本身基础夯实,有足够重量级的产品开发对接经验以及线上稳定运维服务经验。所以项目启动不到一年,网易云信就通过了严密的测试和内部邀请试用各环节验证,在2015年10月正式对外发布了云信平台。接入网易云信的开发者需要和云信的技术团队、商务团队协作,双方共同努力适应新的部署模式和业务模式,确保IM顺利接入。在这个过程中,需要大量的技术细节沟通和产品代码的调整和对接,双方也要根据具体需要调整自己身产品和平台的功能和实现方式,大量实践之下对于接入IM功能的APP和云信的完善和成熟度也有很好的促进作用。网易云信架构特点阙杭宁认为可以用“稳定、务实”两个词来形容云信的架构特征。所谓稳定在上文已经提过产品验证方面的依据,而在架构本身,要做到真正稳定的效果,就需要各环节各子系统都做到抗抖动、抗单点风险和全面的实时监控和自动化应对,这些并不是靠理论基础就实现,需要通过业务实战一步步走过来。网易云信自泡泡开始至今,经过了无数次的技术升级,才有现在的稳定性体现。“务实”这个词似乎不会用来描述架构,阙杭宁表示他口中的“务实”是指网易云信在面对众多互联网产品上,做了数量庞大的细节优化去提高接入的产品体验,比如移动互联网弱网状态下的实时音视频数据包udp重传算法、舒适噪音、方便移动办公的多端消息漫游同步、可供开发自主定义的多端在线策略等等。同时面对开发者接入难度和便利性上,云信也做了非常多有助于各层次开发者快速自由接入的工作,例如提供了开发文档、入门教学视频、拥有精致交互和视觉的Demo开源项目、开源的UI组件及使用说明、提供了论坛放置了常见问题的处理(如安卓Demo导入的手把手教程)。网易云信实际地解决接入者的问题,并且帮助接入产品拥有和网易产品同样的优质体验。在消息稳定性、实时音视频质量、聊天室并发以及消息到达率和速度上,都有很好的效果。具体谈到IM云的架构特点,网易云信具有高可用,易扩展等大型分布式服务器架构共有的特征。网易多年以来积累了丰富的设计经验和产品服务经验,比如用于多媒体等文件的对象存储系统、分布式关系型数据库服务、分布式缓存服务、反垃圾集群系统等等,并都在网易系产品中广泛使用;而外部开发者并不能直接获得这些系统为开发工作所带来的便利,而云信作为PaaS平台,也作为媒介为开发者提供了一个良好的访问入口来使用这些服务;也正是有网易内部的平台,云信才能拥有良好的高可用,易扩展等特性,从而为开发者提供稳定的服务。网易云信的架构选择理念谈到近年来,新的编程语言(旧编程语言新用)的层出不穷,阙杭宁也分享了他的一些看法以及云信的架构选择理念。开发语言本身,各有优劣,网易云信的考量主要是两个维度,
第一是语言本身的普及程度以及语言特性是否可以满足系统需要;第二是团队本身的积累。他表示对于新语言或者新技术,网易云信会积极吸收和探索,但涉及到生产级的服务,云信还是倾向于先选用主流稳定的技术。因为新技术在缺乏大量实际产品验证的情况下,可能会存在一些难填的坑以及待添加完善的服务组件,这种不确定性会对产品和服务的稳定性带来危害进而损害用户的利益,所以云信的生产系统更多是使用成熟的语言来开发。成熟的编程语言代表拥有广泛的开发人员,更加适合大团队的开发作业。网易云信技术团队倡导的理念是先获得自身技术的突破,等待成熟以后再应用到商品化产品中。例如在保证产品性能稳定的同时,云信积极尝试新的语言和框架,例如网易云信实时音视频相关的新服务中使用了Golang。对于网易云信技术团队的发展和技术积累来说,阙杭宁希望所有人持有包容的态度来看待和学习新技术,每个云信技术团队成员把自己定位为“程序员”而不是“Java程序员”或“前端程序员”。技术或者语言具有相通性,虽然并不要求团队内每个人都成为全栈程序员,但不断的学习积累有助于团队合作时互换角色思考,提升自身的团队协作能力。网易云信开发者生态
在开发者方面,网易云信在接口设计上对接口的灵活度和接入便利性一直都有相对全面的考量。网易云信希望把简单易用的接口提供给不同层次的开发者和不同产品场景需求去使用,所以并没有以多版本接口的方式去设计冗繁的API体系,而是在保持向下兼容本身,对接口进行持续迭代优化。考虑到同时面对资深开发人员,网易云信预留了足够自由的参数传入和自由定义发挥空间,几乎所有的子系统上面,都有自定义、用户扩展预留设计的体现。而面对刚入行的开发者,我们在调用示例本身和功能组合上,做了足够丰富的示例和注释,来帮助这些开发者快速的实现自身业务。并在技术支持层面,7*24小时响应接入咨询,来保障对接开发工作的快速顺畅。
本文来源:网易
责任编辑:郭浩_NT5629
用微信扫码二维码
分享至好友和朋友圈
加载更多新闻
热门产品:   
:        
:         
热门影院:
阅读下一篇
用微信扫描二维码
分享至好友和朋友圈iOS IM即时通讯-[融云] [网易云信]简单集成聊天界面 - 简书
iOS IM即时通讯-[融云] [网易云信]简单集成聊天界面
IM即时通讯. 对于iOS开发, , , , 都是还不错的选择. 作者今天就以
融云, 网易云信 为例简单介绍下,
即时通讯单聊的 聊天界面 集成.
一. 准备工作
官网注册账号 -& 创建项目 -& 获得 App Key -& 应用标识中 填写应用包名.先期准备工作 先告一段落.
二. 创建工程
CocoaPods导入融云 SDK, 这个不用解释了, 不会的话, 官网有详细讲解
pod 'RongCloudIMKit', ‘2.6.7’
AppDelegate.m 中引入 融云头文件, 初始化融云SDK
#import &RongIMKit/RongIMKit.h&
#import &RongIMLib/RongIMLib.h&
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyWindow];
//初始化融云SDK
[[RCIM sharedRCIM] initWithAppKey:@"你获得的App Key"];
ViewController *vc = [[ViewController alloc] init];
UINavigationController *navi = [[UINavigationController alloc] initWithRootViewController:vc];
self.window.rootViewController =
return YES;
进入融云后台 API调试 -&点击 用户服务[获取Token]
创建 两组 token与 userId
4) 融云是以token登陆, 以userId连接对话. 现在回到工程中
在 ViewController中
引入头文件
#import &RongIMKit/RCConversationViewController.h&
#import &RongIMKit/RongIMKit.h&
创建UIButton, 点击-(void)clickLoginRongCloud进入融云聊天界面(不用创建VC 融云自带)
-(void)clickLoginRongCloud{
//登录融云服务器,开始阶段可以先从融云API调试网站获取,之后token需要通过服务器到融云服务器取。
NSString*token=@"获取的第一组的token";
[[RCIM sharedRCIM] connectWithToken:token success:^(NSString *userId) {
//设置用户信息提供者,页面展现的用户头像及昵称都会从此代理取
[[RCIM sharedRCIM] setUserInfoDataSource:self];
dispatch_async(dispatch_get_main_queue(), ^{
//新建一个聊天会话View Controller对象
RCConversationViewController *chat = [[RCConversationViewController alloc]init];
//设置会话的类型,如单聊、讨论组、群聊、聊天室、客服、公众服务会话等
chat.conversationType = ConversationType_PRIVATE;
//设置会话的目标会话ID。(单聊、客服、公众服务会话为对方的ID,讨论组、群聊、聊天室为会话的ID)
chat.targetId = @"获取的第二组的userId";
//实现两个账号间通信
//设置聊天会话界面要显示的标题
chat.title = @"聊一聊";
//显示聊天会话界面
[self.navigationController pushViewController:chat animated:YES];
} error:^(RCConnectErrorCode status) {
NSLog(@"login error status: %ld.", (long)status);
} tokenIncorrect:^{
NSLog(@"token 无效 ,请确保生成token 使用的appkey 和初始化时的appkey 一致");
模拟器上运行 ; 更换 token 与 UserId, 再运行在 真机上, 就可实现 真机与模拟器间即时通讯.
5) 补充说明 简单的聊天界面完成,
如果你的融合账号创建的项目 是很久之前的, 一直没使用,
那融云会默认 APP Key 失效, 无法在API调试中 获取到token.
有询问未读消息的tabbar角标怎么设置 作者补充下代码 : 在聊天列表页中
- (instancetype)init
self = [super init];
if (self) {
/** 关键: 设置类型 */
[self setDisplayConversationTypes:@[@(ConversationType_PRIVATE), @(ConversationType_GROUP), @(ConversationType_DISCUSSION)]];
[self updateBadgeValueForTabBarItem];
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
/** 从聊天详情页 跳出, 重新调用下 */
[self updateBadgeValueForTabBarItem];
/** 消息提醒调用 */
- (void)notifyUpdateUnreadMessageCount {
[self updateBadgeValueForTabBarItem];
/** 消息提醒 */
- (void)updateBadgeValueForTabBarItem {
__weak typeof(self) __weakSelf =
dispatch_async(dispatch_get_main_queue(), ^{
int count = [[RCIMClient sharedRCIMClient] getUnreadCount:self.displayConversationTypeArray];
if (count & 0) {
__weakSelf.tabBarItem.badgeValue = [[NSString alloc] initWithFormat:@"%d", count];
__weakSelf.tabBarItem.badgeValue =
一. 准备工作
1)官网注册账号 -& 创建项目 -& 获得 App Key -& 标识管理 填写 Bundle Identifier. -& 上传推送证书P12文件
2) 在云信后台创建的项目中 功能管理 -& 账号管理 中创建两组账号, 云信是以账号, 密码登陆, 以账号连接对话
二. 创建工程
CocoaPods导入云信 SDK, 这个不用解释了, 不会的话, 官网有详细讲解
pod 'NIMSDK'
三. 聊天界面
云信默认不提供 聊天界面, 它提供 NIMKit 类封装了聊天界面.
从官网下载后, 引入工程中,
但是还没完, 所有功能都需要自己去写.
作者对照官方文档, 将需要写的如 : 正在输入, 已读, 添加文件等 简单功能集成了下. 所用东西都需要自己写, 作者就不上代码了, 直接上demo, 供读者借鉴.
四. demo下载
名字乱起瞎扯淡 , 不写注释臭流氓 .首先,我们先定义一个自定义消息的类型
public interface CustomAttachmentType {
// 多端统一
int Guess = 1;
int SnapChat = 2;
int Sticker = 3;
int RTS = 4;
= 5;//自定义}第二步,我们先定义一个自定义消息附件的基类,负责解析你的自定义消息的公用字段,比如类型等
注意: 实现 MsgAttachment 接口的成员都要实现 Serializable。(这个类demo里面有的,猜拳用的)
public abstract class CustomAttachment implements MsgAttachment {&&&&protected int type;&&&&CustomAttachment(int type) {&&&&&&&&this.type =&&&&}&&&&public void fromJson(JSONObject data) {&&&&&&&&if (data != null) {&&&&&&&&&&&&parseData(data);&&&&&&&&}&&&&}&&&&@Override&&&&public String toJson(boolean send) {&&&&&&&&return CustomAttachParser.packData(type, packData());&&&&}&&&&public int getType() {&&&&&&&&return type;&&&&}&&&&protected abstract void parseData(JSONObject data);&&&&protected abstract JSONObject packData();}
第三步,继承这个基类,实现&分享&的附件类型。注意,成员变量都要实现 Serializable
public class fghGuessAttachment extends CustomAttachment {private String url = "http://img0./it/u=,&fm=21&gp=0.jpg";//这个图片没使用,在布局里面放张默认图片private String content = "内容xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";private String title="标题xxxx";
protected int type;
public fghGuessAttachment() {
super(CustomAttachmentType.SHARE);
public fghGuessAttachment(String str) {
protected void parseData(JSONObject data) {
title=data.getString("title");
content=data.getString("content");
url=data.getString("url");
public JSONObject packData() {
JSONObject data = new JSONObject();
data.put("title",title);
data.put("content",content);
data.put("url",url);
return data;
public String getUrl() {
return url;
public void setUrl(String url) {
this.url = url;
public String getContent() {
return content;
public void setContent(String content) {
this.content = content;
public String getTitle() {
return title;
public void setTitle(String title) {
this.title = title;
}}第四步,实现自定义消息的附件解析器。
public class CustomAttachParser implements MsgAttachmentParser {//类里面
case CustomAttachmentType.SHARE:
attachment = new fghGuessAttachment();
第五步,将自定义消息展示UI上
viewholder包名下
/** * UIKit自定义消息界面用法展示类 */public class fghSessionHelper extends MsgViewHolderBase{
private fghGuessAttachment attachment;
private ImageView image;
private TextView tvTitle;
private TextView tvContent;
protected int getContentResId() {
return R.layout.aaaaaaaa;
protected void inflateContentView() {
image = (ImageView) findViewById(R.id.image);
tvTitle = (TextView) findViewById(R.id.tv_title);
tvContent = (TextView) findViewById(R.id.tv_content);
protected void bindContentView() {
attachment = (fghGuessAttachment)message.getAttachment();
tvTitle.setText(attachment.getTitle());
tvContent.setText(attachment.getContent());
//若是要自己修改气泡背景// 当是发送出去的消息时,内容区域背景的drawable id@Overrideprotected int rightBackground() {
return com.netease.nim.uikit.R.drawable.nim_message_item_right_selector2;}
第六步,发送自定义消息
public class fghGuessAction extends BaseAction {
public fghGuessAction() {
super(R.drawable.message_plus_guess_selector, R.string.input_panel_share);
public void onClick() {
fghGuessAttachment attachment = new fghGuessAttachment();
IMMessage message;
if (getContainer() != null && getContainer().sessionType == SessionTypeEnum.ChatRoom) {
message = ChatRoomMessageBuilder.createChatRoomCustomMessage(getAccount(), attachment);
message = MessageBuilder.createCustomMessage(getAccount(), getSessionType(), attachment);
sendMessage(message);
第七步,将该附件解析器注册到 SDK 中。为了保证生成历史消息时能够正确解析自定义附件,注册一般应放在 Application 的 onCreate 中完成
NIMClient.getService(MsgService.class).registerCustomAttachmentParser(new CustomAttachParser()); // 监听的注册,必须在主进程中。
第八步,注册扩展消息类型的显示ViewHolder,由于这里使用我们UIKIT,所以也需要注册到Application的onCreate中
public class SessionHelper {//这个类里面
//fghNimUIKit.registerMsgItemViewHolder(fghGuessAttachment.class,fghSessionHelper.class);
第九步,在加号里面增加一个选项 ,Demo是在SessionHelper.java里面,定制的单聊界面。
/** * UIKit自定义消息界面用法展示类 */public class SessionHelper {
// 定制加号点开后可以包含的操作, 默认已经有图片,视频等消息了ArrayList&BaseAction& actions = new ArrayList&&();actions.add(new fghGuessAction());
阅读(...) 评论()}

我要回帖

更多关于 网易云信自定义消息 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信