智慧服务,成就美好体验 项目咨询

主页 > 服务与支持 > 开发平台 > 客户端SDK参考 > iOS Native SDK > 快速入门 快速入门

入门使用

快速入门

更新时间:2019-11-20

开发准备环境

在开发的过程中请满足如下环境要求。

表1 环境要求

环境和工具名称

版本要求

操作系统

Mac OSX High Sierra 10.13.6及以上

Xcode

Xcode9.4.1及以上

iOS系统版本

iOS9.0及以上,64位设备

会议云服务的用户帐号

帐号可来源于华为公有云。开通方法请参见“开发前准备”。

创建工程

  1. 打开Xcode,选择“File > New > Project”。系统显示选择模板界面;选择工程类型“Single View Application”,单击“Next”。系统显示配置界面。

     

     

  2. 在“Product Name” 处输入“TSDK_Demo_iOS”,单击“Next”。选择一个工程路径。

     

     

  3. 单击选择工程存放目录路径,点击“Create”,系统显示工程主界面。

     

     

 

引入库文件

  1. 下载工程所需的库文件包,解压缩。在工程里新建文件夹,命名为“Depend”,把库文件lib、ImSDK以及头文件include放置在Depend文件夹里面。

     

     

  2. 右键单击工程左侧“eSDK_TUP_Demo_iOS”项目名称,右键选择“Add Files to “eSDK_TUP_Demo_iOS”...”,系统显示库文件添加页面。

     

     

  3. 根据库文件存放目录路径(步骤1),将” Depend”文件夹添加到工程中,点击“Add”,完成库文件的添加。

     

     

 

添加依赖库

注意:

由于TUP的库文件是静态库,因此依赖库需要手动添加,下面只介绍libc++.tbd的添加,其他库添加方式相同。

  1. 选中工程,右键,选择“New Group”。

     

     

  2. 修改group的名字为“Frameworks”。

     

     

  3. 按照下图依次在点击步骤1~3,弹出添加依赖库文件的对话框。

     

     

  4. 在搜索框中查找libc++.tbd,选中,单击“Add”。

     

     

  5. 将下图所示的依赖库按照上诉方法添加至工程。

     

    说明: 

    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).

     

 

工程配置

  1. iOS10后,我们需要在工程主界面Navigator的Info.plist文件中添加权限字段。选择Info.plist文件,右击任意一行,选中“Add Row”,直接输入名称” Privacy - Microphone Usage Description ”,按回车键完成添加

     

    按照此方法依次添加“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

     

  2. 单击Navigator下的工程名称,选择“Build Settings>Build Option>Enable Bitcode>NO”。

     

     

  3. 单击Navigator下的工程名称,选择“Build Settings>Linking>Other Linker Flags”,添加“-ObjC”。

     

     

  4. 真机调试前,需要根据手机系统版本修改Deployment Target,需使其小于等于手机系统版本。

     

     

  5. TUP库采用了C++的混编方式码,您的工程还需要进行其他配置。

     

    1. 点击“TARGETS>Build Settings>Apple LLMV7.0-language-C++”,将“C++ Standard Library”的值设为“libstdc++(GUN C++ standrary library)”。

    2. 将工程目录中的某一个实现过文件后缀手动改为“.mm”。

     

 

编码实现

源码链接:ViewController.mm.

代码参考

单击上述结构中的文件名获取文件源码,并向各文件填充代码。部分代码片段参考如下:

  • 选择ViewController.mm,完成TUP库Login组件初始化。
    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;
            }
        });
    }
     

 

编译及调试

  1. 单击“Product > Run”,运行后如下所示。

     

    图1 界面 

     

  2. 在界面中依次输入如下表信息。

     

    表2 界面信息

    分类

    输入信息

    说明

    备注

    鉴权信息

    ServerAddress

    eSDK服务器地址

    入参不能为空

    Server Port

    eSDK服务器端口号

    Account

    eSDK登录名

    Password

    eSDK鉴权密码

    入参不能为空

    说明: 

    以上信息需要在成功预约华为远程实验室后,从远程实验室获取。

     

  3. 信息输入完成后,单击“Login”按钮。等待至页面弹出提示框,显示“Login Success!”,表示调用服务成功。

     

    图2 登录成功 

     

会议中屏幕共享

描述

iOS端屏幕共享需要进行iOS Extension的开发进行实现,以下步骤用于说明如何集成SDK进行屏幕共享Extension的开发,另外由于相关特性对系统能力的依赖,因此需要iOS12及以上版本才能支持屏幕共享功能。

业务流程

  1. 准备过程:iOS应用主工程、Extension的开发所需要的证书和文件。
  2. 以下以CloudLinkMeetingDemo为例进行说明,打开主工程中的AppGroup开关,并设置在第一步中申请到的可用的appid。

  3. 创建新的Extensions Target,选择File---New---Target--Broadcast Upload Extension,创建Extension target。

  4. 打开Extensions里面的appgroup开关。

  5. 设置entitlements文件中的appGroups为第1步中申请的值。

  6. 在Extensions 的“Build Phases > Link Binary With Libraries”中添加如下库。

    ReplayKit.framework:系统库

    CloudLinkMeetingScreenShare.framework:SDK提供的库

  7. 在Extensions 的SampleHandler.m文件中添加代码如下。
    #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
     
  8. 完成编码。
  9. 屏幕共享有两种开启方式,只能在会议中进行。
    1. 会议中点击下方的屏幕共享按钮,选择应用进行屏幕共享。

       

    2. 会议中打开手机的控制中心,长按录制按钮,弹出菜单中选择。