说明:本指南以iOS为开发平台的接入说明,方便有iOS研发基础的开发者快速了解整合云之讯通讯服务接口。其中本部分指南只包含通讯服务的接入方式和基于平台提供的Demo为蓝本进行在线体验。如需开发出针对企业和开发者所需的个性化应用,仍然需要具备一定经验的iOS开发经验(例如界面控件的开发以及与应用服务器配合调试的基础)
本指南一共包含两块信息:
Mac OS X 10.8 (Lion)及以上版本; XCode5.0及以上版本。
默认官方提供的iOS Demo 源码最新版是基于最新版本Xcode 和 Ucpaas官方发布的最新库 编译通过。
Demo功能介绍,Demo演示了UCSSDK的API接口调用,主要实现的功能:
Demo工程文件结构说明:
快速上手主要介绍以SDK为核心,加入简单代码实现通讯服务功能。包括SDK介绍、SDK引入、以及开发一个简易通讯服务:音视频通话功能。如需更好的开发其他通讯服务,请阅读开发文档内的其他章节。
下载相应版本的SDK:官方下载地址 (本示例中默认使用视频版最新SDK和TCP最新SDK)
SDK文件包含两个部分:
Tcp SDK 文件说明:其中包含五个头文件:
Video SDK文件说明:其中包含三个头文件:
这一节是为了让开发者能够用正确的导入sdk文件,以及正确配置工程信息。
Mac OS X 10.8 (Lion)及以上版本; XCode5.0及以上版本。
创建一个iPhone工程需要在Mac系统下面安装Xcode的软件,Xcode安装完成后可以在桌面的快速启动栏中的“Launchpad”中或者应用程序中找到xcode的图标,看到后单击或者双击即可打开软件,Xcode版本最小需要5.0。 打开Xcode后的界面可以看到几个选项,创建工程需要选择“Create a newXcode project”,如下图所示:
也可以根据菜单创建工程,依次选择XCode菜单栏中的FiLe→New→Project,如下图所示:
选择完后弹出的界面中选择左边的“iOS”下面的“Application”,然后选择右边的“SingLeViewAppLication”进行双击或者点击右下角“Next”, 如下图所示:
在完成后弹出的界面中的“ProductName”中填写你的工程名,如下图所示:
添加完成后点击右下角的”Next”,在弹出的对话框中选择你需要把工程放置的位置。这样一个工程就初步的创建完成。
创建完成工程后,把SDK包里面的videosdk文件夹和tcpsdk拷贝到新创建的工程路径下面,然后在工程目录结构中,右键选择Add Files to “云之讯Demo”(工程名称,在弹出的对话框中选择新创建的工程文件夹下的sdk这个文件夹,即前面拷贝的文件夹)。或者将这个文件夹拖入XCode 工程目录结构中,(此过程暂时不需要添加.a库,只需要添加.h的头文件)
在弹出的界面中勾选Copy items into destination group’s folder(ifneeded),并确保Add To Targets勾选相应的target。 相应的操作请看下图中所示:
添加步骤:展开LinkBinary With Libraries后点击展开后下面的“+“来添加下面的依赖项, 如图所示
点击Add Other 后,找到libucstcplib.a和libucsvideosdk.a存放的地方,先添加libucstcplib.a,再添加libucsvideosdk.a。
添加步骤:展开LinkBinary With Libraries后点击展开后下面的”+“来添加下面的依赖项, 如图所示
在xcode环境下,首先点击工程右边的工程名,然后在工程名右边依次选择TARGETS、“Build Settings LLVM 6.1- Language C++(注:根据xcode的版本差异,名称中的6.1会根据版本变动)”中的”C++ Standard Library”,从后面的选择框中选择“libc++(LLVM C++ standard Library with C++11 support)”选项,如果默认是这个选项则不需要修改。步骤如下图所示:
(注:xcode7.0以上的环境下)由于平台SDK暂时没有支持Bitcode功能,所以需要开发者将工程Bitcode功能关闭。 在工程名右边依次选择TARGETS、Build Options中的“Enable Bitcode”,在后面的选择框中选择NO,如果默认是,则不需要修改。步骤如下图所示:
在xcode环境下,首先点击工程右边的工程名,然后在工程名右边依次选择TARGETS、Build Settings Linking中的Other Linker Flags. 中填入-ObjC。 如下图所示:
在工程名的文件夹下面的Supporting Files文件夹中找到并且选择(工程名)lnfo.pList在右边出现的窗口中添加Key: Required background modes,在下面添加两个项:App plays audio和App provides Voice over IP services。
从iOS9开始,苹果建议所有的网络请求都要使用https,如果还想保留原有的http请求方式,开发者需要修改配置文件(注:xcode7.0以下则不需要修改),在工程名的文件夹下面的Supporting Files文件夹中找到并且选择(工程名)lnfo.pList在右边出现的窗口中添加Key:NSAppTransportSecurity,在下面添加项:NSAllowsArbitraryLoads,设置Boolean值为YES,这样平台SDK内部工程才能支持http请求方式。
本节主要介绍通过少量代码实现sdk中的语音通话能力。下面将通过代码片段介绍代码的实现过程,同时也可以选择参考Demo的代码实现。
遵循协议,实现代理方法。设置TCPSDK的代理,首先要初始化一个UCSTCPClient类型的对象,因为这个对象全局通用,所以实例化为单例对象。实例化与设置代理的方法为:
/*! * @brief 实例化UCSTcpClient的一个单例对象 * @discussion 这个方法是生成UCSTcpClient的唯一方法,请不要使用init()等其他初始化方法,否知会出现未知的错误 * @return UCSTcpClient类型的单例对象 */ + (instancetype)sharedTcpClientManager;
如果需要监听TCP连接状态,则必须要设置TCP的代理,TCP连接状态回调包括,TCP连接成功,连接失败,重连成功,重连失败,账号在其他地方登录被踢线等。
/*! * @brief 设置代理. * @discussion 如果需要通过回调监控tcp连接状态之类的,就必须设置这个代理 * @param delegate tcp事件回调代理 */ - (void)setTcpDelegate:(id <UCSTCPDelegateBase>) delegate;
代理对象需要遵守的协议为:UCSTCPDelegateBase 初始化代码参考:
{ //获取到tcp sdk的UCSTcpClient对象,并传入代理实现的类实例 UCSTcpClient * ucsTcpClient = [UCSTcpClient sharedTcpClientManager]; [ucsTcpClient setTcpDelegate:self]; }
监听TCP连接状态回调代码参考:
- (void)didConnectionStatusChanged:(UCSConnectionStatus)connectionStatus error:(UCSError *)error { //TCP连接成功,连接失败,重连成功,重连失败,账号在其他地方登录被踢线等 }
初始化SDK,该类提供拨打电话,接听以及拒接等方法。
#pragma mark - -------------------初始化函数----------------------- //初始化实例 - (UCSService *)initWithDelegate:(id<UCSEventDelegate>)delegate; //设置代理方法 -(void)setDelegate:(id< UCSEventDelegate>)delegate;
云之讯Demo代码参考:
{ //注意:一定要设置代理 UCSService* ucsService = [[UCSService alloc] init]; [ucsService setDelegate:self]; // 另一种方式 UCSService* ucsService = [[UCSService alloc] initWithDelegate:self]; }
初始化成功回调(注:初始化成功后再调用tcp链接云平台) :
- (void)onInitEngineSuccessful:(NSInteger)result{ //result为0的时候初始化成功,建议初始化成功后再调用tcp链接云平台 }
云之讯语音通话能力是建立在客户端和云平台连接成功的基础上,在连接断开的情况下,功能都不可用。云之讯语音通话能力是通过tcp长连接与云平台进行交互的,所以我们这里调用Tcp SDK中接口去连接云平台。请保证Video SDK的代理和Tcp SDK的代理已经设置正确。 如果是云平台的新账号体系则使用token的登陆方式,如果之前有使用过云之讯有关的能力,旧版本的账号体系,应该使用明文的登陆方式。
连接云平台,由UCSTcpClient的单例对象调用下面的方法
/*! * @brief 连接云平台. * @discussion (注意: 除非是为了兼容旧的IMSDK,否则请使用这个登陆方式)。 * @param token 加密的token * @param success 成功回调 * @param failure 登陆失败回调,注意:登陆账号被踢线(在其他地方登录)也会回调这个block */ - (void)login_connect:(NSString *)token success:(void (^)(NSString *userId))success failure:(void (^)(UCSError *error))failure; /*! * @brief 连接云平台. * @discussion (注意:这个登陆方式是为了兼容旧的IMSDK,后面可能会废弃)。使用这个接口的唯一场景是: 用户已经在现有的app中集成了我们旧的IMSDK,并且不希望更改成新的登陆方式(云之讯建议你更改成新的登陆方式)。其他场景下,请使用新的登陆方式。 * @param accountSid 账号sid * @param accountToken 账号token * @param clientNumber clientNumber * @param clientPwd clientPwd * @param success 成功回调 * @param failure 失败回调 */ - (void)login_connect_old:(NSString *)accountSid withAccountToken:(NSString *)accountToken withClientNumber:(NSString *)clientNumber withClientPwd:(NSString *)clientPwd success:(void (^)(NSString *userId))success
注意:连接平台,我们提供了以上两个方法,但是我们建议你使用前一个方法。还有一点,每一次连接云平台前,我们都建议你先做一次断开操作。 你可以使用下面这个方法来执行断开操作:
/*! * @brief 断开客户端和云平台的连接 * @param flag 是否关闭离线推送的bool值。YES关闭,NO不关闭。(单独使用Video sdk的时候设置为YES) * @discussion 在客户端不需要继续与云平台保持连接的时候,调用这个方法断开连接。断开连接后,客户端将不会在收到与云平台的消息推送,也无法发送消息到云平台。 * */ - (void)login_uninitWithFlag:(BOOL)flag;
关于云之讯的重连机制: 当客户端和云平台的异常断开后,客户端处于Active的状态下,SDK会自动尝试重连云平台。 主动调用SDK提供的断开连接的方法不属于异常断开,SDK不会尝试重连。
云之讯Demo的参考代码:
{ //每次连接之前,先断开tcp连接。 [[UCSTcpClient sharedTcpClientManager] login_uninitWithFlag:0]; //使用token登陆。Token由用户的as服务器下发。这里不赘述。 [[UCSTcpClient sharedTcpClientManager] login_connect:im_token success:^(NSString *userId) { // 连接云平台成功,业务自己处理 } failure:^(UCSError *error) { // 连接云平台失败,业务自己处理 }]; }
下面以 语音通话 为案例,介绍如何在现有应用内添加通话服务。
#pragma mark - -------------------呼叫控制函数----------------------- /** * 拨打电话 * @param callType 电话类型 0:语音电话 2:视频电话 * @param called userId号码 * @return */ - (void)dial:(NSInteger)callType andCalled:(NSString *)calledNumber andUserdata:(NSString *)callerData;
云之讯Demo代码参考:
{ //拨打语音通话(对方的云之讯账号,即userId) [self.ucsCallService dial:callType andCalled:calledNumber andUserdata:callerData]; }
创建成功并连接被叫过程中代理函数(当发起呼叫后对方振铃时回调此函数)
- (void) onAlerting:(NSString*)callid;
对方接听的代理函数(当接听成功后回调此函数)
-(void) onAnswer:(NSString*) callid;
呼叫失败(被叫拒接,被叫忙等原因)的代理函数,可参考错误码查找失败原因
//呼叫失败,可根据reason查找错误原因 // TODO - (void) onDialFailed:(NSString*)callid withReason:(UCSReason*)reason;
通话过程中,对方挂断的代理函数
//通话过程中,通话挂断,可以通过reason查看挂断原因 // TODO - (void) onHangUp:(NSString*)callid withReason:(UCSReason*)reason;
//实现代理函数 -(void)onIncomingCall:(NSString*)callid withcalltype:(UCSCallTypeEnum) callType withcallerNumber:(NSString*)callerNumber { //有免费电话呼入处理 //TODO }
接听免费通话
- (void) answer: (NSString*)callid; { //接听成功 //T0D0 }
/** * 挂断电话 * @param callid 电话id */ - (void) hangUp: (NSString*)callid;
在用Xcode打开工程后,看是需要用真机还是用模拟器运行应用,默认是模拟器下编译运行的,单击左上角的三角符号就可以进行应用运行, 如果是真机则需要你插上真机连接电脑,然后在最上面有单击“iPhone6.1SimuLator”(6.1为模拟器的版本)后可以看到显示你iPhone的机器 名字,并且选择后点击左上角的三角符号进行运行即可。如下图所示:
首先要从弹出的列表中选择第一项
然后选择xcode的菜单Product→Archive项
单击Export…按钮
根据需要选择,测试请选择第二项,然后点击Next
在下列窗口中请选择程序的签名证书
点击Choose后,选择第一项,确认无误后点击Next
点击Choose后,核对app的信息,确认无误后点击Next
点击Next后结束打包,打包出来的.ipa文件,默认保存在桌面。
错误码请参考平台文档说明。