台湾一级a毛片在线播放,黄色精品偷拍视频大全,精品一区二区在线欧美日韩,日本特黄一级视频播三级片,日韩美女18岁美女视频,偷偷操不一样的99,国产午夜激无码av毛片久

智慧服務(wù),成就美好體驗(yàn) 項(xiàng)目咨詢(xún)

主頁(yè) > 服務(wù)與支持 > 開(kāi)發(fā)平臺(tái) > 客戶(hù)端SDK參考 > iOS Native SDK > 快速入門(mén) 快速入門(mén)

入門(mén)使用

快速入門(mén)

更新時(shí)間:2019-11-20

開(kāi)發(fā)準(zhǔn)備環(huán)境

在開(kāi)發(fā)的過(guò)程中請(qǐng)滿(mǎn)足如下環(huán)境要求。

表1 環(huán)境要求

環(huán)境和工具名稱(chēng)

版本要求

操作系統(tǒng)

Mac OSX High Sierra 10.13.6及以上

Xcode

Xcode9.4.1及以上

iOS系統(tǒng)版本

iOS9.0及以上,64位設(shè)備

會(huì)議云服務(wù)的用戶(hù)帳號(hào)

帳號(hào)可來(lái)源于華為公有云。開(kāi)通方法請(qǐng)參見(jiàn)“開(kāi)發(fā)前準(zhǔn)備”。

創(chuàng)建工程

  1. 打開(kāi)Xcode,選擇“File > New > Project”。系統(tǒng)顯示選擇模板界面;選擇工程類(lèi)型“Single View Application”,單擊“Next”。系統(tǒng)顯示配置界面。

     

     

  2. 在“Product Name” 處輸入“TSDK_Demo_iOS”,單擊“Next”。選擇一個(gè)工程路徑。

     

     

  3. 單擊選擇工程存放目錄路徑,點(diǎn)擊“Create”,系統(tǒng)顯示工程主界面。

     

     

 

引入庫(kù)文件

  1. 下載工程所需的庫(kù)文件包,解壓縮。在工程里新建文件夾,命名為“Depend”,把庫(kù)文件lib、ImSDK以及頭文件include放置在Depend文件夾里面。

     

     

  2. 右鍵單擊工程左側(cè)“eSDK_TUP_Demo_iOS”項(xiàng)目名稱(chēng),右鍵選擇“Add Files to “eSDK_TUP_Demo_iOS”...”,系統(tǒng)顯示庫(kù)文件添加頁(yè)面。

     

     

  3. 根據(jù)庫(kù)文件存放目錄路徑(步驟1),將” Depend”文件夾添加到工程中,點(diǎn)擊“Add”,完成庫(kù)文件的添加。

     

     

 

添加依賴(lài)庫(kù)

注意:

由于TUP的庫(kù)文件是靜態(tài)庫(kù),因此依賴(lài)庫(kù)需要手動(dòng)添加,下面只介紹libc++.tbd的添加,其他庫(kù)添加方式相同。

  1. 選中工程,右鍵,選擇“New Group”。

     

     

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

     

     

  3. 按照下圖依次在點(diǎn)擊步驟1~3,彈出添加依賴(lài)庫(kù)文件的對(duì)話(huà)框。

     

     

  4. 在搜索框中查找libc++.tbd,選中,單擊“Add”。

     

     

  5. 將下圖所示的依賴(lài)庫(kù)按照上訴方法添加至工程。

     

    說(shuō)明: 

    Foundation.framework :包含Cocoa Foundation層的類(lèi)和方法。

    UIKit.framework :包含iOS應(yīng)用程序用戶(hù)界面層使用的類(lèi)和方法。

    OpenGLES.framework :包含OpenGL ES接口。OpenGL ES框架是OpenGL跨平臺(tái)2D和3D渲染庫(kù)的跨平臺(tái)版本。

    AudioToolbox.framework :包含處理音頻流數(shù)據(jù)以及播放或錄制音頻的接口。

    VedioToolbox.framework:提供硬解碼和硬編碼API

    AVFoundation.framework :包含播放或錄制音頻的Objective-C接口。

    CoreAudio.framework:包含Core Audio框架使用的各種數(shù)據(jù)類(lèi)型。

    CoreData.framework :包含管理應(yīng)用程序數(shù)據(jù)模型的接口。

    MediaPlayer.framework :包含顯示全屏視頻的接口。

    SystemConfiguration.framework:包含用于處理設(shè)備網(wǎng)絡(luò)配置的接口。

    Security.framework :包含管理證書(shū)、公鑰私鑰以及信任策略的接口。

    QuartzCore.framework :包含Core Animation接口。

    CoreVideo.framework :包含操作音頻和視頻的底層例程。

    CoreMedia.framework :包含操作音頻和視頻的底層例程。

    AVFoundation.framework :包含播放或錄制音頻的Objective-C接口。

    MobileCoreServices.framework :定義系統(tǒng)支持的統(tǒng)一類(lèi)型標(biāo)識(shí)符(UTIs).

     

 

工程配置

  1. iOS10后,我們需要在工程主界面Navigator的Info.plist文件中添加權(quán)限字段。選擇Info.plist文件,右擊任意一行,選中“Add Row”,直接輸入名稱(chēng)” Privacy - Microphone Usage Description ”,按回車(chē)鍵完成添加。

     

    按照此方法依次添加“Privacy - Camera Usage Description”、“Privacy - Contacts Usage Description”和“Privacy - Photo Library Usage Description”。

    說(shuō)明: 

    麥克風(fēng)權(quán)限:Privacy - Microphone Usage Description

    相機(jī)權(quán)限: Privacy - Camera Usage Description

    相冊(cè)權(quán)限: Privacy - Photo Library Usage Description

    通訊錄權(quán)限:Privacy - Contacts Usage Description

     

  2. 單擊Navigator下的工程名稱(chēng),選擇“Build Settings>Build Option>Enable Bitcode>NO”。

     

     

  3. 單擊Navigator下的工程名稱(chēng),選擇“Build Settings>Linking>Other Linker Flags”,添加“-ObjC”。

     

     

  4. 真機(jī)調(diào)試前,需要根據(jù)手機(jī)系統(tǒng)版本修改Deployment Target,需使其小于等于手機(jī)系統(tǒng)版本。

     

     

  5. TUP庫(kù)采用了C++的混編方式碼,您的工程還需要進(jìn)行其他配置。

     

    1. 點(diǎn)擊“TARGETS>Build Settings>Apple LLMV7.0-language-C++”,將“C++ Standard Library”的值設(shè)為“libstdc++(GUN C++ standrary library)”。

    2. 將工程目錄中的某一個(gè)實(shí)現(xiàn)過(guò)文件后綴手動(dòng)改為“.mm”。

     

 

編碼實(shí)現(xiàn)

源碼鏈接:ViewController.mm.

代碼參考

單擊上述結(jié)構(gòu)中的文件名獲取文件源碼,并向各文件填充代碼。部分代碼片段參考如下:

  • 選擇ViewController.mm,完成TUP庫(kù)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;
    
    }
     
  • 發(fā)送登錄請(qǐng)求
    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;
    }
     
  • 處理回調(diào)函數(shù)登錄事件。
    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;
            }
        });
    }
     

 

編譯及調(diào)試

  1. 單擊“Product > Run”,運(yùn)行后如下所示。

     

    圖1 界面 

     

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

     

    表2 界面信息

    分類(lèi)

    輸入信息

    說(shuō)明

    備注

    鑒權(quán)信息

    ServerAddress

    eSDK服務(wù)器地址

    入?yún)⒉荒転榭?/p>

    Server Port

    eSDK服務(wù)器端口號(hào)

    Account

    eSDK登錄名

    Password

    eSDK鑒權(quán)密碼

    入?yún)⒉荒転榭?/p>

    說(shuō)明: 

    以上信息需要在成功預(yù)約華為遠(yuǎn)程實(shí)驗(yàn)室后,從遠(yuǎn)程實(shí)驗(yàn)室獲取。

     

  3. 信息輸入完成后,單擊“Login”按鈕。等待至頁(yè)面彈出提示框,顯示“Login Success!”,表示調(diào)用服務(wù)成功。

     

    圖2 登錄成功 

     

會(huì)議中屏幕共享

描述

iOS端屏幕共享需要進(jìn)行iOS Extension的開(kāi)發(fā)進(jìn)行實(shí)現(xiàn),以下步驟用于說(shuō)明如何集成SDK進(jìn)行屏幕共享Extension的開(kāi)發(fā),另外由于相關(guān)特性對(duì)系統(tǒng)能力的依賴(lài),因此需要iOS12及以上版本才能支持屏幕共享功能。

業(yè)務(wù)流程

  1. 準(zhǔn)備過(guò)程:iOS應(yīng)用主工程、Extension的開(kāi)發(fā)所需要的證書(shū)和文件。
  2. 以下以CloudLinkMeetingDemo為例進(jìn)行說(shuō)明,打開(kāi)主工程中的AppGroup開(kāi)關(guān),并設(shè)置在第一步中申請(qǐng)到的可用的appid。

  3. 創(chuàng)建新的Extensions Target,選擇File---New---Target--Broadcast Upload Extension,創(chuàng)建Extension target。

  4. 打開(kāi)Extensions里面的appgroup開(kāi)關(guān)。

  5. 設(shè)置entitlements文件中的appGroups為第1步中申請(qǐng)的值。

  6. 在Extensions 的“Build Phases > Link Binary With Libraries”中添加如下庫(kù)。

    ReplayKit.framework:系統(tǒng)庫(kù)

    CloudLinkMeetingScreenShare.framework:SDK提供的庫(kù)

  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:自己申請(qǐng)的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. 屏幕共享有兩種開(kāi)啟方式,只能在會(huì)議中進(jìn)行。
    1. 會(huì)議中點(diǎn)擊下方的屏幕共享按鈕,選擇應(yīng)用進(jìn)行屏幕共享。

       

    2. 會(huì)議中打開(kāi)手機(jī)的控制中心,長(zhǎng)按錄制按鈕,彈出菜單中選擇。