GithubHelp home page GithubHelp logo

netease-kit / nim-uikit-ios Goto Github PK

View Code? Open in Web Editor NEW
1.5K 1.5K 414.0 226.48 MB

云信 IM UIKit 是基于 NIM SDK(网易云信 IM SDK)开发的一款即时通讯 UI 组件库,包括聊天、会话、圈组、搜索、群管理等组件。通过 IM UIKit,可快速集成包含 UI 界面的即时通讯应用。

Objective-C 10.79% Ruby 0.69% Swift 88.51% C 0.02%
im ios uikit

nim-uikit-ios's Introduction

网易云信 IM UIKit是基于 NIM SDK(网易云信 IM SDK)开发的一款即时通讯 UI 组件库,包括聊天、会话、圈组、搜索、群管理等组件。通过 IM UIKit,可快速集成包含 UI 界面的即时通讯应用。

IM UIKit 简化了基于 NIM SDK 的应用开发过程。它不仅能助您快速实现 UI 功能,也支持调用 NIM SDK 相应的接口实现即时通讯业务逻辑和数据处理。因此,您在使用 IM UIKit 时仅需关注自身业务。

功能优势

优势 说明
UI 组件解耦 IM UIKit 不同组件可相互独立运行使用。您可按需选择组件,将其快速集成到您的应用,实现相应的 UI 功能,减少无用依赖。
UI 能力简洁易用 IM UIKit 的业务逻辑层与 UI 层相互独立。在 UI 层,您仅需关注视图展示和事件处理。IM UIKit 清晰的数据流转处理,让 UI 层代码更简洁易懂。
完善的业务逻辑处理 IM UIKit 业务逻辑层提供完善的业务逻辑处理能力。您无需关心 SDK 层不同接口间的复杂处理逻辑,业务逻辑层一个接口帮您搞定所有。

技术原理

工作原理

IM UIKit 采用 (Model–View–ViewModel)MVVM 架构模型,实现 UI 展示与业务逻辑开发的相互独立。

IMuikitDataFlow_iOS.png

流程 说明
1 IM UIKit 展示层的 UIViewController/View 向响应层的 ViewModel 发送请求。
2 ViewModel 将请求经由业务逻辑层转发至 NIM SDK。
3 NIM SDK 接收请求后触发回调,回调数据经由业务逻辑层和响应层发送至 UIViewController/View。
4 UIViewController/View 将回调数据发送至 UITableViewDelegate 和 UItableViewDataSource。后两者根据需在界面上展示的不同实体的 identifier,判定具体的 UI 样式。例如,SDK 返回的回调数据为消息数据时,UITableViewDelegate 和 UItableViewDataSource 可通过消息数据中包含的代表消息类型的 identifier,将消息在 UI 上展示为对应类型的样式。

产品架构

app_structure_foure_iOS.png

上图中:

  • UIKit UI 层的 NEContactUIKitNEChatUIKitNEConversationUIKitNEQChatUIKit 等,对应上述工作原理图中的 Activity/Fragment/View。
  • UIKit UI 层的 NEContactKitNEChatKitNEQChatKit 等,对应上述工作原理图中的 Repository。
  • NECoreKit 层对应上述工作原理图中的 Provider。

示例项目下载

扫描如下二维码下载和体验示例项目。

iOS二维码.png

详见IM UIKit介绍

IM UIKit 集成

具体的集成流程,请参见快速集成 IM UIKit

nim-uikit-ios's People

Contributors

allday2010 avatar chrisray108 avatar dongshanxu avatar elfsundae avatar hzsongwh avatar javin-wang avatar liuqijun avatar maghzchenyu avatar ruanlin-yunxin avatar sevenuncler avatar shine2008 avatar taojinliang avatar tinpont avatar wenchaod avatar xiangwangfeng avatar yunxinusecase avatar zhanggenning avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

nim-uikit-ios's Issues

再提一个无伤大雅的Bug

在iOS10上输入拼音点删除时,自动把剩余的拼音当成英文填充到输入框了,而并不是想iOS8一样,删除一个字母后仍然是拼音联想状态,还望告知一下兼容办法,谢谢

聊天默认的头像图片丢失

会话资源的默认头像丢失了,希望补充一下吧 ! 资源路径为:NIMKitResource.bundle/avatar_user
版本是 pod 'NIMKit', '~> 1.7.0'

输入窗口偏移出错的问题

在聊天页面NIMSessionViewController这边,如果有设置显示导航栏的话,发现输入框的偏移量总是不对,导致输入框被键盘遮挡。后面跟了源代码,在NIMInputView.m这个文件中的keyboardWillChangeFrame方法中修改找到了问题的原因。原来:self.keyBoardFrameTop=endFrame.origin.y,这个在没有导航栏的时候是没有问题的,但是如果有导航栏的话,就会存在64像素的偏差,所以我改成了:self.keyBoardFrameTop = self.superview.nim_height-endFrame.size.height;就能解决这个问题了。第一次使用云讯sdk,所以也不是很清楚这样改有没有问题,希望作者能看下并反馈给我哈!

录音按钮失灵

我接入云信的界面库后,聊天界面的语音按钮响应事件的问题。此问题已解决。

怎么可以在继承的NIMSessionViewController里拿到cell?

现在的需求是 我要拿到当前对话中的图片跟视频,进入类似微信那样的预览页面,这时候俩问题。

1、 我拿不到当前对话数据。 通过history拿我也不知道当前用户拉出来的有多少条。
2、我需要cell中image相对于window的位置。 这样我就必须拿到cell才可以。

这个需求蛮紧的,你们有啥建议吗?

用cocoapods 老是报错

错误:[!] Error installing NIMKit
[!] /usr/local/bin/git clone https://github.com/netease-im/NIM_iOS_UIKit.git /var/folders/g3/r8328tc109769fx71cnm85lm0000gn/T/d20161217-61847-121cm75 --template= --single-branch --depth 1 --branch 1.0.5

Cloning into '/var/folders/g3/r8328tc109769fx71cnm85lm0000gn/T/d20161217-61847-121cm75'...
error: RPC failed; curl 56 SSLRead() return error -9806
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed

已经做过如下处理
1.换网络尝试还是不行(只装一个xocde也不行)
2.给git 增加缓存数量
git config --global http.postBuffer 524288000
3.stackOverflow上用如下命令操作后在 pod install (pod install --no-repo-update)
$ brew remove git
$ brew remove curl
$ brew install openssl
$ brew install --with-openssl curl
$ brew install --with-brewed-curl --with-brewed-openssl git
4.第四种方法也不行
http://blog.csdn.net/fatalibud/article/details/48649963
$ brew tap homebrew/dupes
$ brew tap homebrew/versions
$ brew tap homebrew/php
$ brew install --with-openssl curl
$ brew install --with-fpm --with-homebrew-curl --with-homebrew-openssl --without-snmp php55
$ brew install php55-mcrypt
$ php -i | grep "SSL Version"

我的Podfile是这样的:【SDWebImage这些都是可以安装的】
platform :ios, '8.0'
target "HuNIMDemo" do
pod 'NIMKit/Lite'
end

提点建议

具体做了一下,发现一些小问题。

1、 关于bundle资源文件的路径, 三个bundle的设置是不统一的,pod引入之后,需要设置resource的资源目录为mainBundle。 其他两个则不需要,这很奇怪,还是写清楚会比较好 ,免得开发者自己跟代码。而且最好还是统一吧。

2、cell相关的一些自定义,比如说cell的背景色,我看到是代码里直接写死,其实完全也可以抛出的。

3、以后是否可以加个版本更新说明,我们正好赶在3.2前做的集成,然后你们就发布3.2了,并不知道具体需要修改哪里。一点一点摸出来的,蛮费时间。

希望可以采纳

聊天用户的默认头像的问题

在NIMSessionViewController中,似乎没有提供接口来设置用户的本地默认头像。
如何来设置聊天页面中用户的本地默认头像呢?

打开 use_frameworks! ,引入 pod 'NIMKit/Full' 会报错

如题,使用swift开发。报错内容为:
The 'Pods-swift' target has transitive dependencies that include static binaries
尝试注释 use_frameworks! 后 pod install 正常,但无法再引入其他的库。会提示缺少 use_frameworks!
请问有解决办法么?

Prefix.pch报错

下载项目后,执行pod install
下载完所有依赖库后,打开xcode。有一个错误 'NIMAVChat.h' file not found
注释该行后,又出现NIMAVChatDefs.h file not found
貌似这个NIMAVChat开头的类都没有

cocoaPod导入时,打开use_frameworks!报错

不打开时正常,但想用Swift...
The target has transitive dependencies that include static binaries: (/Users/cloud/code/aiyuebang/Pods/NIMSDK/SDK/NIMSDK/libNIMSDK.a, /Users/cloud/code/aiyuebang/Pods/NIMSDK/SDK/NIMAVChat/libNIMAVChat.a, /Users/cloud/code/aiyuebang/Pods/NIMSDK/SDK/NIMAVChat/Libs/libnio.a, /Users/cloud/code/aiyuebang/Pods/NIMSDK/SDK/NIMAVChat/Libs/libnts.a, /Users/cloud/code/aiyuebang/Pods/NIMSDK/SDK/NIMAVChat/Libs/libnvs.a, /Users/cloud/code/aiyuebang/Pods/NIMSDK/SDK/NIMAVChat/Libs/libopenh264.a, /Users/cloud/code/aiyuebang/Pods/NIMSDK/SDK/NIMAVChat/Libs/libopus.a, /Users/cloud/code/aiyuebang/Pods/NIMSDK/SDK/NIMSDK/Libs/libaacplus.a, /Users/cloud/code/aiyuebang/Pods/NIMSDK/SDK/NIMSDK/Libs/libcrypto.a, /Users/cloud/code/aiyuebang/Pods/NIMSDK/SDK/NIMSDK/Libs/libevent.a, and /Users/cloud/code/aiyuebang/Pods/NIMSDK/SDK/NIMSDK/Libs/libssl.a)

swift开发,如何修改 NIMSessionViewController titleLabel的颜色和大小

如题,我在项目中使用 swift 进行开发,想要修改sessionTitle的大小和颜色。但 swift 调用 OC 的时候,只能使用 NIMSessionViewController.h 文件中暴露出来的方法和属性,然而 titleLabel 并没有暴露出来。请问我现在有其他办法可以修改 title 的属性么?

Too Many Errors

In NIMKitUtil.m file, so many errors occured, i see the reason is serval Enums in switch struct, there is not exist the Type,but you case it,so the compile failed,

导入pod的问题

使用pod 'NIMKit/Full'导入完整的nimkit的时候,最新的版本是1.3.0,但是导入完成之后nimsdk的文件夹有内容,但是nimkit的文件夹是空的

SpellingMistake.

  • (NSString *)encodeAttachment;
    通过实现这个方法,最终将 id

应该是NIMCustomAttachment...

pod fail

Unable to find a specification for NIMKit

关于自定消息所对应的UI比较复杂的情况

你好,我想问一下,如果某种自定义消息attachment所对应的UI比较复杂,会根据attachment的属性不同情况而展示不同的UI,那么这种情况怎么处理会比较友好一点?按照demo的NTESWhiteboardAttachment类,它是在- (CGSize)contentSize:(NIMMessage *)message cellWidth:(CGFloat)width方法里面将其所对应的contentViewNTESSessionWhiteBoardContentView里面的UI控件进行相应的属性设置,然后计算。如果有多个的话,那我岂不是在NTESWhiteboardAttachmentNTESSessionWhiteBoardContentView里面都要做重复的布局计算操作。

我以前的方法是在 contentView 相同签名的- (CGSize)contentSize:(NIMMessageModel *)messageModel cellWidth:(CGFloat)width 方法A里面做的处理,在这个A方法里面再调用方法B,并且在布局的时候也会调用方法B,具体的布局实现是在方法B里面。具体实现代码如下。总感觉这样写不太友好,希望网易的大大能够给出个好一点的方案,谢谢!

attachment method

#pragma mark - NTESCustomAttachmentInfo Delegate
/**
 *  查询某个消息对应的ContentView类名
 *
 *  @param message message description
 *
 *  @return return value description
 */
- (NSString *)cellContent:(NIMMessageModel *)messageModel {
    return NSStringFromClass([NIMSessionSelfContentView class]);
}

/**
 *  查询某个消息对应的内容区域的大小
 *
 *  @param message <#message description#>
 *  @param width   <#width description#>
 *
 *  @return <#return value description#>
 */
- (CGSize)contentSize:(NIMMessageModel *)messageModel cellWidth:(CGFloat)width {
    return [[NIMSessionSelfContentView new] contentSize:messageModel cellWidth:width];
}

/**
 *  cell内容距离气泡的内间距
 *
 *  @param message <#message description#>
 *
 *  @return <#return value description#>
 */
- (UIEdgeInsets)contentViewInsets:(NIMMessageModel *)messageModel {
    return [[NIMSessionSelfContentView new] contentViewInsets:messageModel];
}

NIMSessionSelfContentView method

// 方法A
- (CGSize)contentSize:(NIMMessageModel *)messageModel cellWidth:(CGFloat)width {
    return [self layoutContentViewIsRealSubViews:NO message:messageModel cellWidth:width];
}

- (void)layoutSubviews {
    [super layoutSubviews];
    [self layoutContentViewIsRealSubViews:YES message:self.model cellWidth:0];
}

/**
 *  刷新内容视图 方法B
 *
 *  @param isReal isReal 是否是真的刷新 在计算contentSize的时候不是真的刷新,只是布局而已
 *
 *  @return 内容大小
 */
- (CGSize)layoutContentViewIsRealSubViews:(BOOL)isReal message:(NIMMessageModel *)messageModel cellWidth:(CGFloat)width {
    UIImageView *thumbImageView1 = nil;
    UILabel *titleLabel1 = nil;
    UILabel *descLabel1 = nil;
    if (isReal) {
        thumbImageView1 = _thumbImageView;
        titleLabel1 = _titleLabel;
        descLabel1 = _descLabel;
    } else {
        NSArray *subViews = [self setupSubviewsIsNeedAdd:NO];
        thumbImageView1 = [subViews firstObject];
        titleLabel1 = subViews[1];
        descLabel1 = [subViews lastObject];
    }
   // 在这里面做相应的contentsize计算
  //xxxxxxxxx
  return CGSizeZero;
}

#pragma mark - inner method
- (NSArray *)setupSubviewsIsNeedAdd:(BOOL)isNeed {
    UIImageView *thumbImageView1 = [UIImageView new];

    UILabel *titleLabel1 = [UILabel new];
    titleLabel1.backgroundColor = [UIColor clearColor];
    titleLabel1.font = [UIFont systemFontOfSize:NIMKit_Message_Font_Size];
    titleLabel1.numberOfLines = 3;
    titleLabel1.textColor = [UIColor colorWithNumber:11];

    UILabel *descLabel1 = [UILabel new];
    descLabel1.backgroundColor = [UIColor clearColor];
    descLabel1.font = [UIFont systemFontOfSize:14.0];
    descLabel1.numberOfLines = 3;
    descLabel1.lineBreakMode = NSLineBreakByWordWrapping;
    descLabel1.textColor = [UIColor colorWithNumber:4];

    if (isNeed) {
        _thumbImageView = thumbImageView1;
        _titleLabel = titleLabel1;
        _descLabel = descLabel1;

        [self addSubview:_thumbImageView];
        [self addSubview:_titleLabel];
        [self addSubview:_descLabel];
    } else {
        return @[thumbImageView1, titleLabel1, descLabel1];
    }
    return @[];
}

引入后,不能通过编译

Undefined symbols for architecture x86_64:
"_NTESNotificationLogout", referenced from:
___50-[NTESSettingViewController logoutCurrentAccount:]_block_invoke_2 in NTESSettingViewController.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
请问一下这个问题怎么解决

“按住说话”按钮高度问题

步骤:

  1. 任意聊天界面,输入框文字内容输入超过一行。
  2. 点击“语音”按钮,切换到语音录入界面。

结果:“按住说话”按钮高度不对。

NIMInputToolBar 中在方法 - (void)adjustTextAndRecordView 中始终设置了 self.recordButton.frame = self.inputTextBkgImage.frame;, 导致了按钮高度一直等于输入框背景高度。

提个BUG

在输入框对6Plus的兼容性,当6plus输入多行(大于10)时,输入框不会自动滚动到底部

pod install 失败

  • NIMSDK_LITE (~> 3.9.0) required by NIMKit/Lite (1.6.0)

None of your spec sources contain a spec satisfying the dependency: NIMSDK_LITE (~> 3.9.0).

InputToolBar 中的控件位置偏移错误。

导航栏使用 Opaque Navigation Bar 时,点击拍摄弹出拍摄界面,点击取消或者拍摄照片并发送,拍摄界面 dismiss 之后,toolBar 上的控件位置都偏移了。

如图:

img_1200

对不支持消息的兼容

现在的处理是这里设置了一个断言供 debug, Release 版不支持的消息会返回空的 cell 导致崩溃。我觉得比较好的一个处理是对不支持的消息专门设置一个提示的 cell 来保证旧版本的兼容性。

Pod 找不到 NIMKit?

Pod 重新 setup 了一下,然后执行

Pod install

还是找不到 NIMKit,这是?
错误信息:unable to find a specification for ‘NIMKit’

语音 cell 重新设置内容没有同步播放状态

点击开始播放语音然后滚动列表,当重新滚动到播放语音的这个 cell 的时候显示的不是正在播放的状态,这个应该在每次为 cell 配置内容的时候查询一下当前播放的内容,现在只是在开始播放的时候设置了代理。

iOS 11 中会话消息布局错误。

qq20170629-180558 2x

qq20170629-181156 2x

iOS 11 中刚进入聊天界面,消息 cell 的布局错误,滑动 cell 重新出现的布局就对了。

调试发现,tableView 先进入了 dataSource 方法:cellForRowAtIndexPath,后进入了 delegate 方法:heightForRowAtIndexPath,

而 cell 的布局是在 heightForRowAtIndexPath[self.interactor checkLayoutConfig:model]; 中的 -calculateContent:force: 中确定的。

不知道 iOS 11 正式发布后,方法的调用顺序会不会改回来。

建议更新框架依赖库

Specs satisfying the SVProgressHUD (= 2.1.2), SVProgressHUD (~> 2.0.3) dependency were found, but they required a higher minimum deployment target.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.