使用SDK和您自己的UI

Talk SDK包括一个随时可用的内置UI。但是,如果它不能满足您的集成需求,您可以构建并使用自己的UI,将其与封装并交付所有Talk SDK功能的SDK api连接起来。

本节描述如何在您自己的UI中使用Talk SDK API。要自定义SDK内置UI的外观,请参见自定义外观

先决条件

Talk SDK如中所述集成在应用程序中开始.所有的步骤打电话适用。

在开始之前

使用Talk SDK进行调用的过程包括两个步骤:

  • 准备和配置数字线路设置。这包括确保授予麦克风访问权限,获取数字线路的状态和录音同意,如果需要,询问用户的录音同意,以及验证代理的可用性
  • 拨打电话并响应其状态变化。这包括向用户显示调用信息,并让用户执行与调用相关的操作

在Talk SDK中,这两个职责由CallConfigurationScreen而且CallScreen视图控制器。有关示例实现,请参见使用开箱即用的UI进行呼叫

在使用带有自定义UI的SDK时,您可以选择管理其中一个或两个职责。你可以使用以下两种方法之一:

  • 一种全自定义方法,在这种方法中实现CallConfigurationScreen而且CallScreen从头开始
  • 混合方法,从头开始只实现其中一个职责,而对另一个职责使用SDK。例如,您可以实现自己的CallConfigurationScreen但是使用CallScreenSDK。或者,您可以使用CallConfigurationScreen从SDK,但实现自己的CallScreen从头开始

以下部分描述如何实现所需的功能CallConfigurationScreen而且CallScreen使用系统和SDK api:

如果要使用混合方法,请参见使用开箱即用的UI进行呼叫有关使用和自定义SDK提供的部件的信息。

实现自定义呼叫配置屏幕

您可以使用系统和SDK api构建自己的呼叫配置屏幕功能。您需要在呼叫建立流程中执行以下步骤才能进行呼叫。

  1. 检查麦克风访问
  2. 申请麦克风访问(如适用)
  3. 检查线路状态
  4. 开始通话

检查麦克风访问

通话需要有麦克风接入权限。UI流应该检查以下权限值:

麦克风的许可 需要的行动
待定/AVAudioSessionRecordPermissionUndetermined 使用系统API请求权限
否认/AVAudioSessionRecordPermissionDenied 通知用户呼叫不能进行,用户可以在系统的权限中授予权限>隐私>麦克风
授予/AVAudioSessionRecordPermissionGranted 无需执行其他操作。流程可以转到下一步

使用系统AVFoundation框架检查麦克风访问权限。下面的代码示例显示了如何检查麦克风访问权限的当前状态:

斯威夫特

             
private func checkMicrophonePermission() {开关AVAudioSession.sharedInstance()。recordPermission {案例.undetermined://可以使用:/ / AVAudioSession.sharedInstance .requestRecordPermission ()案例.denied://访问被拒绝,在UI中通知用户调用//在允许麦克风访问之前不能进行//在设置->隐私->麦克风案例.granted://访问权限被授予后,可以进行下一步建立调用}}

对于上面的Swift示例,您需要导入AVFoundation

objective - c

             
-无效checkMicrophonePermission开关AVAudioSession sharedInstancerecordPermission情况下AVAudioSessionRecordPermissionUndetermined//可以使用:// [[AVAudioSession sharedInstance] requestRecordPermission:]打破情况下AVAudioSessionRecordPermissionDenied//访问被拒绝,在UI中通知用户调用//在允许麦克风访问之前不能进行//在设置->隐私->麦克风打破情况下AVAudioSessionRecordPermissionGranted//访问权限被授予后,可以进行下一步建立调用打破}}

您将需要为上面的Objective-C示例导入AVFoundation

请求麦克风访问

如果用户尚未响应麦克风权限请求,则权限值为待定/AVAudioSessionRecordPermissionUndetermined.您可以使用系统API提示用户授予对麦克风的访问权限。

斯威夫特

             
private func requestMicrophonePermission() {AVAudioSession.sharedInstance()。requestRecordPermission{授予in如果批准{//访问权限被授予后,可以进行下一步建立调用}其他{//访问被拒绝,在UI中通知用户调用//在允许麦克风访问之前不能进行//在设置->隐私->麦克风}}}

对于上面的Swift示例,您需要导入AVFoundation

objective - c

             
-无效requestMicrophonePermissionAVAudioSession sharedInstancerequestRecordPermissionBOOL授予如果授予//访问权限被授予后,可以进行下一步建立调用}其他的//访问被拒绝,在UI中通知用户调用//在允许麦克风访问之前不能进行//在设置->隐私->麦克风}}}

您将需要为上面的Objective-C示例导入AVFoundation

有关详细信息,请参阅Apple文档requestRecordPermission (_)方法。

使用lineStatus (digitalLine:完成)方法确定数字线路是否有可用的代理。我们建议在没有座席可用时隐藏呼叫按钮,以改善用户体验。除了代理可用性之外,该方法还返回数字线路的当前记录同意配置。

斯威夫特

             
说话。lineStatus(digitalLine: "digitalLineNickname"){(结果)在let isAgentAvailable: Boollet recordingConsent:记录同意切换结果{case .success(let lineStatus):isAgentAvailable = lineStatus.agentAvailablerecordingConsent = lineStatus.recordingConsentcase .failure(let agentStatusError):isAgentAvailable = falserecordingConsent = .unknown//处理agentStatusError}//根据isAgentAvailable & recordingConsent更新UI}

objective - c

             
__weaktypeof自我weakSelf自我讨论lineStatusWithDigitalLine@“digitalLineNickname”完成id<LineStatus>_Nullable lineStatus,NSError_Nullable错误BOOL isAgentAvailable没有RecordingConsent RecordingConsentRecordingConsentUnknown如果lineStatus! =isAgentAvailablelineStatusagentAvailablerecordingConsentlineStatusrecordingConsent}其他的//处理错误}//根据isAgentAvailable & recordingConsent更新UI}

lineStatus (digitalLine:完成)方法成功完成时,它包含以下属性:

LineStatus财产 描述
agentAvailable 布尔值通知代理可用性
recordingConsent 描述用于记录同意的行设置的枚举

数字线路的记录同意配置可以有以下值:

记录同意 描述
optIn / RecordingConsentOptIn 通话录音默认关闭,但终端用户可以选择是否加入
撤出/ RecordingConsentOptOut 通话录音默认开启,但终端用户可以选择不录音
unknown / RecordingConsentUnknown 通话记录没有在通话设置中定义

当数字线路的录制同意被定义为未知的,不需要向最终用户展示UI。在另外两种情况下,UI需要通知终端用户线路的配置,并为用户提供从呼叫记录中选择加入或退出的选项。

开始通话

在完成上述检查并征得最终用户同意进行通话录音后,即可开始通话。你有两个选择:

  • 创建并直接显示SDK调用屏幕,见presentCallScreen (recordingConsentAnswer:)函数在第二部分的例子中使用开箱即用的UI进行呼叫
  • 实现用于启动和管理呼叫的自定义呼叫屏幕。看到下一节

实现自定义呼叫屏幕

呼叫屏幕的职责是发起呼叫并向用户显示与呼叫相关的信息。它还必须让用户执行与调用相关的操作。调用屏幕不一定要用全屏视图控制器来表示。如何在UI中表示它取决于您的用例。

打电话

使用调用(callData: statusChangeHandler:)函数说话实例启动调用。该函数以参数a作为参数CallDataprotocol-conforming对象。SDK的TalkCallData满足了这个要求。该对象具有以下属性:

  • digitalLine——数字线路的昵称
  • recordingConsentAnswer-最终用户对与该数字线路的默认录制配置相关的录制同意问题的回答。的recordingConsentAnswer应说明最终用户是否选择加入或退出通话记录。

注意:如果lineStatus (digitalLine:完成)为数字行返回“unknown”recordingConsent配置中,CallData应提供的未知的价值。这反映了数字线路要么不支持录制、录制同意配置,要么没有设置的情况。

的第二个参数调用(callData: statusChangeHandler:)是一个处理程序,使应用程序能够正确地响应各种调用状态转换,并在UI中反映这些转换。有关详细信息和代码示例,请参见处理呼叫状态

斯威夫特

             
let callData = TalkCallData(digitalLine: "digitalLineNickname",recordingConsentAnswer recordingConsentAnswer)://返回的' TalkCall '对象需要在持续时间内保持为强//调用,因为它的过早释放将停止调用自我。talkCall =谈话。调用(callData: callData,statusChangeHandler: onCallStatusChange(状态:错误:)

objective - c

             
ZDKTalkCallDatacallDataZDKTalkCallData allocinitWithDigitalLine@“digitalLineNickname”recordingConsentAnswer回答__weaktypeof自我weakSelf自我//返回的' TalkCall '对象需要在持续时间内保持为强//调用,因为它的过早释放将停止调用自我talkCall自我讨论callWithCallDatacallData statusChangeHandler枚举CallStatus状态,NSError_Nullable错误weakSelf __onCallStatusChange状态错误错误}

注意:开始通话时,aTalkCall返回实例。必须存储此对象并根据正在进行的调用的持续时间控制其生命周期。如果不这样做,将导致调用堆栈被释放,调用被丢弃。为了启用调用期间可能执行的任何用户操作,还需要对该实例的引用。示例操作包括更改音频源、设置麦克风静音或挂断。

处理呼叫状态

StatusChangeHandler可以作为内联闭包提供,但在下面的例子中,为了清晰起见,它被提取为一个单独的函数。它在每次调用状态改变时被调用状态.的错误是可选的,是对象的错误对象时断开连接而且失败的的状态。

斯威夫特

             
private func onCallStatusChange(状态:CallStatus,错误:TalkCallError?) {开关状态{案例.connecting://通话中案例.connected://通话已接通案例.disconnected://由于终端用户、座席或错误条件,呼叫已断开//可能是由于一个'错误',检查如果不是nil案例fail://呼叫连接失败//可能是由于一个'错误',检查如果不是nil案例.reconnecting://呼叫开始重新连接案例.reconnected://呼叫已重新连接}}

objective - c

             
-无效__onCallStatusChangeCallStatus状态错误NSError错误开关状态情况下CallStatusConnecting//通话中打破情况下CallStatusConnected//通话已接通打破情况下CallStatusDisconnected//由于终端用户、座席或错误条件,呼叫已断开//可能是由于一个'错误',检查如果不是nil打破情况下CallStatusFailed//呼叫连接失败//可能是由于一个'错误',检查如果不是nil打破情况下CallStatusReconnecting//呼叫开始重新连接打破情况下CallStatusReconnected//呼叫已重新连接打破}}

静音或取消静音

您可以对正在进行的通话进行静音或取消静音。属性的getter和setter柔和的的属性TalkCall实例检查和更改呼叫的静音状态。

斯威夫特

             
//获取当前静音状态let ismute = talkcall .mute//切换到相反的静音状态talkCall。柔和的=!isMuted

objective - c

             
//获取当前静音状态BOOL isMuted自我talkCall柔和的//切换到相反的静音状态自我talkCall柔和的isMuted

更改呼叫的音频输出

您可以将通话的音频输出从设备的耳机更改为其内置扬声器。默认情况下,音频通过耳机播放。属性的getter和setteraudioOutput的属性TalkCall实例检查和更改当前调用的音频输出。

AudioOutput枚举有以下值:

AudioOutput值 描述
演讲者 音频通过内置的设备扬声器传输
耳机 音频通过设备耳机路由

斯威夫特

             
//检查当前音频输出是否设置为耳机let isAudioOutputHeadset = talkCall。audioOutput == .耳机//切换当前音频输出到其他值talkCall。audioOutput = isAudioOutputHeadset ?扬声器:耳机

objective - c

             
//检查当前音频输出是否设置为耳机BOOL isAudioOutputHeadset自我talkCallaudioOutput= =AudioOutputHeadset//切换当前音频输出到其他值自我talkCallaudioOutputisAudioOutputHeadset?AudioOutputSpeakerAudioOutputHeadset

更改呼叫的音频路由

您可以查看和更改正在通话中当前选择的音频路由选项。默认情况下,音频路由设置为内置选项。根据设备类型,可能有不同的内置选项可用。如果可用,可以选择外部蓝牙连接设备进行系统级的音频路由(这通常在连接时发生)。属性的getter和setteraudioRouting的属性TalkCall实例检查和更改当前呼叫的音频路由设置。

AudioRoutingOption对象具有以下属性:

AudioRoutingOption性能 描述
的名字 路由选项的本地化名称
类型 的音频路由选项的类型AudioRoutingType类型

AudioRoutingType枚举有以下值:

AudioRoutingType值 描述
内装式 用于使用内置扬声器和麦克风的路由选项
类型 用于使用蓝牙连接的路由选项

要访问当前可用的音频路由选项的列表,请使用availableAudioRoutingOptions的属性TalkCall实例。

注意:作为处理音频输入/输出路由的替代方法,您可以使用AVRoutePickerViewAVKit框架。看到AVRoutePickerView在苹果文档中。

断开通话

要断开呼叫,请使用断开()函数。调用它之后,TalkCall实例可以被释放和释放。

斯威夫特

             
talkCall.disconnect ()

objective - c

             
自我talkCall断开