Twilio 语音插件
在您的 Capacitor app 中使用 Twilio Voice SDK 制作并接收电话,在 iOS 上使用 CallKit ,并在 Android 上使用本地呼叫通知.
🤖 建筑与AI编码代理? 安装 Capgo 技能 所以克劳德代码,代码,光标,副驾驶,或双子座CLI知道如何安装和使用
@capgo/capacitor-twilio-voice在您的电容应用程序中:npx skills add Cap-go/capgo-skills。然后问你的经纪人: 加上@capgo/capor-twilio-voice到我的Capacitor应用上 代理设置指南 • 妇女 主机磁共振
主要特点
- 电话数字 :
makeCall(), (中文(简体) ),acceptCall(), (中文(简体) ),rejectCall()财务报告和审定财务报表endCall()。 。 。 . - 待命控制数字 :
muteCall(), (中文(简体) ),setSpeaker()财务报告和审定财务报表getCallStatus()。 。 。 . - 来电:由PushKit和CallKit在iOS和Firebase Messaging在Android上的推取调用邀请.
- 活动:邀请,鸣叫,接通,断开,再接并拨打质量警告.
- 会议数字 :
login()带有Twilio访问符,isLoggedIn()财务报告和审定财务报表logout()。 。 。 . - 平台: iOS和Android. 互联网档案馆的存檔,存档日期2013-12-21. 在网上不可用.
login(), (中文(简体) ),isLoggedIn()财务报告和审定财务报表getCallStatus()丢入网络.
文档
这里有最完整的医生: https://capgo.app/docs/plugins/twilio-voice/ (中文(简体) )
兼容性
| 插件版本 | 电容兼容性 | 维护 |
|---|---|---|
| 联合国 | 联合国 | ✅ |
| 页:1 | 页:1 | 应要求 |
| 页:1 | 页:1 | ❌ |
| 页:1 | 页:1 | ❌ |
说明: 此插件的主要版本沿用了Capacitor的主要版本. 使用匹配您的 Capacitor 安装的版本( 如 Capacitor 8 的插件 v8) 。 只有最新的主要版本得到积极维护.
安装
您可以使用我们的 AI 辅助设置安装插件 。 使用以下命令将 Capgo 技能添加到您的 AI 工具 :
npx skills add https://github.com/cap-go/capacitor-skills --skill capacitor-plugins
然后使用下列提示:
Use the `capacitor-plugins` skill from `cap-go/capacitor-skills` to install the `@capgo/capacitor-twilio-voice` plugin in my project.
如果您更喜欢手动设置,请通过运行以下命令来安装插件,并遵循下面的平台特定指令:
npm install @capgo/capacitor-twilio-voice
npx cap sync
iOS 设置
1. 安装插件
npm install @capgo/capacitor-twilio-voice
npx cap sync
2. 设置 CustomCapacitorViewController.swift
从 example-app/ios/App/App/CustomCapacitorViewController.swift 给您的 ios/App/App/CustomCapacitorViewController.swift 文档.
- 修改
AppDelegate.swift
添加以下内容到 AppDelegate.swift数字 :
import UIKit
import Capacitor
+ import PushKit
+ import CapgoCapacitorTwilioVoice
@UIApplicationMain
- class AppDelegate: UIResponder, UIApplicationDelegate {
+ class AppDelegate: UIResponder, UIApplicationDelegate, PKPushRegistryDelegate {
var window: UIWindow?
+ var pushKitEventDelegate: PushKitEventDelegate?
+ var voipRegistry = PKPushRegistry.init(queue: DispatchQueue.main)
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
+
+ /*
+ * Your app must initialize PKPushRegistry with PushKit push type VoIP at the launch time. As mentioned in the
+ * [PushKit guidelines](https://developer.apple.com/documentation/pushkit/supporting_pushkit_notifications_in_your_app),
+ * the system can't deliver push notifications to your app until you create a PKPushRegistry object for
+ * VoIP push type and set the delegate. If your app delays the initialization of PKPushRegistry, your app may receive outdated
+ * PushKit push notifications, and if your app decides not to report the received outdated push notifications to CallKit, iOS may
+ * terminate your app.
+ */
+ initializePushKit()
+
+ guard let viewController = UIApplication.shared.windows.first?.rootViewController as? CustomCapacitorViewController else {
+ fatalError("Root view controller is not Capacitor view controller")
+ }
+
+ viewController.passPushKitEventDelegate = { delegate in
+ self.pushKitEventDelegate = delegate
+ }
+
+ // self.pushKitEventDelegate = viewController
+
return true
}
+
+ func initializePushKit() {
+ voipRegistry.delegate = self
+ voipRegistry.desiredPushTypes = Set([PKPushType.voIP])
+ }
// ... (existing lifecycle methods remain the same) ...
+ // MARK: PKPushRegistryDelegate
+ func pushRegistry(_ registry: PKPushRegistry, didUpdate credentials: PKPushCredentials, for type: PKPushType) {
+ NSLog("pushRegistry:didUpdatePushCredentials:forType:")
+
+ if let delegate = self.pushKitEventDelegate {
+ delegate.credentialsUpdated(credentials: credentials)
+ }
+ }
+
+ func pushRegistry(_ registry: PKPushRegistry, didInvalidatePushTokenFor type: PKPushType) {
+ NSLog("pushRegistry:didInvalidatePushTokenForType:")
+
+ if let delegate = self.pushKitEventDelegate {
+ delegate.credentialsInvalidated()
+ }
+ }
+
+ /**
+ * Try using the `pushRegistry:didReceiveIncomingPushWithPayload:forType:withCompletionHandler:` method if
+ * your application is targeting iOS 11. According to the docs, this delegate method is deprecated by Apple.
+ */
+ func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType) {
+ NSLog("pushRegistry:didReceiveIncomingPushWithPayload:forType:")
+
+ if let delegate = self.pushKitEventDelegate {
+ delegate.incomingPushReceived(payload: payload)
+ }
+ }
+
+ /**
+ * This delegate method is available on iOS 11 and above. Call the completion handler once the
+ * notification payload is passed to the `TwilioVoiceSDK.handleNotification()` method.
+ */
+ func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType, completion: @escaping () -> Void) {
+ NSLog("pushRegistry:didReceiveIncomingPushWithPayload:forType:completion:")
+
+ if let delegate = self.pushKitEventDelegate {
+ delegate.incomingPushReceived(payload: payload, completion: completion)
+ }
+
+ if let version = Float(UIDevice.current.systemVersion), version >= 13.0 {
+ /**
+ * The Voice SDK processes the call notification and returns the call invite synchronously. Report the incoming call to
+ * CallKit and fulfill the completion before exiting this callback method.
+ */
+ completion()
+ }
+ }
}
3. 编辑 Main.storyboard
将视图控制器更改为 CustomCapacitorViewController 内 Main.storyboard。 。 。 .
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14111" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/>
</dependencies>
<scenes>
<!--Bridge View Controller-->
<scene sceneID="the-QT-ifu">
<objects>
- <viewController id="BYZ-38-t0r" customClass="CAPBridgeViewController" customModule="Capacitor" sceneMemberID="viewController"/>
+ <viewController id="BYZ-38-t0r" customClass="CustomCapacitorViewController" customModule="App" customModuleProvider="target" sceneMemberID="viewController"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
</scene>
</scenes>
</document>
在示例应用程序中查看更多细节.
4. 设置 Info.plist
添加以下内容到 ios/App/App/Info.plist数字 :
<key>NSMicrophoneUsageDescription</key>
<string>This app uses the microphone for voice calls</string>
<key>UIBackgroundModes</key>
<array>
<string>voip</string>
<string>audio</string>
</array>
- 请确保您在 Xcode 中具备以下功能 :
- 推动通知
- 背景模式
- 生成 Push 通知的证书
要生成 Push 通知的证书, 您需要遵循这些步骤 :
- 为您的应用程序创建签名证书 .
openssl genrsa -out ALDsigning.key 2048
- 生成签名请求 .
openssl req -new -key ALDsigning.key -out csr3072ALDSigning.certSigningRequest -subj "/[email protected], CN=Example Name, C=IE"
请上传到您的苹果开发者账户 这里搜索 Create a new VoIP Services Certificate
-
下载由苹果提供的文件.
-
从已下载的文件中提取 .p12 文件 .
openssl pkcs12 -export -out voip_services.p12 -inkey ALDsigning.key -in voip_services.cer
- 导出
cert.pem财务报告和审定财务报表key.pem来自.p12文件的文件.
openssl pkcs12 -in voip_services.p12 -nokeys -out cert.pem -nodes
openssl pkcs12 -in voip_services.p12 -nocerts -out key.pem -nodes
- 上传
cert.pem财务报告和审定财务报表key.pem文件为twilio.
npx twilio api:chat:v2:credentials:create --type=apn --sandbox --friendly-name="voice-push-credential (sandbox)" --certificate="$(cat /Users/your_username/Documents/twilio-voip/cert.pem)" --private-key="$(cat /Users/your_username/Documents/twilio-voip/key.pem)"
Android 设置
1. 消防基地设置
将 Firebase 添加到您的 Android 项目中 :
-
添加
google-services.json改为android/app/ -
添加
CapacitorApplication.java改为android/app/src/main/java/YOUR_APP_PACKAGE/CapacitorApplication.java复制内容example-app/android/app/src/main/java/com/example/plugin/CapacitorApplication.java给您的android/app/src/main/java/YOUR_APP_PACKAGE/CapacitorApplication.java文档. -
导入
androidx.webkit:webkit内build.gradle(单元:app)
dependencies {
+ implementation 'androidx.webkit:$androidxWebkitVersion'
}
- 修改
MainActivity.java
添加以下内容到 MainActivity.java数字 :
package com.example.plugin;
import android.net.Uri;
import android.os.Bundle;
import android.webkit.ValueCallback;
import androidx.webkit.WebViewCompat;
import androidx.webkit.WebViewFeature;
import com.getcapacitor.BridgeActivity;
import com.getcapacitor.JSExport;
import com.getcapacitor.Logger;
import com.getcapacitor.PluginHandle;
+ import java.util.ArrayList;
+ import java.util.Collections;
import ee.forgr.capacitor_twilio_voice.CapacitorTwilioVoicePlugin;
public class MainActivity extends BridgeActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+
+ this.bridge.registerPluginInstance(CapacitorTwilioVoicePlugin.getInstance());
+ ArrayList<PluginHandle> pluginHandles = new ArrayList<>();
+ pluginHandles.add(this.bridge.getPlugin("CapacitorTwilioVoice"));
+ String pluginJS = JSExport.getPluginJS(pluginHandles);
+ if (WebViewFeature.isFeatureSupported(WebViewFeature.DOCUMENT_START_SCRIPT)) {
+ String allowedOrigin = Uri.parse(this.bridge.getAppUrl()).buildUpon().path(null).fragment(null).clearQuery().build().toString();
+ try {
+ WebViewCompat.addDocumentStartJavaScript(this.getBridge().getWebView(), pluginJS, Collections.singleton(allowedOrigin));
+ } catch (IllegalArgumentException ex) {
+ Logger.warn("Invalid url, using fallback");
+ }
+ }
}
}
- 在 JS 中注册插件
+ import { CapacitorTwilioVoice } from '@capgo/capacitor-twilio-voice';
+ import { Capacitor } from '@capacitor/core';
+ Capacitor.registerPlugin('CapacitorTwilioVoice');
-
添加
android:name="CapacitorApplication"页:1application标记在android/app/src/main/AndroidManifest.xml -
添加以下内容到
android/app/src/main/AndroidManifest.xml数字 :
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.TURN_SCREEN_ON" />
<uses-permission android:name="android.permission.SHOW_WHEN_LOCKED" />
记住,这样可以让应用程序在屏幕被锁定时被访问.
Twilio 设置
呼叫者名称显示器( CapactorTwilioCaller)Name
默认情况下,来电会显示来电者的电话号码或客户端ID. 您可以通过通过一个 CapacitorTwilioCallerName 参数从您的 TwiML 后端显示友好名称 .
后端设置
当生成您的 TwiML 响应时 <Client> 拨号,加号 CapacitorTwilioCallerName 参数 :
// Java example (see exemple-backend for full implementation)
Parameter callerNameParam = new Parameter.Builder()
.name("CapacitorTwilioCallerName")
.value("John Doe")
.build();
Client client = new Client.Builder(identity)
.parameter(callerNameParam)
.build();
Dial dial = new Dial.Builder()
.client(client)
.build();
// Node.js example
const VoiceResponse = require('twilio').twiml.VoiceResponse;
const response = new VoiceResponse();
const dial = response.dial();
dial.client({
name: 'CapacitorTwilioCallerName',
value: 'John Doe'
}, identity);
如何运作
- 当您的后端收到来电时, 它会生成 TwiML 以引导呼叫
- 包含
CapacitorTwilioCallerName带有调用者显示名的参数 - 插件会自动提取此参数,并将其用于:
- iOS CallKit 接通的呼叫屏幕
- Android 收到呼叫通知
- 这个
from输入callInviteReceived事件 - 这个
pendingInvites阵列getCallStatus()
若为 CapacitorTwilioCallerName 不提供,插件会倒回呼叫者的电话号码或客户端ID.
使用量
认证
login(options: { accessToken: string })
使用 JWT 访问令牌认证 Twilio :
- 自动验证符号过期
- 为应用程序重新启动安全存储令牌
- VoIP 推进通知的注册
- 说明: 插件将拒绝过期的符号
logout()
记录当前用户并清理全部会话数据 :
- VoIP 驱动通知的未注册者
- 清除存储的访问令牌
- 结束任何活动呼叫
- 恢复所有调用状态
isLoggedIn()
检查用户是否正在登录一个有效的( 未过期) 符号 .
回返情况: { isLoggedIn: boolean, hasValidToken: boolean, identity?: string }
这个 identity 字段包含如果登录的话从 JWT 符号中提取的用户身份.
makeCall(options: { to: string })
启动向外呼叫。 需要通过 login()。 。 。 .
acceptCall(options: { callSid: string })
接受接通电话.
rejectCall(options: { callSid: string })
拒绝来电.
endCall(options?: { callSid?: string })
结束活动呼叫或特定呼叫.
muteCall(options: { muted: boolean, callSid?: string })
哑或解出麦克风.
setSpeaker(options: { enabled: boolean })
启用或禁用扬声器 。 在Android上,使用Twilio AudioSwitch来管理耳机,扬声器和连接设备(头套,蓝牙等)之间的音频路由.
getCallStatus()
获得当前呼叫状态.
checkMicrophonePermission()
检查是否获得麦克风许可 .
requestMicrophonePermission()
请求用户的麦克风许可.
活动听众
import { CapacitorTwilioVoice } from '@capgo/capacitor-twilio-voice';
// Registration events
CapacitorTwilioVoice.addListener('registrationSuccess', (data) => {
console.log('Successfully registered:', data);
});
CapacitorTwilioVoice.addListener('registrationFailure', (data) => {
console.error('Registration failed:', data);
});
// Call events
CapacitorTwilioVoice.addListener('callInviteReceived', (data) => {
console.log('Incoming call from:', data.from);
});
CapacitorTwilioVoice.addListener('callConnected', (data) => {
console.log('Call connected:', data);
});
CapacitorTwilioVoice.addListener('callDisconnected', (data) => {
console.log('Call ended:', data);
});
CapacitorTwilioVoice.addListener('callRinging', (data) => {
console.log('Call is ringing:', data);
});
CapacitorTwilioVoice.addListener('callReconnecting', (data) => {
console.log('Call reconnecting:', data);
});
CapacitorTwilioVoice.addListener('callReconnected', (data) => {
console.log('Call reconnected:', data);
});
CapacitorTwilioVoice.addListener('callQualityWarningsChanged', (data) => {
console.log('Quality warnings:', data);
});
JWT 托肯管理公司
调试格式
插件预计 Twilio 以 JWT 格式使用此结构访问符 :
{
"iss": "your-account-sid",
"exp": 1234567890,
"grants": {
"voice": {
"outgoing": {
"application_sid": "your-app-sid"
},
"push_credential_sid": "your-push-credential-sid"
},
"identity": "user-identity"
}
}
托肯验证
- 键自动验证为过期
- 无效或过期的符号将被拒绝
- 使用
isLoggedIn()以检查符号状态
后端集成
从您的后端服务器获取访问令牌 :
async function fetchAccessToken(identity: string): Promise<string> {
const response = await fetch(`/accessToken?identity=${identity}`);
return response.text();
}
测试要求
iOS 模拟器限制
- VoIP 推动通知在 iOS 模拟器中无效
- 使用物理 iOS 设备来测试来电
- 模拟器和装置中的调用
Android 模拟器
- 需要谷歌游戏服务
- Firebase 消息在Android模拟器中与 Google API 工作
处理错误
插件提供了详细的错误信息 :
try {
await CapacitorTwilioVoice.makeCall({ to: '+1234567890' });
} catch (error) {
console.error('Call failed:', error);
}
常见错误情况 :
- 无效的符号: 检查令牌格式并过期
- 没有麦克风许可: 调用
requestMicrophonePermission() - 网络问题: 验证互联网连接
- 无效的电话号码: 使用E.164格式(+1234567890)
安全说明
- 访问令牌存储在安全设备存储中
- 键在使用前自动验证
- 生产大楼没有敏感数据记录
- 总是使用 HTTPS 从后端获取符号
平台支持
| 平台 | 支助 | 页:1 |
|---|---|---|
| iOS系统 | ✅ | 需要iOS 13.0+ (英语) |
| 机器人 | ✅ | 需要 API 级别 23+ |
| 网页 | ❌ | 不予支持 |
API 密码
login(...)logout()isLoggedIn()makeCall(...)acceptCall(...)rejectCall(...)endCall(...)muteCall(...)setSpeaker(...)getCallStatus()checkMicrophonePermission()requestMicrophonePermission()addListener('callInviteReceived', ...)addListener('callConnected', ...)addListener('callInviteCancelled', ...)addListener('outgoingCallInitiated', ...)addListener('outgoingCallFailed', ...)addListener('callDisconnected', ...)addListener('callRinging', ...)addListener('callReconnecting', ...)addListener('callReconnected', ...)addListener('callQualityWarningsChanged', ...)addListener('registrationSuccess', ...)addListener('registrationFailure', ...)removeAllListeners()getPluginVersion()- 接口
- 类型异名
登录(...)
login(options: { accessToken: string; }) => Promise<{ success: boolean; }>
使用访问令牌认证Twilio Voice的用户.
访问令牌应在您的后端服务器上使用您的 Twilio 证书生成 . 必须通过Twilio Voice发出和接收电话.
| 参数 | 类型 | 说明 |
|---|---|---|
options | { accessToken: string; } | - 配置对象 |
回返情况: Promise<{ success: boolean; }>
登录( c)
logout() => Promise<{ success: boolean; }>
从 Twilio Voice 中记录当前用户和未注册者 .
这将断开任何正在运行的电话并阻止设备接收 新的呼叫通知.
回返情况: Promise<{ success: boolean; }>
isLoggedIn () (中文(简体) )
isLoggedIn() => Promise<{ isLoggedIn: boolean; hasValidToken: boolean; identity?: string; }>
检查用户是否正在登录, 是否有有效的访问符 .
回返情况: Promise<{ isLoggedIn: boolean; hasValidToken: boolean; identity?: string; }>
调用(...)
makeCall(options: { to: string; displayName?: string; callerId?: string; }) => Promise<{ success: boolean; callSid?: string; }>
启动发送到电话号码或客户端的电话.
用户在打电话前必须登录。 电话会被接通 通过你的Twilio后端配置.
| 参数 | 类型 | 说明 |
|---|---|---|
options | { to: string; displayName?: string; callerId?: string; } | - 配置对象 |
回返情况: Promise<{ success: boolean; callSid?: string; }>
接受呼叫(...)
acceptCall(options: { callSid: string; }) => Promise<{ success: boolean; }>
接通电话.
应响应“邀请接收”事件.
| 参数 | 类型 | 说明 |
|---|---|---|
options | { callSid: string; } | - 配置对象 |
回返情况: Promise<{ success: boolean; }>
拒绝呼叫(...)
rejectCall(options: { callSid: string; }) => Promise<{ success: boolean; }>
拒绝接听电话.
应响应“邀请接收”事件. 打电话者会听到忙碌的信号,或者被引导到语音邮件.
| 参数 | 类型 | 说明 |
|---|---|---|
options | { callSid: string; } | - 配置对象 |
回返情况: Promise<{ success: boolean; }>
端点呼叫(...)
endCall(options: { callSid?: string; }) => Promise<{ success: boolean; }>
结束一个主动呼叫.
如果不提供 callSid, 这将结束当前活动的调用 .
| 参数 | 类型 | 说明 |
|---|---|---|
options | { callSid?: string; } | - 配置对象 |
回返情况: Promise<{ success: boolean; }>
哑声(...)
muteCall(options: { muted: boolean; callSid?: string; }) => Promise<{ success: boolean; }>
在主动通话时发出静音或解密麦克风.
哑声后,对方不会听到你的麦克风的声音.
| 参数 | 类型 | 说明 |
|---|---|---|
options | { muted: boolean; callSid?: string; } | - 配置对象 |
回返情况: Promise<{ success: boolean; }>
设置语法(...)
setSpeaker(options: { enabled: boolean; }) => Promise<{ success: boolean; }>
启用或禁用扬声器模式 .
启用后, 音频会通过设备的扬声器而不是耳机进行路由 .
| 参数 | 类型 | 说明 |
|---|---|---|
options | { enabled: boolean; } | - 配置对象 |
回返情况: Promise<{ success: boolean; }>
获取呼叫状态( C)
getCallStatus() => Promise<{ hasActiveCall: boolean; isOnHold: boolean; isMuted: boolean; callSid?: string; callState?: string; pendingInvites: CallInvite[]; activeCallsCount: number; }>
获取活动呼叫的当前状态 .
这可以提供实时信息 关于呼叫状态,哑声状态, 持有状态,并呼叫识别器.
回返情况: Promise<{ hasActiveCall: boolean; isOnHold: boolean; isMuted: boolean; callSid?: string; callState?: string; pendingInvites: CallInvite[]; activeCallsCount: number; }>
麦克风
checkMicrophonePermission() => Promise<{ granted: boolean; }>
检查是否获得麦克风许可 .
此不请求权限, 只检查当前权限状态 .
回返情况: Promise<{ granted: boolean; }>
麦克风
requestMicrophonePermission() => Promise<{ granted: boolean; }>
请求用户的麦克风许可 .
在iOS和Android上,如果允许,这将显示系统权限对话框 尚未获准。 如果先前被拒绝,用户可能需要 在系统设置中授予它.
回返情况: Promise<{ granted: boolean; }>
添加倾听器( “ call Invite received ” ,...)
addListener(eventName: 'callInviteReceived', listenerFunc: (data: CallInvite) => void) => Promise<PluginListenerHandle>
收听来电通知.
当另一个用户或电话号码打给你时,此事件会被开除. 您应该拨打接受呼叫或拒绝呼叫.
| 参数 | 类型 | 说明 |
|---|---|---|
eventName | 'callInviteReceived' | - 活动名称(“请收信”) |
listenerFunc | (data: CallInvite) => void | - 处理事件的召回功能 |
回返情况: Promise<PluginListenerHandle>
添加倾听器( “ callConnected ” ,...)
addListener(eventName: 'callConnected', listenerFunc: (data: { callSid: string; }) => void) => Promise<PluginListenerHandle>
听电话连接的事件.
此事件在呼叫( 来或出) 成功时启动 连接和音频可以被听到.
| 参数 | 类型 | 说明 |
|---|---|---|
eventName | 'callConnected' | - 活动名称 (“ callConnected ” ) |
listenerFunc | (data: { callSid: string; }) => void | - 处理事件的召回功能 |
回返情况: Promise<PluginListenerHandle>
添加倾听器( 调用 Invite 已取消 )..
addListener(eventName: 'callInviteCancelled', listenerFunc: (data: { callSid: string; reason: 'user_declined' | 'remote_cancelled'; }) => void) => Promise<PluginListenerHandle>
听电话邀请取消活动.
当接收到的电话邀请被取消时,此事件即告解除 回答,要么是打电话者挂断,要么是用户拒绝.
| 参数 | 类型 | 说明 |
|---|---|---|
eventName | 'callInviteCancelled' | - 活动名称( 叫做“ Invite Cancelled ” ) |
listenerFunc | (data: { callSid: string; reason: 'user_declined' | 'remote_cancelled'; }) => void | - 处理事件的召回功能 |
回返情况: Promise<PluginListenerHandle>
添加收听器( 已启动)
addListener(eventName: 'outgoingCallInitiated', listenerFunc: (data: { callSid: string; to: string; source: 'app' | 'system'; displayName?: string; }) => void) => Promise<PluginListenerHandle>
听听即将开始的电话活动.
此事件在程序启动时启动 或来自系统(如iOS上的CallKit,Android上的Telecom).
| 参数 | 类型 | 说明 |
|---|---|---|
eventName | 'outgoingCallInitiated' | - 活动名称('退出CallInitated') |
listenerFunc | (data: { callSid: string; to: string; source: 'app' | 'system'; displayName?: string; }) => void | - 处理事件的召回功能 |
回返情况: Promise<PluginListenerHandle>
添加收听器( '退出CallFlied', ...)
addListener(eventName: 'outgoingCallFailed', listenerFunc: (data: { callSid: string; to: string; reason: 'missing_access_token' | 'connection_failed' | 'no_call_details' | 'microphone_permission_denied' | 'invalid_contact' | 'callkit_request_failed' | 'unsupported_intent'; displayName?: string; }) => void) => Promise<PluginListenerHandle>
正在发送的呼叫失败事件.
此事件因各种原因无法连接而启动 例如缺少证书、许可问题或网络问题.
| 参数 | 类型 | 说明 |
|---|---|---|
eventName | 'outgoingCallFailed' | - 活动名称( '退出Call Fault' ) |
listenerFunc | (data: { callSid: string; to: string; reason: 'missing_access_token' | 'connection_failed' | 'no_call_details' | 'microphone_permission_denied' | 'invalid_contact' | 'callkit_request_failed' | 'unsupported_intent'; displayName?: string; }) => void | - 处理事件的召回功能 |
回返情况: Promise<PluginListenerHandle>
添加倾听器( “ 调用断开连接 ” ,...)
addListener(eventName: 'callDisconnected', listenerFunc: (data: { callSid: string; error?: string; }) => void) => Promise<PluginListenerHandle>
听电话断开事件.
正常情况下或由于出错,此事件在呼叫结束时被解除.
| 参数 | 类型 | 说明 |
|---|---|---|
eventName | 'callDisconnected' | - 事件名称( “ call Disconnect ” ) |
listenerFunc | (data: { callSid: string; error?: string; }) => void | - 处理事件的召回功能 |
回返情况: Promise<PluginListenerHandle>
添加倾听器( “ calling ” ,...)
addListener(eventName: 'callRinging', listenerFunc: (data: { callSid: string; }) => void) => Promise<PluginListenerHandle>
听电话响起事件.
当另一端的电话响起时,此事件即被发射.
| 参数 | 类型 | 说明 |
|---|---|---|
eventName | 'callRinging' | - 活动名称("叫Ring") |
listenerFunc | (data: { callSid: string; }) => void | - 处理事件的召回功能 |
回返情况: Promise<PluginListenerHandle>
添加倾听器( “ 调用重联 ” ,...)
addListener(eventName: 'callReconnecting', listenerFunc: (data: { callSid: string; error?: string; }) => void) => Promise<PluginListenerHandle>
听电话重联事件.
当一个电话失去连接而Twilio试图 重新连接。 电话尚未中断, 但音频可能会被中断 .
| 参数 | 类型 | 说明 |
|---|---|---|
eventName | 'callReconnecting' | - 事件名称 (“ reconnection” ) |
listenerFunc | (data: { callSid: string; error?: string; }) => void | - 处理事件的召回功能 |
回返情况: Promise<PluginListenerHandle>
添加倾听器( “ reconnected ” ,...)
addListener(eventName: 'callReconnected', listenerFunc: (data: { callSid: string; }) => void) => Promise<PluginListenerHandle>
听电话重联事件.
当一个呼叫在连接丢失后成功重新连接时,此事件会被启动 . 在此事件之后, 音频应正常恢复 .
| 参数 | 类型 | 说明 |
|---|---|---|
eventName | 'callReconnected' | - 事件名称 (“ reconnected ” ) |
listenerFunc | (data: { callSid: string; }) => void | - 处理事件的召回功能 |
回返情况: Promise<PluginListenerHandle>
添加倾听器( 调用“ 质量警告” 更改 ,...)
addListener(eventName: 'callQualityWarningsChanged', listenerFunc: (data: { callSid: string; currentWarnings: string[]; previousWarnings: string[]; }) => void) => Promise<PluginListenerHandle>
听电话 质量警告事件.
当调用质量发生变化时, 此事件会开火, 并给出警告 可能的问题,如高焦虑,包丢失,或低音频水平.
| 参数 | 类型 | 说明 |
|---|---|---|
eventName | 'callQualityWarningsChanged' | - 事件名称(称为“ 质量警告” ) |
listenerFunc | (data: { callSid: string; currentWarnings: string[]; previousWarnings: string[]; }) => void | - 处理事件的召回功能 |
回返情况: Promise<PluginListenerHandle>
添加倾听器( “ 注册成功 ” ,...)
addListener(eventName: 'registrationSuccess', listenerFunc: () => void) => Promise<PluginListenerHandle>
倾听成功注册活动.
当设备与 Twilio Voice 成功注册时, 此事件会被发射 准备打电话接听 这通常发生在成功之后 以有效的访问符登录.
| 参数 | 类型 | 说明 |
|---|---|---|
eventName | 'registrationSuccess' | - 事件名称(“注册成功”) |
listenerFunc | () => void | - 处理事件的召回功能 |
回返情况: Promise<PluginListenerHandle>
添加倾听器( “ 注册失败 ” ,...)
addListener(eventName: 'registrationFailure', listenerFunc: (data: { error: string; }) => void) => Promise<PluginListenerHandle>
登记失败事件.
当设备无法与Twilio Voice注册时, 通常由于无效或过期的访问符、网络问题,或 Twilio的服务问题.
| 参数 | 类型 | 说明 |
|---|---|---|
eventName | 'registrationFailure' | - 事件名称(“注册失败”) |
listenerFunc | (data: { error: string; }) => void | - 处理事件的召回功能 |
回返情况: Promise<PluginListenerHandle>
删除所有收听器( )
removeAllListeners() => Promise<void>
删除所有已注册事件听众 .
当组件卸载时或当您想要清理时,此功能可用于清理 重置全部事件处理 .
获取 PluginVersion ()
getPluginVersion() => Promise<{ version: string; }>
获取本地 Capacitor 插件版本
回返情况: Promise<{ version: string; }>
接口
调用邀请
代表即将收到的电话邀请.
此接口描述已收到的呼叫邀请的数据结构
但尚未接受或拒绝。 同一结构用于
callInviteReceived 事件和情况 pendingInvites 数组返回 getCallStatus()。 。 。 .
| Prop | 类型 | 说明 |
|---|---|---|
callSid | string | 收到的呼叫邀请的独特标识符 |
from | string | 呼叫者的电话号码或客户身份标识(可能包括自定义的呼叫者名称) |
to | string | 电话号码或客户身份 |
customParams | Record<string, string> | 自定义参数随呼叫邀请相传 |
插件听筒
| Prop | 类型 |
|---|---|
remove | () => Promise<void> |
类型异名
记录
构造 T 类型 K 的一组属性类型
{
[P in K]: T;
}