更新时间:2019-11-20
在开发的过程中请满足如下环境要求。
环境和工具名称 |
版本要求 |
---|---|
操作系统 |
Mac OSX High Sierra 10.13.6及以上 |
Xcode |
Xcode9.4.1及以上 |
iOS系统版本 |
iOS9.0及以上,64位设备 |
会议云服务的用户帐号 |
帐号可来源于华为公有云。开通方法请参见“开发前准备”。 |
由于TUP的库文件是静态库,因此依赖库需要手动添加,下面只介绍libc++.tbd的添加,其他库添加方式相同。
Foundation.framework :包含Cocoa Foundation层的类和方法。
UIKit.framework :包含iOS应用程序用户界面层使用的类和方法。
OpenGLES.framework :包含OpenGL ES接口。OpenGL ES框架是OpenGL跨平台2D和3D渲染库的跨平台版本。
AudioToolbox.framework :包含处理音频流数据以及播放或录制音频的接口。
VedioToolbox.framework:提供硬解码和硬编码API
AVFoundation.framework :包含播放或录制音频的Objective-C接口。
CoreAudio.framework:包含Core Audio框架使用的各种数据类型。
CoreData.framework :包含管理应用程序数据模型的接口。
MediaPlayer.framework :包含显示全屏视频的接口。
SystemConfiguration.framework:包含用于处理设备网络配置的接口。
Security.framework :包含管理证书、公钥私钥以及信任策略的接口。
QuartzCore.framework :包含Core Animation接口。
CoreVideo.framework :包含操作音频和视频的底层例程。
CoreMedia.framework :包含操作音频和视频的底层例程。
AVFoundation.framework :包含播放或录制音频的Objective-C接口。
MobileCoreServices.framework :定义系统支持的统一类型标识符(UTIs).
按照此方法依次添加“Privacy - Camera Usage Description”、“Privacy - Contacts Usage Description”和“Privacy - Photo Library Usage Description”。
麦克风权限:Privacy - Microphone Usage Description
相机权限: Privacy - Camera Usage Description
相册权限: Privacy - Photo Library Usage Description
通讯录权限:Privacy - Contacts Usage Description
源码链接:ViewController.mm.
代码参考
单击上述结构中的文件名获取文件源码,并向各文件填充代码。部分代码片段参考如下:
TSDK_VOID onTSDKNotifications(TSDK_UINT32 msgid, TSDK_UINT32 param1, TSDK_UINT32 param2, TSDK_VOID *data) { NSLog(@"onTUPLoginNotifications : %#x",msgid); dispatch_async(dispatch_get_main_queue(), ^{ switch (msgid) { case TSDK_E_LOGIN_EVT_AUTH_SUCCESS: { NSLog(@"Uportal login success !"); [ViewController showMessages:@"Uportal login success"]; } break; case TSDK_E_LOGIN_EVT_AUTH_FAILED: { NSLog(@"Uportal login fail !"); [ViewController showMessages:@"Uportal login fail"]; } break; default: break; } }); } -(BOOL)initUportalLoginService { TSDK_S_LOG_PARAM logParam; memset(&logParam, 0, sizeof(TSDK_S_LOG_PARAM)); NSString *logPath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingString:@"/TUPC60log"]; NSString *path = [logPath stringByAppendingString:@"/tsdk"]; logParam.level = TSDK_E_LOG_DEBUG; logParam.file_count = 1; logParam.max_size_kb = 4*1024; strcpy(logParam.path, [path UTF8String]); TSDK_RESULT result = tsdk_set_config_param(TSDK_E_CONFIG_LOG_PARAM, &logParam); TSDK_S_APP_INFO_PARAM app_info; memset(&app_info, 0, sizeof(TSDK_S_APP_INFO_PARAM)); app_info.client_type = TSDK_E_CLIENT_MOBILE; strcpy(app_info.product_name, "SoftClient on Mobile"); app_info.support_audio_and_video_call = TSDK_TRUE; app_info.support_ctd = TSDK_TRUE; app_info.support_audio_and_video_conf = TSDK_TRUE; app_info.support_enterprise_address_book = TSDK_TRUE; result = tsdk_init(&app_info ,&onTSDKNotifications); return result == TSDK_SUCCESS ? YES : NO; }
NSString *account = @"Account"; NSString *password = @"Password"; NSString *serverAddress = @"192.168.1.100"; int port = 443; -(BOOL)loginAuthorizeWithServerAddress:(NSString *)serverAddress port:(int)port account:(NSString *)account password:(NSString *)password { TSDK_S_LOGIN_PARAM loginParam; memset(&loginParam, 0, sizeof(TSDK_S_LOGIN_PARAM)); loginParam.user_id = 1; loginParam.auth_type = TSDK_E_AUTH_NORMAL; strcpy(loginParam.user_name, [account UTF8String]); strcpy(loginParam.password, [password UTF8String]); loginParam.server_type = TSDK_E_SERVER_TYPE_PORTAL; strcpy(loginParam.server_addr, [serverAddress UTF8String]); loginParam.server_port = (TSDK_UINT16)port; TSDK_RESULT result = tsdk_login(&loginParam); return result == TSDK_SUCCESS ? YES : NO; }
TSDK_VOID onTSDKNotifications(TSDK_UINT32 msgid, TSDK_UINT32 param1, TSDK_UINT32 param2, TSDK_VOID *data) { NSLog(@"onTUPLoginNotifications : %#x",msgid); dispatch_async(dispatch_get_main_queue(), ^{ switch (msgid) { case TSDK_E_LOGIN_EVT_AUTH_SUCCESS: { NSLog(@"Uportal login success !"); [ViewController showMessages:@"Uportal login success"]; } break; case TSDK_E_LOGIN_EVT_AUTH_FAILED: { NSLog(@"Uportal login fail !"); [ViewController showMessages:@"Uportal login fail"]; } break; default: break; } }); }
分类 |
输入信息 |
说明 |
备注 |
---|---|---|---|
鉴权信息 |
ServerAddress |
eSDK服务器地址 |
入参不能为空 |
Server Port |
eSDK服务器端口号 |
||
Account |
eSDK登录名 |
||
Password |
eSDK鉴权密码 |
入参不能为空 |
以上信息需要在成功预约华为远程实验室后,从远程实验室获取。
描述
iOS端屏幕共享需要进行iOS Extension的开发进行实现,以下步骤用于说明如何集成SDK进行屏幕共享Extension的开发,另外由于相关特性对系统能力的依赖,因此需要iOS12及以上版本才能支持屏幕共享功能。
业务流程
ReplayKit.framework:系统库
CloudLinkMeetingScreenShare.framework:SDK提供的库
#import "SampleHandler.h" #import <CLoudLinkMeetingScreenShare/ScreenShareManager.h> @interface SampleHandler()<ScreenShareManagerDelegate> @property (strong, nonatomic) ScreenShareManager *screenShareManager; @end @implementation SampleHandler - (instancetype)init { if (self = [super init]) { self.screenShareManager = [[ScreenShareManager alloc] initWithAppGroupIdentifier:自己申请的appGroupIdentifier]; self.screenShareManager.delegate = self; } return self; } - (void)broadcastStartedWithSetupInfo:(NSDictionary<NSString *,NSObject *> *)setupInfo { // User has requested to start the broadcast. Setup info from the UI extension can be supplied but optional. [self.screenShareManager broadcastStartedWithSetupInfo:setupInfo]; } - (void)dealloc { self.screenShareManager = nil; } - (void)broadcastPaused { // User has requested to pause the broadcast. Samples will stop being delivered. [self.screenShareManager broadcastPaused]; } - (void)broadcastResumed { // User has requested to resume the broadcast. Samples delivery will resume. [self.screenShareManager broadcastResumed]; } - (void)broadcastFinished { // User has requested to finish the broadcast. [self.screenShareManager broadcastFinished]; } - (void)processSampleBuffer:(CMSampleBufferRef)sampleBuffer withType:(RPSampleBufferType)sampleBufferType { switch (sampleBufferType) { case RPSampleBufferTypeVideo: // Handle video sample buffer [self.screenShareManager processSampleBuffer:sampleBuffer withType:RPSampleBufferTypeVideo]; break; case RPSampleBufferTypeAudioApp: // Handle audio sample buffer for app audio break; case RPSampleBufferTypeAudioMic: // Handle audio sample buffer for mic audio break; default: break; } } - (void)screenShareManagerFinishBroadcastWithError:(NSError *)error { [self finishBroadcastWithError: error]; } @end