最新公司的项目比较赶,国庆期间也在赶项目。很久没有发表新的动态了。由于公司要求一定要使用阿里百川的即时通讯,一起分享下经验。下周再分享环信SDK
一.即时通讯简介
1.1 XMPP简介
-
XMPP
一个即时通讯的协议,它规范了用于即时通信在网络上数据传输格式的,比如登录,获取好友列表等等的格式,XMPP
在网络传输的数据是XML格式 -
XMPP
是一个基于Socket
通过的网络协议,目的就是为了保护长连接,以实现即时通讯功能 -
XMPP
的客户端是使用一个XMPPFramework
框架实现 -
XMPP
的服务器是使用Openfire
,一个开源的服务器
1.2 第三方即时通讯SDK
- 不需要公司内部搭建服务器
- 可使公司可以节约时间成本
- 客户端的开发,使用第三方SDK比XMPPFramework更简洁方便
- 是在
XMPP
的基础上进行二次开发,对服务器Openfire
和客户端进行功能模型的添加和客户端SDK的封装,本质还是使用XMPP
,基于Socket的网络通信 - 内部实现了数据缓存,会把聊天记录添加到数据库,把附件(如音频文件,图片文件)下载到本地,使程序员更多时间是花到用户即时体验上
只要你使用第三方的即时通讯,无论你是使用环信还是融云还是阿里的,首先第一步就是集成,集成千篇一律,对着官方文档完成集成即可,集成问题则不再细说
二.阿里百川SDK准备工作
2.1 注册账号
2.2 根据build id创建应用,集成的时候需要替换阿里AppKey
值
三. 集成与核心功能(主要针对单聊)
1 集成阿里百川即时通讯SDK集成
2 查看示例demo并熟悉阿里百川的示例demo下载
3 让示例demo变成你的东西,根据项目需求,对其进行增删改减。把
SPKitExample
类名改成SPKitManager
这样意思更明确,再者把SPKitExample
类里面所有的example
全部清除
整理好之后剩下如下文件
四. 步骤具体化
1.初始化IMSDK
在AppDelegate
中导入#import "SPKitManager.h"
头文件,并在didFinishLaunchingWithOptions
方法中初始化IMSDK
[[SPKitManager sharedInstance] callThisInDidFinishLaunching];
2.设置SPKitManager
首先在SPKitManager.h
添加一个block块来检查登录状态
-(void)checkLoginRun:(void(^)())callback;
其次在SPKitManager.m
声明一个BOOL属性判断用户是否登录,并实现checkLoginRun
方法,为了保护用户账号密码的安全性,我们对用户的账号密码进行MD5加密处理。XXXX
一般是以项目名称做其前缀进行加密,不过具体还是得看公司要求。
@property(nonatomic)BOOL isLogined;
-(void)checkLoginRun:(void(^)())callback{
[self login:callback];
}
-(void)login:(void(^)())callback{
if(self.isLogined){
if (callback) {
callback();
}
}else{
@synchronized(self){
if(self.isLogined) {
if (callback) {
callback();
}
return;
}
YISUserModel<Optional>* user = [YISUserManager shareInstance].user.user;
if(user == nil || user.id == nil){return;}
NSString *uid = [YISTools MD5String: user.id];
NSString *pwd = [YISTools MD5String:[NSString stringWithFormat:@"XXXX%@",user.id]];
[self callThisAfterISVAccountLoginSuccessWithYWLoginId:uid passWord:pwd preloginedBlock:^{}
successBlock:^{
self.isLogined = YES;
if (callback) {
callback();
} } failedBlock:^(NSError *aError) {
DDLogInfo(@"aError:%@",aError);
}]; }
}
}
3.创建会话列表
- 3.1导入头文件3个
#import <WXOUIModule/YWConversationListViewController.h>
#import "SPKitManager.h"
#import <WXOpenIMSDKFMWK/YWConversation.h>
- 3.2声明属性
@property(nonatomic, strong) SPKitManager* spkit;//聊天Manager
@property (weak, nonatomic) IBOutlet UIView *msgListView;
@implementation YISMessageViewController{
NSString *currentId;
YWConversationListViewController *conversationListController;
}
- 3.3设置会话列表
viewDidLoad
->调用[self setupIMList]
(判断用户是否登录以及是否切换账号等问题的处理)->[self _setupIMList]
(设置会话列表)
-(void)setupIMList{
BOOL isLogin = [YISUserManager shareInstance].isLogin;
if (!isLogin) {
[[NSNotificationCenter defaultCenter] postNotificationName:kLoginNotification object:nil];
return;
}
NSString *uid = [YISUserManager shareInstance].user.user.id;
if(currentId != nil && ![currentId isEqualToString: uid]){
[self.msgListView removeFromSuperview];
[conversationListController removeFromParentViewController];
DDLogDebug(@"currentId%@--userid:%@",currentId,uid);
}else if (currentId != nil){
return;
}
self.spkit = [SPKitManager sharedInstance];
[self.spkit checkLoginRun:^{
[self _setupIMList];
}];
}
-(void)_setupIMList{
conversationListController = [self.spkit.ywIMKit makeConversationListViewController];
conversationListController.view.frame = [UIScreen mainScreen].bounds;
conversationListController.view.backgroundColor =[UIColor clearColor];
__weak __typeof(conversationListController) weakConversationListController;
weakConversationListController = conversationListController;
YWConversationsListDidSelectItemBlock selectItemBlock;
selectItemBlock = ^(YWConversation *aConversation) {
if ([aConversation isKindOfClass:[YWCustomConversation class]]) {
YWCustomConversation *customConversation = (YWCustomConversation *)aConversation;
[customConversation markConversationAsRead];
}
else {
[[SPKitManager sharedInstance] openConversationViewControllerWithConversation:aConversation
fromNavigationController:weakConversationListController.navigationController];
} };
[conversationListController setDidSelectItemBlock:selectItemBlock];
[self.spkit CustomizeConversationCellWithConversationListController:conversationListController];
conversationListController.didDeleteItemBlock = ^ (YWConversation *aConversation) {};
self.msgListView = conversationListController.view;
[self.view addSubview:self.msgListView];
[self addChildViewController:conversationListController];
[self didMoveToParentViewController:conversationListController];
__weak typeof(self.navigationController) weakController = self.navigationController;
[self.spkit.ywIMKit setUnreadCountChangedBlock:^(NSInteger aCount) {
NSString *badgeValue = aCount > 0 ?[ @(aCount) stringValue] : nil;
weakController.tabBarItem.badgeValue = badgeValue;
}];
}
4.退出登录
上面有有提到账号切换问题,而在app退出登录时阿里也要退出,否则会导致此种情况,登录新的账号时还残留着上一个账号的聊天列表。如果程序每次卸载再重新安装不会发现此问题,但是没有必要这样,用户体验会及其不好。
例如:
[[YISUserManager shareInstance]logout];
[[SPKitManager sharedInstance]Logout];
额外补充
替换阿里的默认头像
WXFrameworks->WXOUIModuleResources.bundle->pub_ico_single_120@2x/pub_ico_single_120@3x