最后更新于:2019-07-01
SDK接口以IOS下标准的framework的形式提供,并提供接口定义C头文件。
####文件目录说明
frameWork
- TangClientSDK.framework
- Dependency
- Bugly.framework
- tc_default.bundle
- GNetTangSDK.framework
参考信息文件配置:Sample
>1,将framework文件拖入工程
>2,target-> info ->custom ios target propertys 添加 App Transport Security Settings ->Allow Arbitrary Loads = YES
>3,General ->Embedded Binaries 添加 两个framework
>4,searchpath,Xcode会自动加入,如果没有自动加入,请参考sample
最终集成如下图所示
SDK环境分为两种:线上环境,测试环境
[[TangClientInterface sharedTangClientInterface]initEnvironment:Environment_online];
[[TangClientInterface sharedTangClientInterface]initEnvironment:Environment_online];
SDK中的语言默认和IOS系统一致,目前支持中文和英文(翻译中),非中文系统都会加载英文。如果想设定语言,请调用下面API
[[TangClientInterface sharedTangClientInterface]initLocaleLanguage:LocaleLanguage_Chinese];
[[TangClientInterface sharedTangClientInterface]initLocaleLanguage:LocaleLanguage_English];
#import <Foundation/Foundation.h>
#import "TangClientInterfaceObject.h"
typedef NS_ENUM(NSUInteger, TCMeetingWindowStatus) {
TCMeetingWindowStatus_Nil,
TCMeetingWindowStatus_Mini,
TCMeetingWindowStatus_Max
};
typedef NS_ENUM(NSUInteger, Environment) {
Environment_online,
Environment_beta = 1,
Environment_offline = 3,
};
typedef NS_ENUM(NSUInteger, LocaleLanguage) {
LocaleLanguage_Chinese=0,
LocaleLanguage_English=1
};
typedef NS_ENUM(NSUInteger, ConferenceStatus) {
ConferenceStatus_END=1, //结束会议
ConferenceStatus_LEAVE=2, //离开会议
ConferenceStatus_OFFLINE=3, //断线
ConferenceStatus_ONLINE=4//重新连接上
};
@interface TangClientInterface : NSObject
/**
云会议窗口的状态
*/
@property(readonly)TCMeetingWindowStatus windowStatus;
/**
sharedTangClientInterface
*/
+(instancetype )sharedTangClientInterface;
/**
初始化云会议系统的环境,默认为:Online 如果需要切换到Beta环境,请调用此API [initEnvironment Environment_beta]
*/
-(void)initEnvironment:(Environment )environment;
/**
初始化云会议系统的语言,默认为:系统语言(中文,英文),如设定过语言则按照设定的语音来
设定语言DEMO:[initLocaleLanguage LocaleLanguage_Chinese]
*/
-(void)initLocaleLanguage:(LocaleLanguage)localeLanguage ;
/**
初始化云会议系统的LogPath
如果未设置,默认值为全时定义的默认路径 /AppData/Documents/QuanshiFiles/log
*/
-(void)initLogPath:(NSString*)logPath;
/**
* @brief 是否有GNetTang的会议实例创建过,主要用在 同时使用 TangClientSDK.framework 和GNetTangSDK.framework 会冲突,可以调用该接口,询问一下,当前是否有会议进行中。
*/
-(BOOL) isConferenceCreated;
/**
加入会议
@TangClientInterfaceObject 详细请参见:TangClientInterfaceObject
@completion
success 是否成功
succes为YES error的时候为空
succes为NO 的时候 , error不为空 读取NSString *errorMsg = error.userInfo[@"ERRORMESSAGE"];
*/
-(void)joinConfrenceWithReq:(TangClientInterfaceObject*) req completion:(void (^)(BOOL success, NSError *error))completion;
/**
离开会议
*/
-(void)exitConfrence;
/**
退出会议的回调通知,请在 joinConfrenceWithReq 前,调用此方法
finished:标识会议是否结束
@conFinishBolck finished error
*/
-(void)setConfrenceFinishBlock:(void (^)(BOOL finished, NSError *error))conFinishBolck;
/**
会议的回调通知,请在 joinConfrenceWithReq 前,调用此方法
@conStatusBolck
*/
-(void)setConfrenceStatusBlock:(void (^)(ConferenceStatus status, NSError *error))conStatusBolck;
/**
上传日志 到server
@userId 用户ID
@description 问题的描述
*/
-(void)uploadLogs:(NSString * )userId description:(NSString *)description completion:(void (^)(BOOL finished, NSError *error))completion;
/*
平台sdk version
*/
+(NSString *)gnetTangVersion;
/**
* SDK 版本信息
*
* @return SDK版本号
*/
+ (NSString *)sdkVersion;
#import <Foundation/Foundation.h>
typedef NS_ENUM(NSUInteger, TCAllowUserChooseVoiceType) {
TCAllowUserChooseVoiceType_Nil=0, //不设置,按照BOSS配置来
TCAllowUserChooseVoiceType_PSTN_VOIP=7, //电话+VOIP
TCAllowUserChooseVoiceType_CallIn_VOIP=3, //电话主动呼入+VOIP
TCAllowUserChooseVoiceType_PSTN=6, //仅电话
TCAllowUserChooseVoiceType_VOIP=1, //仅VOIP
TCAllowUserChooseVoiceType_CallIn=2, //仅主动呼入
};
typedef NS_ENUM(NSUInteger, TCPreferredVoiceType) {
TCPreferredVoiceType_NONE=0, //不设置,根据 AllowUserChooseVoiceType 来决定是下面哪种方式
TCPreferredVoiceType_NoVoice=7, //不选语音入会
TCPreferredVoiceType_PSTN=6, //PSTN入会
TCPreferredVoiceType_VOIP=1, //VOIP入会
};
/**
云会议邀请接口的人员定义
*/
@interface TCInvitePhone : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *phoneNumber;
@property (nonatomic, copy) NSString *userId;
@end
@interface TCHadInviteList : NSObject
@property (nonatomic, assign) NSInteger totalCount;
@property (nonatomic, assign) NSInteger hadCount;
@property (nonatomic, strong) NSArray<TCInvitePhone*>*attendeeList
@property (nonatomic, copy) NSString *pcode; //(参会人pcode)
@property (nonatomic, copy) NSString *conferenceId;//(会议ID)
@property (nonatomic, copy) NSString *tempConferenceId;//(临时会议ID)
@end
/**
云会议邀请接口
*/
@protocol TangClientInterfaceInviteDelegate<NSObject>
@required
/*
*会中点击邀请,调用的接口
*/
-(NSInteger)inviteWithAttendeeList:(TCHadInviteList*)hadInviteList completion:(void (^)(BOOL success, NSError *error,NSArray<TCInvitePhone*>*phoneList))completion;
/*
*会中参会人变化
*/
-(void)onHadAttendCountChanged:(NSInteger)count;
@end
@interface TangClientInterfaceObject : NSObject
/**
name 参会者姓名 必填. 值可以为:邮箱|用户名
邮箱:值为邮箱时后台会根据邮箱匹配出在全时用户系统中对应的用户姓名作为入会后参会者姓名
用户名:该名称作为入会后参会者姓名
*/
@property(nonatomic,strong) NSString *name;
/**
email :可为空。
*/
@property(nonatomic,strong) NSString *email;
/**
pcode 入会密码 必填 。值可以为参会人密码 |主持人密码
*/
@property(nonatomic,strong) NSString *pcode;
/**
userId 参会人全时系统中的UserID 可为空。如果传入userId 后台会根据UserId去匹配全时用户系统中用户,参会人姓名以全时系统中用户名为准
*/
@property(nonatomic,strong) NSString *userId;
/**
iconUrl 入会头像 可为空,为空使用该用户自己设定的头像
*/
@property(nonatomic,strong) NSString *iconUrl;
/**
conferenceId 会议的ID,可为空 ,如果该会议是预约会议必须要传入
*/
@property(nonatomic,strong) NSString *conferenceId;
/**
from 来源:可为空。
*/
@property(nonatomic,strong) NSString *from;
@property(nonatomic,strong) NSString *ucDomain;
/**
isShowInvite 控制是否显示 邀请参会人.
*/
@property(nonatomic,assign) BOOL isShowInvite;
/**
isShowChat :控制是否显示聊天
*/
@property(nonatomic,assign) BOOL isShowChat;
/**
isShowCallSelf 控制显示自我外呼
此API废弃,请使用 allowUserChooseVoiceType,设置 为TCAllowUserChooseVoiceType_CallIn_VOIP || TCAllowUserChooseVoiceType_CallIn 可实现
*/
//@property(nonatomic,assign) BOOL isShowCallSelf;
/**
allowUserChooseVoiceType 控制SDK语音的方式,默认为 AllowUserChooseVoiceType_Nil=1,不设置,按照BOSS配置来
TCAllowUserChooseVoiceType:
TCAllowUserChooseVoiceType_Nil, //不设置,按照BOSS配置来
TCAllowUserChooseVoiceType_PSTN_VOIP, //电话+VOIP
TCAllowUserChooseVoiceType_CallIn_VOIP, //电话主动呼入+VOIP
TCAllowUserChooseVoiceType_PSTN, //仅电话
TCAllowUserChooseVoiceType_VOIP, //仅VOIP
TCAllowUserChooseVoiceType_CallIn, //仅主动呼入
设置的allowUserChooseVoiceType值,必须是BOSS中配置的子集
BOSS中配置的子集范围:
TCAllowUserChooseVoiceType_PSTN_VOIP:电话+VOIP,电话主动呼入+VOIP,仅电话,仅VOIP,仅主动呼入
TCAllowUserChooseVoiceType_CallIn_VOIP:电话主动呼入+VOIP,仅VOIP,仅主动呼入
TCAllowUserChooseVoiceType_PSTN:仅电话,仅主动呼入
TCAllowUserChooseVoiceType_VOIP:仅VOIP
TCAllowUserChooseVoiceType_CallIn:仅主动呼入
*/
@property(nonatomic,assign) TCAllowUserChooseVoiceType allowUserChooseVoiceType;
/*
默认入会方式 取值范围:
TCPreferredVoiceType_NONE=0, //不设置,根据 AllowUserChooseVoiceType 来决定是下面哪种方式
TCPreferredVoiceType_NoVoice=7, //不选语音入会
TCPreferredVoiceType_PSTN=6, //PSTN入会
TCPreferredVoiceType_VOIP=1, //VOIP入会
推荐配置为:TCJoinConferenceVoiceType_NONE,不设置
*/
@property(nonatomic,assign) TCPreferredVoiceType preferredVoiceType;
/*
默认入会方式 为: TCPreferredVoiceType_PSTN PSTN入会,拨打的手机码号可以直接传入
*/
@property(nonatomic,strong) NSString *pstnCallNumber;
/**
isShowNameInput 入会时如果发现Name,emial,userId都为空 或者 会中已有主持人的情况下,会弹出 输入参会人姓名 对话框,让用户重新姓名后再入会.
*/
@property(nonatomic,assign) BOOL isShowNameInput;
/**
当前邀请的delegate实现对象,提供用户自定义实现邀请UI的,如果不设置,SDK默认为 弹出拨号邀请界面
*/
@property(nonatomic,assign) id<TangClientInterfaceInviteDelegate> currentInviteDelegate;
/**
extName 用户传入微信,QQ 邀请中带入的ID,没有的话不传入或者设置nil
extType 用户传入微信,QQ 邀请中带入的类型,没有的话不传入或者设置nil
Key:extName,value:extName's value
*/
@property(nonatomic,strong) NSDictionary *extPrama;
@end
在初始化完成后,即可在需要加入会议的代码中调用入会的API。
加入会议需要有参数 userId , username ,pCode
TangClientInterfaceObject *sampleObj = [[TangClientInterfaceObject alloc]init];
sampleObj.name = "姓名";
sampleObj.pcode ="入会密码";
sampleObj.userId = "全时系统中的UserID"; //可以为空,建议传入
sampleObj.conferenceId="xxxxx"; //conferenceId 会议的ID,可为空 ,如果该会议是预约会议必须要传入
sampleObj.preferredVoiceType=TCPreferredVoiceType_NONE; //建议设置为 NONE ,让SDK来弹出语音选择框,让用户选择语音方式入会
/**设置退会回调**/
[[TangClientInterface sharedTangClientInterface] setConfrenceFinishBlock:^(BOOL finished, NSError *error) {
//TODO:: deal back
}];
/**设置状态回调**/
[[TangClientInterface sharedTangClientInterface] setConfrenceStatusBlock:^(ConferenceStatus status, NSError *error) {
//TODO:: deal ConferenceStatus
NSLog(@"setConfrenceStatusBlock ->%zi",status);
}];
/**加入会议**/
[[TangClientInterface sharedTangClientInterface] joinConfrenceWithReq:sampleObj completion:^(BOOL finished, NSError *error) {
NSLog(@"error ->%@",error);
}];
上传日志接口,调用此接口会将全时SDK中记录的日志上传到云会议的服务器,并通知开发人员 上传日志需要有参数 userId , description
/**上传日志**/
NSString* userId="全时系统中的UserID";
NSString* description=@"";
[[TangClientInterface sharedTangClientInterface] uploadLogs: userId description:description completion:^(BOOL finished, NSError *error) {
//TODO:: deal back
}];
退会接口接口,调用此接口参会人(主持人)会离开会议。 上传日志需要有参数 userId , description
/**退出会议**/
[[TangClientInterface sharedTangClientInterface] exitConfrence];
在tc_default.bundle中config/appConfig.plist配置文件中,通过设置showMinimzeFucBtn:YES启用小球功能
读取windowStatus可以读取到会中是处于小球状态,还是最大化的状态
typedef NS_ENUM(NSUInteger, TCMeetingWindowStatus) {
TCMeetingWindowStatus_Mini, //变为小球了
TCMeetingWindowStatus_Max
};
/**
云会议窗口的状态
*/
@property(readonly)TCMeetingWindowStatus windowStatus;
/**读取会中窗口状态**/
[[TangClientInterface sharedTangClientInterface] windowStatus];
/**设置状态回调**/
[[TangClientInterface sharedTangClientInterface] setConfrenceStatusBlock:^(ConferenceStatus status, NSError *error) {
//TODO:: deal ConferenceStatus
NSLog(@"setConfrenceStatusBlock ->%zi",status);
}];
/**设置退会回调**/
[[TangClientInterface sharedTangClientInterface] setConfrenceFinishBlock:^(BOOL finished, NSError *error) {
//TODO:: deal back
}];
/**
* @brief 是否有GNetTang的会议实例创建过,主要用在 同时使用 TangClientSDK.framework 和 GNetTangSDK.framework 会冲突,可以调用该接口,询问一下,当前是否有会议进行中。
*/
-(BOOL) isConferenceCreated;;
[[TangClientInterface sharedTangClientInterface] isConferenceCreated];
/**
初始化云会议系统的LogPath
如果未设置,默认值为全时定义的默认路径 /AppData/Documents/QuanshiFiles/log
*/
-(void)initLogPath:(NSString*)logPath;
[TangClientInterface initLogPath:log的路径];
/*
平台sdk version
*/
+(NSString *)gnetTangVersion;
/**
* SDK 版本信息
*
* @return SDK版本号
*/
+ (NSString *)sdkVersion;
/*
1.实现 TangClientInterfaceInviteDelegate 接口
2.入会时,设置当前邀请自定义的代码 currentInviteDelegate
TangClientInterfaceObject *sampleObj = [[TangClientInterfaceObject alloc]init];
sampleObj.currentInviteDelegate= [[TangClientInterfaceInviteDelegate alloc] init]; //此处代码替换为自定义实现的邀请代码
具体实现可以参考DEMO实现
*/;
错误码 | 含义 |
---|---|
50101 | 服务器出了点小问题,稍等再试一下吧 |
50102 | 服务器出了点小问题,稍等再试一下吧 |
50103 | 服务器出了点小问题,稍等再试一下吧 |
50104 | 服务器出了点小问题,稍等再试一下吧 |
50105 | 服务器出了点小问题,稍等再试一下吧 |
50106 | 服务器出了点小问题,稍等再试一下吧 |
50107 | 服务器出了点小问题,稍等再试一下吧 |
50200 | 入会失败,请重试(50200) |
50209 | 没有找到相关会议 |
50310 | 获取ums帐号信息失败 |
50311 | 你没有主持人权限,请联系贵公司管理员或客服400-810-1919 |
50312 | 会议密码失效,请联系会议主持人 |
50313 | 你的主持人试用权限已到期,请联系客服400-810-1919 |
50314 | 会议密码失效,请联系会议主持人 |
52014 | QSBOSS服务器连接失败 |
52015 | QSBOSS创建帐号失败 |
52016 | UMS服务器连接失败 |
52017 | 获取站点信息为空 |
52018 | 获取用户信息为空 |
52019 | 获取用户产品信息为空 |
52020 | 用户加入会议方式错误 |
50404 | 帐号所属站点被禁用 |
50406 | 帐号被禁用 |
50407 | 帐号已过期 |
50408 | 帐号已欠费 |
50794 | 获取参会人信息失败,无法识别的签到类型标识 |
50701 | 请输入正确的会议密码 //会议密码不正确,请重新输入 |
50703 | 你的帐号已欠费,请联系贵公司管理员或客服400-810-1919 |
50704 | 你没有主持人权限,请联系贵公司管理员或客服400-810-1919 |
50705 | 帐号已禁用,请联系贵公司管理员或客服400-810-1919 |
50707 | 入会失败,请重试(50707) |
50708 | 会议已过期 |
50709 | 会议已取消,请联系会议主持人 |
50710 | 50710 |
50711 | 请在会议开始前30分钟内入会 |
50712 | 主持人已在会中,不能重复入会 |
50713 | 你已在会中,不能重复入会 |
50714 | 会议已锁定,如需入会请联系主持人 |
50715 | 会中人数已满\n如想入会请通知贵公司管理员协助 |
50716 | 贵公司的会议服务已终止,请联系贵公司管理员或客服400-810-1919 |
50717 | 用户入会站点不正确 |
50718 | 帐号或密码错误 |
50719 | 验证码不正确 |
50720 | 会议已取消 |
50721 | 会议未开始 |
50722 | 会议解锁失败 |
50723 | 入会失败,请重试(50723) |
50724 | Billingcode异常 |
50725 | 会议锁定失败 |
50727 | 临时会议id创建失败 |
50728 | 预约会议,会议表不存在 |
50729 | 仅注册用户可以入会 |
50730 | 仅本公司用户可以入会 |
50731 | 你使用了别人的主持人密码,为了会议安全,建议使用参会人身份入会 |
50732 | 你使用了自己的参会人密码,会影响你主持会议,建议使用主持人密码%@入会 |
50811 | 踢人失败 |
51002 | 服务器出了点小问题,稍等再试一下吧 |
51003 | 服务器出了点小问题,稍等再试一下吧 |
51004 | 服务器出了点小问题,稍等再试一下吧 |
51005 | 服务器出了点小问题,稍等再试一下吧 |
51006 | 服务器出了点小问题,稍等再试一下吧 |
51007 | 服务器出了点小问题,稍等再试一下吧 |
51008 | 服务器出了点小问题,稍等再试一下吧 |
51010 | 服务器出了点小问题,稍等再试一下吧 |
51011 | 服务器出了点小问题,稍等再试一下吧 |
51101 | 服务器出了点小问题,稍等再试一下吧 |
51102 | 服务器出了点小问题,稍等再试一下吧 |
51106 | 服务器出了点小问题,稍等再试一下吧 |
51109 | 服务器出了点小问题,稍等再试一下吧 |
51201 | 服务器出了点小问题,稍等再试一下吧 |
52229 | 云会议SDK需要更新才能入会,请联系贵公司管理员或全时客服400-810-1919. |
-1004 | 网络不可用,请检查你的网络设置 |
-1005 | 网络不可用,请检查你的网络设置 |
-1006 | 网络不可用,请检查你的网络设置 |
-1001 | 网络不可用,请检查你的网络设置 |
-999 | 取消请求 |
15000 | 入会失败 |
15001 | 入会失败(网络连接失败) |
15002 | 入会失败(网络认证失败) |
15003 | 入会失败(获取会议信息失败) |
15004 | 入会失败(获取用户信息失败) |
15005 | 不能访问麦克风,去“设置”中允许访问麦克风才能使用网络语音 |
15006 | 入会失败 |
15007 | 取消入会 |
15101 | channelAuthError |
16000 | json解析失败 |
17000 | 如需使用该功能,请联系贵公司管理员或全时客服400-810-1919. |
17001 | 入会过程中,不能重复入会 |
-1 | 服务器出了点小问题,稍等再试一下吧 |
1.云会议SDK类型都是TC开头的,请开发避免冲突
2.App方向设置,配置target支持 UIInterfaceOrientationMaskAllButUpsideDown,如果不希望支持多方向,请在您的delegate文件中实现
- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
return UIInterfaceOrientationMaskPortrait; }
3.NSUserDefault中全时使用了 PhoneNumber,keyNetworkNoticeConfig 的Key,不要重复使用
4.IOS的Platform SDK的兼容版本为9.0以上版本
5.因为全时云会议在会中会可能需要使用到音频(麦克风,喇叭),视频(摄像头),请避免这些资源的竞争
6.进入会议后,不要修改StateBar 颜色,显示隐藏状态。(小球状态下除外)
7.进入会议后,不要修改会中window 的 NavgationBar
8.调用会议接口,必须在主线程里面调用
9.全时会中操作了 idleTimerDisabled,会中不自动锁定屏幕
10.在会中时,集成方的App不要主动去弹出 UIAlertView,如果方向和声明的主方向不一致的话,会导致崩溃
11.TanbClientInterfaceObject接口中,allowUserChooseVoiceType一定要是BOSS中配置的子集。
12.目前TangClientSDK去除了对Bugly编译的连接,强烈建议第三方应用在自己App中集成Bugly,这样Crash后问题好跟踪。如何集成 参考TangClientSample 的DEMO 项目 或者 参考 Bugly官网。集成Bugly后可以使用我们提供的默认BuglyId(56e74d5b48),也可以使用自己的(请把QQ:4331420加入到自己的Bugly网站管理中)。
13.在会中的时候,以及最大化的时候sdk会设置自己为keywindow,变小球最小化的时候会把key window还原,因此,请考虑到key window的变化而进行对keywindow的操作,以免发生以下错误案例 :
最小化的时候执行[self performSelector:@selector(hideView) withObject:nil afterDelay:1]
-(void)hideView{
[[UIApplication sharedApplication].keyWindow.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj isEqual:self.aview]) {
obj.hidden = YES;
}
}];
}
如果一秒内手动最大化,则会导致self.aview不会隐藏,因为key window已经发生了变化
14.对于入会joinConfrenceWithReq 的callback的返回值, 如果错误码返回 15007 (取消入会),建议第三方应用不要提示用户。 如果错误码返回 17001 (入会过程中,不能重复入会),建议:浮层提示用户,或者不提示 其他错误码正常提示。