使用SDK和您自己的UI
使用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
但是使用CallScreen
SDK。或者,您可以使用CallConfigurationScreen
从SDK,但实现自己的CallScreen
从头开始
以下部分描述如何实现所需的功能CallConfigurationScreen
而且CallScreen
使用系统和SDK api:
如果要使用混合方法,请参见使用开箱即用的UI进行呼叫有关使用和自定义SDK提供的部件的信息。
实现自定义呼叫配置屏幕
您可以使用系统和SDK api构建自己的呼叫配置屏幕功能。您需要在呼叫建立流程中执行以下步骤才能进行呼叫。
检查麦克风访问
通话需要有麦克风接入权限。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 sharedInstance].recordPermission){
情况下AVAudioSessionRecordPermissionUndetermined:
//可以使用:
// [[AVAudioSession sharedInstance] requestRecordPermission:]
打破;
情况下AVAudioSessionRecordPermissionDenied:
//访问被拒绝,在UI中通知用户调用
//在允许麦克风访问之前不能进行
//在设置->隐私->麦克风
打破;
情况下AVAudioSessionRecordPermissionGranted:
//访问权限被授予后,可以进行下一步建立调用
打破;
}
}
您将需要为上面的Objective-C示例导入AVFoundation
请求麦克风访问
如果用户尚未响应麦克风权限请求,则权限值为待定
/AVAudioSessionRecordPermissionUndetermined
.您可以使用系统API提示用户授予对麦克风的访问权限。
斯威夫特
private func requestMicrophonePermission() {
AVAudioSession.sharedInstance()。requestRecordPermission{授予in
如果批准{
//访问权限被授予后,可以进行下一步建立调用
}其他{
//访问被拒绝,在UI中通知用户调用
//在允许麦克风访问之前不能进行
//在设置->隐私->麦克风
}
}
}
对于上面的Swift示例,您需要导入AVFoundation
objective - c
-(无效)requestMicrophonePermission
{
[[AVAudioSession sharedInstance]requestRecordPermission:^(BOOL授予){
如果(授予){
//访问权限被授予后,可以进行下一步建立调用
}其他的{
//访问被拒绝,在UI中通知用户调用
//在允许麦克风访问之前不能进行
//在设置->隐私->麦克风
}
}];
}
您将需要为上面的Objective-C示例导入AVFoundation
有关详细信息,请参阅Apple文档requestRecordPermission (_)方法。
检查线路状态并记录同意要求
使用lineStatus (digitalLine:完成)
方法确定数字线路是否有可用的代理。我们建议在没有座席可用时隐藏呼叫按钮,以改善用户体验。除了代理可用性之外,该方法还返回数字线路的当前记录同意配置。
斯威夫特
说话。lineStatus(digitalLine: "digitalLineNickname"){(结果)在
let isAgentAvailable: Bool
let recordingConsent:记录同意
切换结果{
case .success(let lineStatus):
isAgentAvailable = lineStatus.agentAvailable
recordingConsent = lineStatus.recordingConsent
case .failure(let agentStatusError):
isAgentAvailable = false
recordingConsent = .unknown
//处理agentStatusError
}
//根据isAgentAvailable & recordingConsent更新UI
}
objective - c
__weaktypeof(自我)weakSelf=自我;
[讨论lineStatusWithDigitalLine:@“digitalLineNickname”完成:^(id<LineStatus>_Nullable lineStatus,NSError*_Nullable错误){
BOOL isAgentAvailable=没有;
RecordingConsent RecordingConsent=RecordingConsentUnknown;
如果(lineStatus! =零){
isAgentAvailable=lineStatus.agentAvailable;
recordingConsent=lineStatus.recordingConsent;
}其他的{
//处理错误
}
//根据isAgentAvailable & recordingConsent更新UI
}];
当lineStatus (digitalLine:完成)
方法成功完成时,它包含以下属性:
LineStatus财产 | 描述 |
---|---|
agentAvailable |
布尔值通知代理可用性 |
recordingConsent |
描述用于记录同意的行设置的枚举 |
记录同意配置
数字线路的记录同意配置可以有以下值:
记录同意 | 描述 |
---|---|
optIn / RecordingConsentOptIn | 通话录音默认关闭,但终端用户可以选择是否加入 |
撤出/ RecordingConsentOptOut | 通话录音默认开启,但终端用户可以选择不录音 |
unknown / RecordingConsentUnknown | 通话记录没有在通话设置中定义 |
当数字线路的录制同意被定义为未知的
,不需要向最终用户展示UI。在另外两种情况下,UI需要通知终端用户线路的配置,并为用户提供从呼叫记录中选择加入或退出的选项。
开始通话
在完成上述检查并征得最终用户同意进行通话录音后,即可开始通话。你有两个选择:
- 创建并直接显示SDK调用屏幕,见
presentCallScreen (recordingConsentAnswer:)
函数在第二部分的例子中使用开箱即用的UI进行呼叫 - 实现用于启动和管理呼叫的自定义呼叫屏幕。看到下一节
实现自定义呼叫屏幕
呼叫屏幕的职责是发起呼叫并向用户显示与呼叫相关的信息。它还必须让用户执行与调用相关的操作。调用屏幕不一定要用全屏视图控制器来表示。如何在UI中表示它取决于您的用例。
打电话
使用调用(callData: statusChangeHandler:)
函数说话
实例启动调用。该函数以参数a作为参数CallData
protocol-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
ZDKTalkCallData*callData=[[ZDKTalkCallData alloc]initWithDigitalLine:@“digitalLineNickname”
recordingConsentAnswer:回答];
__weaktypeof(自我)weakSelf=自我;
//返回的' TalkCall '对象需要在持续时间内保持为强
//调用,因为它的过早释放将停止调用
自我.talkCall=[自我.讨论callWithCallData:callData statusChangeHandler:^(枚举CallStatus状态,NSError*_Nullable错误){
[weakSelf __onCallStatusChange:状态错误:错误];
}];
注意:开始通话时,aTalkCall
返回实例。必须存储此对象并根据正在进行的调用的持续时间控制其生命周期。如果不这样做,将导致调用堆栈被释放,调用被丢弃。为了启用调用期间可能执行的任何用户操作,还需要对该实例的引用。示例操作包括更改音频源、设置麦克风静音或挂断。
处理呼叫状态
的StatusChangeHandler
可以作为内联闭包提供,但在下面的例子中,为了清晰起见,它被提取为一个单独的函数。它在每次调用状态改变时被调用状态
.的错误
是可选的,是零
对象的错误对象时断开连接
而且失败的
的状态。
斯威夫特
private func onCallStatusChange(状态:CallStatus,错误:TalkCallError?) {
开关状态{
案例.connecting:
//通话中
案例.connected:
//通话已接通
案例.disconnected:
//由于终端用户、座席或错误条件,呼叫已断开
//可能是由于一个'错误',检查如果不是nil
案例fail:
//呼叫连接失败
//可能是由于一个'错误',检查如果不是nil
案例.reconnecting:
//呼叫开始重新连接
案例.reconnected:
//呼叫已重新连接
}
}
objective - c
-(无效)__onCallStatusChange:(CallStatus)状态错误:(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=自我.talkCall.audioOutput= =AudioOutputHeadset;
//切换当前音频输出到其他值
自我.talkCall.audioOutput=isAudioOutputHeadset?AudioOutputSpeaker:AudioOutputHeadset;
更改呼叫的音频路由
您可以查看和更改正在通话中当前选择的音频路由选项。默认情况下,音频路由设置为内置选项。根据设备类型,可能有不同的内置选项可用。如果可用,可以选择外部蓝牙连接设备进行系统级的音频路由(这通常在连接时发生)。属性的getter和setteraudioRouting
的属性TalkCall
实例检查和更改当前呼叫的音频路由设置。
的AudioRoutingOption
对象具有以下属性:
AudioRoutingOption性能 | 描述 |
---|---|
的名字 | 路由选项的本地化名称 |
类型 | 的音频路由选项的类型AudioRoutingType 类型 |
的AudioRoutingType
枚举有以下值:
AudioRoutingType值 | 描述 |
---|---|
内装式 | 用于使用内置扬声器和麦克风的路由选项 |
类型 | 用于使用蓝牙连接的路由选项 |
要访问当前可用的音频路由选项的列表,请使用availableAudioRoutingOptions
的属性TalkCall
实例。
注意:作为处理音频输入/输出路由的替代方法,您可以使用AVRoutePickerView
从AVKit
框架。看到AVRoutePickerView在苹果文档中。
断开通话
要断开呼叫,请使用断开()
函数。调用它之后,TalkCall
实例可以被释放和释放。
斯威夫特
talkCall.disconnect ()
objective - c
[自我.talkCall断开];