默认
打赏 发表评论 16
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
即时通讯框架MobileIMSDK的开发指南:iOS客户端
微信扫一扫关注! 其它资料链接请回到详细介绍页↘http://www.52im.net/thread-52-1-1.html

写在前面


友情提示:在着手基于MobileIMSDK开发自已的即时通讯应用前,建议以Demo工程为脚手架,快速上手MobileIMSDK!

Demo工程主要用于演示SDK的API调用等,它位于SDK完整下载包的如下目录:
ios_demo_src.png

如上图目录demo_src/TCP_Client/MobileIMSDK4iDemo_tcp/所示,这是一个完整的XCode工程(含完整的可运行Demo源码)。

如果你只是想看看Demo的话,可以下载编译好的Demo安装包立即体验:点此进入

第一部分:集成准备


第1步:下载SDK并找到lib包


马上下载:
最新版打包下载 点此进入,或者前往 MobileIMSDK的Github 自行同步代码。

找到lib包:
位于MobileIMSDK完整下载包的 sdk_binary/Client_TCP/ios/ 目录下:
sdk_binary_path.png

第2步:引用lib包

提示:MobileIMSDK的iOS客户端lib包支持iOS 6.0(含)及以上版本,且已支持bitcode,enjoy it!


将.a文件和头文件拖到你的工程中
QQ20151117-2.png

依照提示点“Finish”即完成lib引用
QQ20151117-1.png

第二部分:编写代码


第1步:基本配置

// 设置AppKey
[ConfigEntity registerWithAppKey:@"5418023dfd98c579b6001741"];
        
// 设置服务器ip和服务器端口
// [ConfigEntity setServerIp:@"rbcore.openmob.net"];
// [ConfigEntity setServerPort:7901];
        
// 使用以下代码表示不绑定固定port(由系统自动分配),否则使用默认的7801端口
// [ConfigEntity setLocalSendAndListeningPort:-1];
        
// 框架的敏感度模式设置
// [ConfigEntity setSenseMode:SenseMode10S];
        
// 设置最大TCP帧内容长度(不设置则默认最大是 6 * 1024字节)
// [TCPFrameCodec setTCP_FRAME_MAX_BODY_LENGTH:60 * 1024];
        
// 开启DEBUG信息输出
[ClientCoreSDK setENABLED_DEBUG:YES];

第2步:回调设置


① 框架基本事件回调实现类:
#import "ChatBaseEventImpl.h"
#import "AppDelegate.h"
#import "MainViewController.h"

@implementation ChatBaseEventImpl

// 登陆/掉线重连结果通知
- (void) onLoginResponse:(int)errorCode
{
    if (dwErrorCode == 0)
        NSLog(@"登录成功。");
    else
        NSLog(@"登录失败,错误代码:%d", errorCode);
}

// 掉线事件通知
- (void) onLinkClose:(int)errorCode
{
    NSLog(@"网络连断开了,error:%d", errorCode);
}

@end

② 实时消息事件回调实现类:
#import "ChatMessageEventImpl.h"
#import "Toast+UIView.h"
#import "AppDelegate.h"
#import "MainViewController.h"

@implementation ChatMessageEventImpl

- (void) onRecieveMessage:(NSString *)fingerPrintOfProtocal withUserId:(NSString *)dwUserid andContent:(NSString *)dataContent andTypeu:(int)typeu
{
    NSLog(@"收到来自用户%d的消息:%@", dwUserid, dataContent);
}

- (void) onErrorResponse:(int)errorCode withErrorMsg:(NSString *)errorMsg
{
    NSLog(@"收到服务端错误消息,errorCode=%d, errorMsg=%@", errorCode, errorMsg);
}

@end

③ QoS相关事件回调实现类:
#import "MessageQoSEventImpl.h"
#import "AppDelegate.h"
#import "MainViewController.h"

@implementation MessageQoSEventImpl

- (void) messagesLost:(NSArray*)lostMessages
{
    NSLog(@"收到系统的未实时送达事件通知,当前共有%li个包QoS保证机制结束,判定为【无法实时送达】!"
        , (unsigned long)[lostMessages count]);
}

- (void) messagesBeReceived:(NSString *)theFingerPrint
{
    if(theFingerPrint != nil)
    {
        NSLog(@"收到对方已收到消息事件的通知,fp=%@", theFingerPrint);
    }
}

@end

* 设置好事件回调通知监听:
// 设置事件回调
[ClientCoreSDK sharedInstance].chatBaseEvent = [[ChatBaseEventImpl alloc] init];
[ClientCoreSDK sharedInstance].chatMessageEvent = [[ChatBaseEventImpl alloc] init];
[ClientCoreSDK sharedInstance].messageQoSEvent = [[MessageQoSEventImpl alloc] init];

第3步:登陆请求

int code = [[LocalUDPDataSender sharedInstance] sendLogin:用户名 withPassword:密码];
if(code == COMMON_CODE_OK)
    NSLog(@"提示" withContent:@"登陆请求已发出。。。");
else
    NSLog([NSString stringWithFormat:@"登陆请求发送失败,错误码:%d", code]);

第4步: 发送消息

int code = [[LocalUDPDataSender sharedInstance] sendCommonDataWithStr:@"这是一条测试信息..." toUserId:对方的userId qos:YES fp:nil];
if(code == COMMON_CODE_OK)
    NSLog(@"提示" withContent:@"您的消息已成功发出。。。");
else
    NSLog([NSString stringWithFormat:@"您的消息发送失败,错误码:%d", code]);

第三部分:常见开发问题附录


附录1:可以让客户端更省电吗?


请调用以下API进行设置即可(框架默认工作在SenseMode.MODE_15S模式下):
// MobileIMSDK核心IM框架的敏感度模式设置
[ConfigEntity setSenseMode:SenseMode15S];
MobileIMSDK预定义了多种模式,详细API说明:点此进入

特别说明:为了保证算法的一致性,以上设置需所有平台客户端和服务端都保持一致,否则将发生不可预测问题。

附录2:登陆请求结果为何是异步收到的?应用层如何处理体验更佳?

鉴于UDP通信的无连接特性,MobileIMSDK的服务端反馈回来的登陆结果自然也是异步到达,但这对开发者来说,只要代码处理得当,实现起来同样简单:即登陆请求发起前设置一个登陆结果观察者需可。


最佳实践详见iOS客户端Demo代码 [LoginGUI doLoginImpl:] QQ20151117-3.png

附录3:核心库工程与Demo演示工程的关系说明


如下图所示:Github淘宝 得到的核心库工程和Demo演示工程
1-5.png
▲ 左边为MobileIMSDK的各平台核心库工程,右边为各平台的Demo演示工程

* 什么是核心库工程?
核心库工程就是MobileIMSDK的所有框架源码,它只是个lib库,它的作用就像Spring boot、Struts、log4j这些第3库lib库一样:是打成jar包放到您的工程里使用的,您调用它就能实现它提供的功能,它自已本身并不能自已运行(你不可能让log4j或Spring boot能双击就运行吧?

* 什么是Demo演示工程?
正如“什么是核心库工程?”一节所说,MobileIMSDK的核心库是不能直接运行的,它需要打成jar包被您的工程引用并调用后,才能发挥它的作用,所以MobileIMSDK的Demo演示工程的目的就是为了告诉你:如何引用MobileIMSDK的核心库jar包、如何调用MobileIMSDK的API,读Demo代码就知道如何使用它了(所以Demo代码唯一的意义就是为您演示库的调用,别无他用)!

* “我”的工程中使用使用核心库工程?
为了方便日后的升级,建议使用MobileIMSDK编译好的核心库jar包,当然您也可以直接把MobileIMSDK核心库源库放到您的工程中(而不是使用编译好的jar包)。

* 您可以在MobileIMSDK的Github如下目录中找到打包编译好的jar包:
1-6.png

附录4:如何开启SSL/TLS传输加密


启用SSL/TLS配置取消此行代码注释即可):
7.png

注意:请确保您的MobileIMSDK服务端也已开启SSL/TLS加密,否则客户端无法跟服务端正常通信哦!


捐助作者,得MobileIMSDK精编注释版


点击以下链接,前往淘宝下单,付款后发货到您的指定邮箱:


all-in-one.png

(更多详情请进入:http://www.52im.net/thread-411-1-1.html

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

上一篇:即时通讯框架MobileIMSDK的开发指南:Android客户端下一篇:即时通讯框架MobileIMSDK的开发指南:Server端

本帖已收录至以下技术专辑

推荐方案
评论 16
感谢楼主分享
感谢分享,学习了。
感谢楼主 分享  正需要。。。学习了
签名: 该会员没有填写今日想说内容.
感谢楼主分享,学习了
签名: 该会员没有填写今日想说内容.

感谢楼主分享
签名: 心情好
弱弱问一句 ,还有么?
引用:xixi 发表于 2018-12-12 13:48
弱弱问一句 ,还有么?

有啥?
[ConfigEntity registerWithAppKey"5418023dfd98c579b6001741"]

中的这个appkey如何获得啊?从哪得到
引用:Harley 发表于 2019-09-24 17:28
[ConfigEntity registerWithAppKey"5418023dfd98c579b6001741"]

中的这个appkey如何获得啊?从哪得到

看看这个帖子里的回复:《[已解决] 请问下MobileIMSDK服务端的appKey是怎么获取的?
以前接触过Android的,今天看看学些iOS的,谢谢!
引用:xiongxiangsheng 发表于 2021-01-29 15:41
以前接触过Android的,今天看看学些iOS的,谢谢!

全栈啊

2023年2月18日本贴新增附录4:如何开启SSL/TLS传输加密”章节内容。
有没有遇到这种情况的:我在接受消息的方法里  onRecieveMessage   页面上的数据都被置空了
3F6E743D703389414812D740F076D904.png
引用:sunshine_wang 发表于 2024-01-26 17:40
有没有遇到这种情况的:我在接受消息的方法里  onRecieveMessage   页面上的数据都被置空了

不太理解你的问题,你应该分段调试诊断:

第一步:诊断网络层收到的数据是不是正常,就是看一下ChatMessageEventImpl这个类里onRecieveMessage方法收到的消息数据,是否正常。

第二步:如果第一步正常,表示网络层数据没问题,那你应该接着去看看是不是ui层代码用的不对。

以上,你可以在默认的官方demo工程上去调试和对照,这样就有参照点
引用:JackJiang 发表于 2024-01-26 17:59
不太理解你的问题,你应该分段调试诊断:

第一步:诊断网络层收到的数据是不是正常,就是看一下ChatMe ...

最后用了通知的方式传递得数据
引用:sunshine_wang 发表于 2024-01-30 15:31
最后用了通知的方式传递得数据

应该是你应用层的代码编译经验不太多,你可以多学学别的人开源代码,多看看就知道怎么做最合适了
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部