The Twilio Programmable Voice SDKs allow you to add voice-over-IP (VoIP) calling to your native iOS applications.
To make sure your app is ready for iOS 14, visit this page.
Apps using SDK versions 2.0.x, 3.x, and 4.x may fail to register for incoming calls when running on iOS 13. We recommend that you upgrade to SDK 5.0 or above. Refer to this advisory and this GitHub issue for more information. Check out our migration guides when planning your move to our latest SDK.
The Twilio Programmable Voice SDKs use Semantic Versioning. Twilio supports version N-1 for 12 months after the first GA release of version N. We recommend you upgrade to the latest version as soon as possible to avoid any breaking changes. Version 6.x is the latest iOS version.
Support for 4.x ceased on September 19, 2020. Please upgrade to the latest version
Support for 3.x ceased on June 28, 2020. Please upgrade to the latest version
Support for 2.x ceased on January 1, 2020. Please upgrade to the latest version
End-of-Life for 1.x will occur on March 23, 2021. A two-hour maintenance period is planned for 1.x at 9am Pacific Time on January 26, 2021. Please upgrade to the latest version. See this EoL notice for further details.
December 3, 2024
Bug Fixes
callSid
is missing from the dictionary returned by [TVOPreflightTest dictionaryReport]
.TVOPreflightCallQuality
enum Swift name alias typo.Size Impact
Architecture | Compressed Size | Uncompressed Size |
---|---|---|
arm64 | 3.4 MB | 7.8 MB |
October 21, 2024
API Changes
[TwilioVoiceSDK runPreflightTestWithAccessToken:delegate:]
and [TwilioVoiceSDK runPreflightTestWithOptions:delegate:]
to run a preflight test are added.TVOPreflightOptions
is added. Use [TVOPreflightOptions optionsWithAccessToken:]
or the builder
method [TVOPreflightOptions optionsWithAccessToken:block:]
to create the options object as an argument when
calling the [TwilioVoiceSDK runPreflightTestWithOptions:delegate:]
method.TVOPreflightTest
is added. This object cannot be initialized directly. Instead a TVOPreflightTest
object is returned when calling the [TwilioVoiceSDK runPreflightTestWithAccessToken:delegate:]
and [TwilioVoiceSDK runPreflightTestWithOptions:delegate:]
methods. Please note that the stop()
method can be used to disconnect the preflight test but will result in the
[TVOPreflightDelegate preflight:didFailWithError:]
callback with the TVOPreflightTestStatusFailed
state of the
preflight test.TVOPreflightDelegate
is added. Status updates of the preflight test will be raised via the
delegate methods in this class.TVOPreflightReport
is added. A comprehensive report object will be returned in the [TVOPreflightDelegate preflight:didCompleteWitReport:]
callback. The report can also be retrived using the TVOPreflightTest.preflightReport
property when the preflight test
has completed.An example of making a preflight test
1class ViewController: UIViewController {2var preflightTest: PreflightTest? = nil34func performPreflight() {5let preflightOptions = PreflightOptions(accessToken: accessToken, block: { builder in6builder.preferredAudioCodecs = [OpusCodec()]7})89preflightTest = TwilioVoiceSDK.runPreflightTest(options: preflightOptions, delegate: self)10}11}1213extension ViewController: PreflightDelegate {14func preflightDidComplete(preflightTest: PreflightTest, report: PreflightReport) {15// Check the result in the report16}1718func preflightDidFail(preflightTest: PreflightTest, error: any Error) {19// Check the failure reason in the error20}2122func preflightDidConnect(preflightTest: PreflightTest) {23// preflight test has connected24}25}
Bug Fixes
Size Impact
Architecture | Compressed Size | Uncompressed Size |
---|---|---|
arm64 | 3.4 MB | 7.8 MB |
September 10, 2024
Enhancements
Known Issues
TVOCallMessageBuilder.contentType
has no effect on the content type of the TVOCallMessage
object. The content type always defaults to application/json
.Size Impact
Architecture | Compressed Size | Uncompressed Size |
---|---|---|
arm64 | 3.3 MB | 7.6 MB |
August 26, 2024
Enhancements
TVOErrorCallMessageCallInUnexpectedStateError
will be raised when [TVOCall sendMessage:]
is invoked when the Call has not reached the ringing state yet. error 31211API Changes
TVOErrorCallMessageEventPayloadSizeExceededError
has been changed to 31212. error 31212Bug Fixes
custom
as the logger type to Voice Insights.Known Issues
TVOCallMessageBuilder.contentType
has no effect on the content type of the TVOCallMessage
object. The content type always defaults to application/json
.Size Impact
Architecture | Compressed Size | Uncompressed Size |
---|---|---|
arm64 | 3.3 MB | 7.5 MB |
June 4, 2024
Enhancements
TVOErrorCallMessageCallInUnexpectedStateError
in TVOError
that happens [TVOCallInvite sendMessage:]
is invoked when the Call Invite has not reached the ringing state yet. [TVOCallMessageDelegate messageFailedForCallSid:voiceEventSid:error:]
callback will be invoked in this case with the above mentioned error code. error 31211Size Impact
Architecture | Compressed Size | Uncompressed Size |
---|---|---|
arm64 | 3.3 MB | 7.5 MB |
May 15, 2024
Enhancements
TVOErrorInvalidPhoneNumberError
in TVOError
that happens when a call is made to an invalid phone number.TVOErrorCallMessageTypeInvalidError
for invalid call message type when sendMessage
API is invoked with a TVOCallMessage
object where the messageType
is not set to user-defined-message
.API Changes
TVOCallMessage.messageType
and treats it as a pass-through for both inbound and outbound call messages. To send a user-defined message with the [TVOCall sendMessage:]
or the [TVOCallInvite sendMessage:]
method, set the messageType
to user-defined-message
.[TVOCallMessage messageWithContent:]
is deprecated in favor of the [TVOCallMessage messageWithContent:messageType:block:]
method.TVOCallQualityWarningConstantAudioOutputLevel
is added for TVOCallQualityWarning
enum. This warning is raised
when standard deviation
of audio output levels for the last 10 samples is less than or equals 1% of the maximum possible
audio output level of 32767
, i.e. 327.67
, and the call is not on hold
by the local party. This warning is cleared when
standard deviation
of audio output levels for the last 10 samples is greater than 3% of the maximum possible audio output level, i.e. 983.01
. Please note, if the remote party mutes the audio track or places the call on hold
, this warning will
still be raised.Size Impact
Architecture | Compressed Size | Uncompressed Size |
---|---|---|
arm64 | 3.3 MB | 7.5 MB |
April 17, 2024
Enhancements
Known Issues
AppTrackingTransparency
framework authorization alert. iOS 16 and earlier versions will not be affected by the Privacy Manifest that ships with the SDK XCFramework.Size Impact
Architecture | Compressed Size | Uncompressed Size |
---|---|---|
arm64 | 3.3 MB | 7.5 MB |
March 26, 2024
Bug Fixes
PrivacyInfo.xcprivacy
file was causing a warning during app store submission.Size Impact
Architecture | Compressed Size | Uncompressed Size |
---|---|---|
arm64 | 3.3 MB | 7.5 MB |
March 12, 2024
API Changes
New TVOAudioOptions
and TVOAudioOptionsBuilder
APIs that enable audio processing operations to be performed on the local audio track/source has been added. You can use the TVOAudioOptionsBuilder
class to create an instance of TVOAudioOptions
. Please note that software Echo Cancellation and Automatic Gain Control for the microphone is not supported in iOS as WebRTC relies on OS provided capabilities.
noiseSuppression
is set to false
, highpassFilter
is set
to true
, audioJitterBufferMaxPackets
is set to 50
packets, and
audioJitterBufferMinDelayMs
is set to 0
milliseconds.TVOAudioOptions
can be set as part of TVOConnectOptions
when making outbound calls and/or as part of TVOAcceptOptions
when receiving incoming calls.Please see the example below. In this example, high pass filtering is enabled, audioJitterBufferMaxPackets
is set to 200
packets and audioJitterBufferMinDelayMs
is set to 5
milliseconds.
12let audioOptions = AudioOptions() { builder in3builder.audioJitterBufferMaxPackets = 2004builder.audioJitterBufferMinDelayMs = 55builder.highpassFilter = true6}78let acceptOptions = TVOAcceptOptions(callInvite: callInvite) { builder in9builder.uuid = callInvite.uuid10builder.enableIceGatheringOnAnyAddressPorts = true11builder.audioOptions = audioOptions;12}1314let call = callInvite.accept(with: acceptOptions, delegate: self)
Size Impact
Architecture | Compressed Size | Uncompressed Size |
---|---|---|
arm64 | 3.3 MB | 7.5 MB |
February 12, 2024
Enhancements
TwilioVoiceSDK.insights
property is enabled.TVOErrorInvalidCallerIDError
that happens when a call is attempted with an invalid caller id error 13214.API Changes
TVOCallMessageDelegate
callback methods have been deprecated and will be removed in a future release in favor of the new callback methods. Please note that the new APIs work for both TVOCallInvite
and TVOCall
.See examples as follows:
12// MARK: - TVOCallMessageDelegate3func messageSent(callSid: String, voiceEventSid: String) {4NSLog("Call message sent. Voice Event SID: \(voiceEventSid)")5}67func messageFailed(callSid: String, voiceEventSid: String, error: Error) {8NSLog("Failed to send call message. Voice Event SID: \(voiceEventSid). Error: \(error.localizedDescription)")9}1011func messageReceived(callSid: String, message: CallMessage) {12NSLog("Call message received: \(callMessage.content)")13}
Size Impact
Architecture | Compressed Size | Uncompressed Size |
---|---|---|
arm64 | 3.3 MB | 7.5 MB |
November 30, 2023
Enhancements
Size Impact for 6.10.0
Architecture | Compressed Size | Uncompressed Size |
---|---|---|
arm64 | 3.2 MB | 7.4 MB |
November 9, 2023
Bug Fixes
TVOCall
object has been destroyed.Size Impact for 6.9.2
Architecture | Compressed Size | Uncompressed Size |
---|---|---|
arm64 | 3.3 MB | 7.5 MB |
October 02, 2023
API Changes
thread
property is added to the TVOLogParameters
class to specify thread name or thread id in the log.Bug Fixes
Size Impact for 6.9.1
Architecture | Compressed Size | Uncompressed Size |
---|---|---|
arm64 | 4.2 MB | 12.6 MB |
September 05, 2023
Enhancement
TVOLogger
is added. Users can implement this protocol to create their own custom logger.API Changes
TVODefaultLogger
class is added. Users can use it to send their app logs to standard output.logger
property of type TVOLogger
is added to TwilioVoiceSDK
. You can set this property to your custom logger instance. The SDK will return an
instance of DefaultLogger
by default. If you intend to use SDK's logger utility to log your app logs, you can use DefaultLogger
to do so.TVOLogParameters
class is added to pass log statement related parameters to the user defined logger implementation.TVOLogLevel
and TVOLogModule
enums have been moved to the new TVOLogParameters
header file.12class CustomLogger:NSObject {3//.. Your custom logger definition4}56extension CustomLogger:Logger {7func log(params logParameters: LogParameters!) {8print("\(logParameters.logModule) - \(logParameters.logLevel) - \(logParameters.message)");9}10}1112let logger = CustomLogger()13TwilioVoiceSDK.logger = logger14
Size Impact for 6.9.0
Architecture | Compressed Size | Uncompressed Size |
---|---|---|
arm64 | 4.2 MB | 12.6 MB |
June 23, 2023
API Changes
TVOAudioDeviceFormatChanged
method is now marked as deprecated and will be removed in v7.0. Use TVOAudioDeviceReinitialize
instead.Bug Fixes
CXProviderDelegate [provider:performEndCallAction:]
callback.Size Impact for 6.8.1
Architecture | Compressed Size | Uncompressed Size |
---|---|---|
arm64 | 4.1 MB | 12.5 MB |
June 13, 2023
Enhancements
Size Impact for 6.8.0
Architecture | Compressed Size | Uncompressed Size |
---|---|---|
arm64 | 4.1 MB | 12.5 MB |
May 17, 2023
API Updates
TVOCallInvite
before it
is answered or rejected. Sending user-defined messages while call is still ringing (before connected)
is also supported now.Example of sending and receiving call messages via the TVOCallInvite
:
1// Pass `CallMessageDelegate` in the `handleNotification()` method2TwilioVoiceSDK.handleNotification(payload.dictionaryPayload, delegate: self, delegateQueue: nil, callMessageDelegate: self)34// MARK: - NotificaitonDelegate5func callInviteReceived(callInvite: CallInvite) {6let message = "{ \"foo\": \"bar\", \"marco\": \"polo\" }"7let callMessage = CallMessage(content: message)89// voiceEventSid can be used for tracking the message10let voiceEventSid = callInvite.sendMessage(callMessage)11}1213// MARK: - CallMessageDelegate14func callInviteDidSendMessage(callInvite: CallInvite, voiceEventSid: String) {15NSLog("Call message sent. Voice Event SID: \(voiceEventSid)")16}1718func callInviteDidFailToSendMessage(callInvite: CallInvite, voiceEventSid: String, error: Error) {19NSLog("Failed to send call message. Voice Event SID: \(voiceEventSid). Error: \(error.localizedDescription)")20}2122func callInviteDidReceiveMessage(callInvite: CallInvite, callMessage: CallMessage) {23NSLog("Call message received: \(callMessage.content)")24}
Size Impact for 6.7.0
Architecture | Compressed Size | Uncompressed Size |
---|---|---|
arm64 | 3.9 MB | 11.4 MB |
May 12, 2023
API updates
TVODefaultAudioDevice
class now has a property ignoresPreferredAttributeConfigurationErrors
to ignore errors during AVAudioSession setup. This is to mitigate the WebRTC issue reported hereSize Impact for 6.5.2
Architecture | Compressed Size | Uncompressed Size |
---|---|---|
arm64 | 3.2 MB | 7.1 MB |
December 5, 2022
API updates
The SDK now supports sending and receiving in-call user-defined messages. Use the [TVOCall sendMessage:]
method to send
messages. Endpoints subscribed to the events of the call will be receiving the messages. The [TVOCallMessageDelegate call:didReceiveMessage:]
callback will be raised to the application when a message is received by the client.
Please visit this page for more details about this feature. Additionally, please see the following for more information on how to send and receive messages on the server.
NOTE: This feature should not be used with PII.
The TVOCallMessage
class and the TVOCallMessageBuilder
class are introduced to represent the call messages.
Example of sending a call message:
1let call = TwilioVoiceSDK.connect(options: connectOptions, delegate: self)23// wait for call to be connected45let message = "{ \"foo\": \"bar\", \"marco\": \"polo\" }"6let callMessage = CallMessage(content: message)78// voiceEventSid can be used for tracking the message9let voiceEventSid = call.sendMessage(callMessage)1011extension ViewController: CallMessageDelegate {12func callDidSendMessage(call: Call, voiceEventSid: String) {13NSLog("Call message sent. Voice Event SID: \(voiceEventSid)")14}1516func callDidFailToSendMessage(call: Call, voiceEventSid: String, error: Error) {17NSLog("Failed to send call message. Voice Event SID: \(voiceEventSid). Error: \(error.localizedDescription)")18}19}
Example of handling incoming call messages:
1extension ViewController: CallMessageDelegate {23func callDidReceiveMessage(call: Call, message callMessage: CallMessage) {4NSLog("Call message received. Message: \(callMessage.content)")5}67}
Size Impact for 6.5.0
Architecture | Compressed Size | Uncompressed Size |
---|---|---|
arm64 | 3.2 MB | 7.1 MB |
July 11, 2022
API Updates
writable
property of the TVOIceCandidatePairStats
class has been renamed to writeable
.umatilla
is now supported. Set the TwilioVoiceSDK.edge
property before connecting or accepting the call.Bug Fixes
RTCNativeAudioSessionDelegateAdapter
) when using the SDK side by side with another WebRTC library.Size Impact for 6.4.2
Architecture | Compressed Size | Uncompressed Size |
---|---|---|
arm64 | 3.2 MB | 7.0 MB |
May 26, 2022
Bug Fixes
twr
) in the access token is null
.Size Impact for 6.4.1
Architecture | Compressed Size | Uncompressed Size |
---|---|---|
arm64 | 3.2 MB | 7.0 MB |
May 3, 2022
API updates
TwilioVoiceSDK.register()
method, the TwilioVoiceSDK.unregister()
method, and the TwilioVoiceSDK.connect()
method.Existing customers can now migrate their Voice use-cases to data centers in Ireland or Australia to establish data residency within the region. In addition, new customers may now select Ireland or Australia as their region of choice for Voice related use cases. There is no additional cost to use the new data centers in Ireland or Australia. To learn more about Regional Voice, check out our blog post or head over to our developer docs to get started.
Example of specifying home region in the access token using the Twilio Node.js helper library:
1const accessToken = new twilio.jwt.AccessToken(2credentials.accountSid,3credentials.apiKeySid,4credentials.apiKeySecret, {5identity,6ttl,7region: 'au1',8},9);10
The decoded header of your access token should looks like this:
1{2"alg": "HS256",3"typ": "JWT",4"cty": "twilio-fpa;v=1",5"twr": "au1"6}
Maintenance
[TVOCall getStatsWithBlock:]
.Known Issues
RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Impact for 6.4.0
Architecture | Compressed Size | Uncompressed Size |
---|---|---|
arm64 | 3.2 MB | 7.0 MB |
February 8, 2022
Enhancements
Known Issues
RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Impact for 6.3.1
Architecture | Compressed Size | Uncompressed Size |
---|---|---|
arm64 | 3.2 MB | 7.0 MB |
May 17, 2021
Enhancements
arm64
architecture on Apple Silicon Macs is now available.Known Issues
.xcframeworks
as documented here. Once Carthage supports binary .xcframeworks
, Carthage distribution will be re-added.RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Impact for 6.3.0
Architecture | Compressed Size | Uncompressed Size |
---|---|---|
arm64 | 3.2 MB | 7.1 MB |
March 29, 2021
Bug Fixes
[TVOCallDelegate call:didDisconnectiWithError:]
callback when callee hangs up.[TVONotificationDelegate cancelledCallInviteReceived:error:]
callback when signaling connection error happens.Known Issues
RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Impact for 5.5.2
Architecture | App Download Size | App Storage Size |
---|---|---|
Universal | 3.0 MB | 6.7 MB |
arm64 | 3.0 MB | 6.7 MB |
March 11, 2021
Bug Fixes
Info.plist
file of the framework.Known Issues
TwilioVoice.xcframework
does not currently support the simulator on Apple Silicon arm64
Macs..xcframeworks
as documented here. Once Carthage supports binary .xcframeworks
, Carthage distribution will be re-added.RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Impact for 6.2.2
Architecture | Compressed Size | Uncompressed Size |
---|---|---|
arm64 | 3.1 MB | 7.0 MB |
February 4, 2021
Bug Fixes
Known Issues
TwilioVoice.xcframework
does not currently support the simulator on Apple Silicon arm64
Macs..xcframeworks
as documented here. Once Carthage supports binary .xcframeworks
, Carthage distribution will be re-added.RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Impact for 6.2.1
Architecture | Compressed Size | Uncompressed Size |
---|---|---|
arm64 | 3.1 MB | 7.0 MB |
February 1, 2021
Enhancements
.xcframework
. The .xcframework
package includes the .dSYM
and .bcsymbolmap
files to allow developers to symbolicate crash reports.Known Issues
TwilioVoice.xcframework
does not currently support the simulator on Apple Silicon arm64
Macs..xcframeworks
as documented here. Once Carthage supports binary .xcframeworks
, Carthage distribution will be re-added.RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Impact for 6.2.0
Architecture | Compressed Size | Uncompressed Size |
---|---|---|
arm64 | 3.1 MB | 7.0 MB |
January 7, 2021
Enhancements
ice-candidate
Insights event payload.Debug
mode. The selected-ice-candidate-pair
event will contain private IP address of the local active ICE candidate for debugging purpose in both Release and Debug modes.Bug fixes
call:didDisconnectWithError:
callback when the callee hangs up.cancelledCallInviteReceived:error:
callback when signaling connection error happens.TwilioVoice
framework name and the class name. This was causing swift compile time errors when an app tries to access a TwilioVoice framework's class using the module name, e.g. TwilioVoice.ConnectOptions
. Fixed this issues by renaming the TwilioVoice
class name to TwilioVoiceSDK
.Known Issues
RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size impact for 6.1.0
Architecture | App Download Size | App Storage Size |
---|---|---|
Universal | 3.1 MB | 6.9 MB |
arm64 | 3.1 MB | 6.9 MB |
November 4, 2020
Bug fixes
AudioDeviceWorkerBlock
.Known Issues
RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size impact for 6.0.2
Architecture | App Download Size | App Storage Size |
---|---|---|
Universal | 3.1 MB | 6.8 MB |
arm64 | 3.1 MB | 6.8 MB |
November 2, 2020
Bug fixes
AudioDeviceContext
.Known Issues
RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size impact for 6.0.1
Architecture | App Download Size | App Storage Size |
---|---|---|
Universal | 3.1 MB | 6.8 MB |
arm64 | 3.1 MB | 6.8 MB |
September 15, 2020
API change
The Voice SDK has been updated for better Swift interoperability.
TVO
prefix has been removed from all Twilio Voice typesThis release has improved API for CallKit integration. In order to use CallKit with SDK, you must set ConnectOptions.uuid
or AcceptOptions.uuid
while making or answering a Call. When ConnectOptions.uuid
or AcceptOptions.uuid
is set, it is your responsibility to enable and disable the audio device. You should enable the audio device in [CXProviderDelegate provider:didActivateAudioSession:]
, and disable the audio device in [CXProviderDelegate provider:didDeactivateAudioSession:]
.
1func provider(_ provider: CXProvider, didActivate audioSession: AVAudioSession) {2audioDevice.isEnabled = true3}45func provider(_ provider: CXProvider, didDeactivate audioSession: AVAudioSession) {6audioDevice.isEnabled = false7}89func providerDidReset(_ provider: CXProvider) {10audioDevice.isEnabled = false11}
If you are not using CallKit in your app, you must not set ConnectOptions.uuid
or AcceptOptions.uuid
while making or answering a call. The Voice SDK will enable the audio device for you when the uuid
is nil
.
uuid
property of TVOCall
is now optional.[TVOCallDelegate callDidConnect:]
such that it is raised when both ICE connection state is connected and DTLS negotiation has completed. Previously [TVOCallDelegate callDidConnect:]
was raised when the DTLS negotiation had completed.[TVOCallDelegate callDidConnect:]
is raised when both the ICE connection state is connected and DTLS negotiation has completed. There is no change in behavior however the SDK can detect DTLS failures and raise kTVOMediaDtlsTransportFailedErrorCode
if they occur.Error Codes | ErrorCode | Error Message |
---|---|---|
53407 | TVOMediaDtlsTransportFailedErrorCode | Media connection failed due to DTLS handshake failure |
Event Group | Level | Event Name | Description |
---|---|---|---|
pc-connection-state | DEBUG | new | Raised when peer connection state is new |
pc-connection-state | DEBUG | connecting | Raised when peer connection state is connecting |
pc-connection-state | DEBUG | connected | Raised when peer connection state is connected |
pc-connection-state | DEBUG | disconnected | Raised when peer connection state is disconnected |
pc-connection-state | ERROR | failed | Raised when peer connection state is failed |
pc-connection-state | DEBUG | closed | Raised when peer connection state is closed |
Removed the deprecated property TwilioVoice.region
. Use TwilioVoice.edge
to control the connectivity with Twilio.
The [TwilioVoice registerWithAccessToken:deviceTokenData:completion:]
and the [TwilioVoice unregisterWithAccessToken:deviceTokenData:completion:]
have been renamed to replace the [TwilioVoice registerWithAccessToken:deviceToken:completion:]
and the [TwilioVoice unregisterWithAccessToken:deviceToken:completion:]
methods and now take the NSData
type device token as parameter.
Enhancements
selected-ice-candidate-pair
is reported with the active local ICE candidate and remote ICE candidate.Event Group | Level | Event Name | Description |
---|---|---|---|
ice-candidate | DEBUG | selected-ice-candidate-pair | Raised when the active local and remote ICE candidates of the peer connection are determined |
mos
calculation algorithm has been updated to make it monotonically decreasing with increasing jitter
and packets-lost-fraction
values over a range of rtt
values. The final mos should always be in the range [1.0, 4.6].Maintenance
Bug fixes
Known Issues
RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size impact for 6.0.0
Architecture | App Download Size | App Storage Size |
---|---|---|
Universal | 3.1 MB | 6.8 MB |
arm64 | 3.1 MB | 6.8 MB |
September 15, 2020
Bug Fixes
[TVOCall disconnect]
, [TVOCallInvite reject]
, [TwilioVoice registerWithAccessToken:deviceTokenData:completion:]
and [TwilioVoice unregisterWithAccessToken:deviceTokenData:completion:]
. iOS should no longer report a background task risk of termination warning.Known Issues
RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Impact for 5.5.1
Architecture | App Download Size | App Storage Size |
---|---|---|
Universal | 2.9 MB | 6.7 MB |
arm64 | 2.9 MB | 6.7 MB |
July 9, 2020
API Change
A TVOCallerInfo
class is introduced to represent information about the caller. Currently, this information is limited to SHAKEN/STIR
status of incoming PSTN Calls, but may later be expanded to include CNAM
, and other endpoint types. The verified
property represents whether or not the caller's phone number has been verified by Twilio using SHAKEN/STIR
validation. The value of this attribute is true
if the caller has been validated at 'A'
level, false
if the caller has been verified at any lower level or has failed validation. If SHAKEN/STIR
information is unavailable for the caller or stir status value is null
, the property will be nil
. For details on how Twilio uses SHAKEN/STIR
to make trusted calls and protect against unlawful spoofing, please visit /docs/voice/trusted-calling-using-shakenstir.
New property callerInfo
in TVOCallInvite
returns the TVOCallerInfo
object to represent the information about the caller.
Known Issues
RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Impact for 5.5.0
Architecture | App Download Size | App Storage Size |
---|---|---|
Universal | 2.9 MB | 6.7 MB |
arm64 | 2.9 MB | 6.7 MB |
June 25, 2020
Bug Fixes
TVOCall
or TVOCallInvite
object.Known Issues
RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Impact for 5.4.1
Architecture | App Download Size | App Storage Size |
---|---|---|
Universal | 2.9 MB | 6.7 MB |
arm64 | 2.9 MB | 6.7 MB |
June 3, 2020
API Change
TwilioVoice.edge
. This new property supersedes the now deprecated TwilioVoice.region
. See the new Edge names and how they map to the old region names.Here is an example
1// Connect using global low latency2TwilioVoice.edge = "roaming"
mos
to TVORemoteAudioTrackStats
. Use [TVOCall getStatsWithBlock:]
during a call to retrieve the score. The mos
is computed once per second. Since the MOS is calculated from network performance measurements, it can be used to indicate the current network condition to the user to provide better usability. See API Docs for more informationExample
1call.getStatsWith { (reports) in2for report in reports {3let remoteAudioTracksStats = report.remoteAudioTrackStats4let mosLabel = "\(remoteAudioTracksStats.mos)"5}6}
Enhancements
Network degradation warnings were previously only logged to Insights. With this release, a new TVOCallDelegate
method call:didReceiveQualityWarnings:previousWarnings:
is also invoked when the SDK detects those degradations. Use these to relay network condition to the user to provide a better user experience. See the delegate method and callQualityWarnings for more information.
The Mean Opinion Score (MOS) is now available in TVOStatsReport
. Use [TVOCall getStatsWithBlock:]
during a Call to retrieve the score. Since the MOS is calculated from network performance measurements, it can be used to indicate the current network condition to the user to provide better usability.
By default ICE gathering is done on all interfaces except some VPN type interfaces. This makes it impossible to connect to Twilio in networks that require the use of VPN. In this release, the new Boolean property enableIceGatheringOnAnyAddressPorts
in TVOCallOptionsBuilder
allows the gathering of ICE candidates from all available interfaces. This should be used in those networks where the default does not work. See enableIceGatheringOnAnyAddressPorts for more information.
Deprecations
TwilioVoice.region
is now deprecated. Use TwilioVoice.edge
instead. See the new Edge names for possible values.Bug Fixes
[TVOCallDelegate callDidStartRinging:]
callback if [TVOCall disconnect]
was called.TVOCallInvite
.Other
armv7
builds are no longer available or supported.Known Issues
RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Impact for 5.4.0
Architecture | App Download Size | App Storage Size |
---|---|---|
Universal | 2.9 MB | 7.0 MB |
arm64 | 2.8 MB | 6.9 MB |
April 9, 2020
Improvements
[TwilioVoice unregisterWithAccessToken:deviceTokenData:completion:]
by reducing the number of network requests.[TwilioVoice registerWithAccessToken:deviceTokenData:completion:]
and [TwilioVoice unregisterWithAccessToken:deviceTokenData:completion:]
. They will now finish execution even when the app is backgrounded.Known Issues
RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Impact for 5.3.1
Architecture | App Download Size | App Storage Size |
---|---|---|
Universal | 6.0 MB | 12.7 MB |
arm64 | 2.8 MB | 6.9 MB |
armv7 | 3.0 MB | 5.7 MB |
March 18, 2020
API Changes
NSData
rather than NSString
. The previous register and unregister methods have been deprecated in favor of these new methods.1// TwilioVoice.h23+ (void)registerWithAccessToken:(nonnull NSString *)accessToken4deviceTokenData:(nonnull NSData *)deviceTokenData5completion:(nullable void(^)(NSError * __nullable error))completion6NS_SWIFT_NAME(register(withAccessToken\:deviceToken\:completion:));78+ (void)unregisterWithAccessToken:(nonnull NSString *)accessToken9deviceTokenData:(nonnull NSData *)deviceTokenData10completion:(nullable void(^)(NSError * __nullable error))completion11NS_SWIFT_NAME(unregister(withAccessToken\:deviceToken\:completion:));
Swift example
1func pushRegistry(_ registry: PKPushRegistry, didUpdate credentials: PKPushCredentials, for type: PKPushType) {2TwilioVoice.register(withAccessToken: accessToken, deviceToken: credentials.token) { (error) in3if let error = error {4NSLog("An error occurred while registering: \(error.localizedDescription)")5} else {6NSLog("Successfully registered for VoIP push notifications.")7}8}9}
Objective-C example
1- (void)pushRegistry:(PKPushRegistry *)registry2didUpdatePushCredentials:(PKPushCredentials *)credentials3forType:(NSString *)type {4[TwilioVoice registerWithAccessToken:accessToken5deviceTokenData:credentials.token6completion:^(NSError *error) {7if (error) {8NSLog(@"An error occurred while registering: %@", [error localizedDescription]);9} else {10NSLog(@"Successfully registered for VoIP push notifications.");11}12}];13}
Bug Fixes
transport_id
value.Known Issues
RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Impact for 5.3.0
Architecture | App Download Size | App Storage Size |
---|---|---|
Universal | 6.0 MB | 12.7 MB |
arm64 | 2.8 MB | 6.9 MB |
armv7 | 3.0 MB | 5.7 MB |
March 11, 2020
Bug Fixes
Known Issues
RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Impact for 5.2.1
Architecture | App Download Size | App Storage Size |
---|---|---|
Universal | 6.0 MB | 12.7 MB |
arm64 | 2.8 MB | 6.9 MB |
armv7 | 3.0 MB | 5.7 MB |
February 27, 2020
Enhancements
Bug Fixes
from
value is nil
.Things to Note
[TVOCallDelegate call:isReconnectingWithError:]
and [TVOCallDelegate callDidReconnect:]
callbacks will be received in the order specified i.e a [TVOCallDelegate call:isReconnectingWithError:]
callback will always be followed by a [TVOCallDelegate callDidReconnect:]
callback.Known Issues
RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Impact for 5.2.0
Architecture | App Download Size | App Storage Size |
---|---|---|
Universal | 6.0 MB | 12.7 MB |
arm64 | 2.8 MB | 6.9 MB |
armv7 | 3.0 MB | 5.6 MB |
February 24, 2020
Bug Fixes
from
value is nil
.Known Issues
RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Impact for 5.1.2
Architecture | App Download Size | App Storage Size |
---|---|---|
Universal | 6.0 MB | 12.6 MB |
arm64 | 2.8 MB | 6.8 MB |
armv7 | 3.0 MB | 5.6 MB |
December 9, 2019
Enhancements
Known Issues
RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Impact for 5.1.1
Architecture | App Download Size | App Storage Size |
---|---|---|
Universal | 6.0 MB | 12.6 MB |
arm64 | 2.8 MB | 6.8 MB |
armv7 | 3.0 MB | 5.6 MB |
November 19, 2019
Enhancements
Event Group | Level | Event Name | Description |
---|---|---|---|
settings | INFO | codec | Raised when the codec has been selected |
Other Improvements
listening-error
event level was incorrectly reported as INFO instead of ERROR to insights
.Deprecated
Known Issues
RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Impact for 5.1.0
Architecture | App Download Size | App Storage Size |
---|---|---|
Universal | 5.9 MB | 12.6 MB |
arm64 | 2.8 MB | 6.8 MB |
armv7 | 3.0 MB | 5.6 MB |
September 19, 2019
This release adds support for the new PushKit push notification policy that iOS 13 and Xcode 11 introduced. To upgrade your application please follow the migration guide.
Insights
To provide observability for incoming call cancellations the following Insights events have been added:
Event Group | Event Name | Level | Description |
---|---|---|---|
connection | listen | info | Reported when an attempt to listen for cancellations is made |
connection | listening | info | Reported when an attempt to listen for cancellations has succeeded |
connection | cancel | info | Reported when a cancellation has been reported |
connection | listening-error | error | Reported when an attempt to listen for a cancellation has failed |
registration | unsupported-cancel-message-error | error | Reported when a "cancel" push notification is processed by the SDK. This version of the SDK does not support "cancel" push notifications |
API Changes
Starting with 5.0.0, when [TwilioVoice registerWithAccessToken:deviceToken:completion:]
is called, the Voice SDK will only register for "call" push notifications and cancelled call invites will be determined internally by the SDK. [TwilioVoice handleNotification:delegate:delegateQueue:]
no longer processes "cancel" push notification payloads and will returnfalse
if provided with a cancel notification.
A valid call push notification, when passed to [TwilioVoice handleNotification:delegate:delegateQueue:]
, will still result in a TVOCallInvite
being raised [TVONotificationDelegate callInviteReceived:]
. A TVOCancelledCallInvite
will be raised asynchronously via [TVONotificationDelegate cancelledCallInviteReceived:error:]
if any of the following events occur:
TVOCallInvite
to be notified of a cancellation via [TVONotificationDelegate cancelledCallInviteReceived:error:]
.
A TVOCancelledCallInvite
will not be raised if the invite is accepted or rejected.[TwilioVoice handleNotification:delegate:]
is now [TwilioVoice handleNotification:delegate:delegateQueue:]
delegateQueue
: the dispatch queue where the [TVONotificationDelegate cancelledCallInviteReceived:error:]
callback is received. If nil
is passed, the dispatch main queue will be used.[TVONotificationDelegate callInviteReceived:]
callback synchronously.false
.[TVONotificationDelegate cancelledCallInviteReceived:]
is now [TVONotificationDelegate cancelledCallInviteReceived:error:]
error
indicates that the call was canceled as a result of an error. The error.code
will be set to TVOErrorCallCancelledError
if a caller cancels the call before the called party could answer the call.The property enableInsights
has been renamed to insights
and moved from TVOCallOptions.h
to TwilioVoice.h
.
The property region
has moved from TVOCallOptions.h
to TwilioVoice.h
. If you are specifying a region via the TwilioVoice.h
region property you must now do so before [TwilioVoice connectWithAccessToken:delegate:]
or [TwilioVoice handleNotification:delegate:delegateQueue:]
is called.
Class method [TVOCallInvite isValid:]
is added to TVOCallInvite
for apps to validate whether the notification payload is a valid call notification sent by Twilio. A valid notification payload will result in a TVOCallInvite
being returned via the [TVONotificationDelegate callInviteReceived:]
callback when passed to [TwilioVoice handleNotification:delegate:delegateQueue:]
.
Known Issues
RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Impact for 5.0.0
Architecture | App Download Size | App Storage Size |
---|---|---|
Universal | 5.9 MB | 12.6 MB |
arm64 | 2.8 MB | 6.8 MB |
armv7 | 3.0 MB | 5.6 MB |
August 19, 2019
Enhancements
The Differentiated Services Code Point (DSCP) Tagging API allows you to mark the audio packets with Expedited Forwarding (EF) for the purposes of improved packet routing. When enabled, supporting networks will prioritize audio packet delivery for improved audio quality.
Use enableDscp
to enable or disable DSCP tagging. Note, enableDscp
is enabled by default.
For example:
1// Configure DSCP with `TVOConnectOptions`2let connectOptions = TVOConnectOptions(accessToken: accessToken) { (builder) in3builder.enableDscp = true4}56let call = TwilioVoice.connect(with: connectOptions, delegate: callDelegate)
1// Configure DSCP with `TVOAcceptOptions`2let acceptOptions = TVOAcceptOptions(accessToken: accessToken) { (builder) in3builder.enableDscp = true4}56let call = callInvite.accept(with: acceptOptions, delegate: callDelegate)
For more information, refer to the docs.
Known Issues
RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Impact for 4.3.0
Architecture | App Download Size | App Storage Size |
---|---|---|
Universal | 5.9 MB | 12.4 MB |
arm64 | 2.8 MB | 6.7 MB |
armv7 | 3.0 MB | 5.5 MB |
August 8, 2019
This release includes changes in how the static library libTwilioVoice.a
is built and packaged. libTwilioVoice.a
now contains all the dependencies of the static libraries. Use -lTwilioVoice
in the Other Linker Flags setting to link the SDK. BoringSSL is not packaged as a separate artifact.
Known Issues
TVOConnectOptions
or TVOAcceptOptions
. ICE servers can be obtained from Twilio's Network Traversal Service.RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Impact for 4.2.1
Architecture | App Download Size | App Storage Size |
---|---|---|
Universal | 5.9 MB | 12.4 MB |
arm64 | 2.7 MB | 6.7 MB |
armv7 | 3.0 MB | 5.5 MB |
August 7, 2019
Enhancements
Custom Parameters in Canceled Call Notification
You can now retrieve the custom parameters set in your TwiML application from TVOCancelledCallInvite
. With this addition, you can for example, display a missed call notification with the caller's display name retrieved from the TVOCancelledCallInvite
customParameters
.
For more information, refer to the API docs
Pass custom parameters in TwiML
1<?xml version="1.0" encoding="UTF-8"?>2<Response>3<Dial callerId="client:alice">4<Client>5<Identity>bob</Identity>6<Parameter name="caller_first_name" value="alice" />7<Parameter name="caller_last_name" value="smith" />8</Client>9</Dial>10</Response>
cancelledCallInvite.customParameters
:
1{2"caller_first_name" = "alice";3"caller_last_name" = "smith";4}
Known Issues
TVOConnectOptions
or TVOAcceptOptions
. ICE servers can be obtained from Twilio's Network Traversal Service.RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Impact for 4.2.0
Architecture | App Download Size | App Storage Size |
---|---|---|
Universal | 5.9 MB | 12.4 MB |
arm64 | 2.7 MB | 6.7 MB |
armv7 | 3.0 MB | 5.5 MB |
July 15, 2019
New Features
Max Average Bandwidth API
By default, the Opus codec is set up with a transmission rate of around 32 kbps (40-50kbps on the wire). With this release, you are able to set a custom max average bitrate to better control how much bandwidth your VoIP application should use. See RFC-7587 section 7.1 for information about Max Average Bitrate.
The main purpose of this API is to set a lower max average bitrate to minimise bandwidth usage. This is particularly useful in deployments where bandwidth is at a premium. Where bandwidth is not of concern, you do not need to use this API.
Max Average Bitrate can be set to as low as 6,000bps and as high as 51,000 bps. Values outside this range are ignored and the default Opus operation mode is used. See API Docs for more information.
As would be expected, lowering the max average bitrate impacts audio quality. We don't recommend setting max average bitrate to a value below 8,000 bps. On the other hand, setting values over 32,000 bps will have negligible audio quality improvements.
For example, to set a new max average bitrate to 16,000 bps:
1let connectOptions = TVOConnectOptions(accessToken: accessToken) { (builder) in2builder.params = params3builder.preferredAudioCodecs = [TVOOpusCodec(maxAverageBitrate: 16000)]4}56let call = TwilioVoice.connect(with: connectOptions, delegate: callDelegate)
Other Enhancements
ice-candidate
events to Insights. These events are raised when OnIceCandidate
is called on the PeerConnection
.Known Issues
TVOConnectOptions
or TVOAcceptOptions
. ICE servers can be obtained from Twilio's Network Traversal Service.RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Impact for 4.1.0
Architecture | App Download Size | App Storage Size |
---|---|---|
Universal | 5.9 MB | 12.4 MB |
arm64 | 2.7 MB | 6.7 MB |
armv7 | 3.0 MB | 5.5 MB |
June 28, 2019
New Features
Reconnecting State API
This release introduces the new Reconnecting State API
. This API adds a new state TVOCallStateReconnecting
to TVOCallState
and two new optional TVOCallDelegate
methods, call:isReconnectingWithError:
and callDidReconnect:
.
Call reconnection capability has been available since SDK 3.0. For example, if a call is established over a Wi-Fi network and the Wi-Fi network becomes unavailable, the SDK will automatically switch the call over to the next available network.
This release adds the reconnection related callbacks. call:isReconnectingWithError:
is invoked to indicate a call is being reconnected due to a network disruption or network switch over and callDidReconnect:
is called once the call has been re-connected. You can use this information to provide intuitive feedback to your App user when a reconnection is taking place.
Enhancements
Passing a malformed callee to either [TwilioVoice connectWithAccessToken:] or [TwilioVoice connectWithOptions:delegate:] will now result in TVOErrorAddressIncompleteError
Migration Guide
Please refer to our migration guide for more information about migrating from 3.x.
Known Issues
TVOConnectOptions
or TVOAcceptOptions
. ICE servers can be obtained from Twilio's Network Traversal Service.RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Impact for 4.0.0
Architecture | App Download Size | App Storage Size |
---|---|---|
Universal | 5.8 MB | 12.4 MB |
arm64 | 2.7 MB | 6.7 MB |
armv7 | 2.9 MB | 5.5 MB |
June 6, 2019
Bug Fixes
NSInvalidArgumentException
exception is raised while connecting a call. #13Known Issues
TVOConnectOptions
or TVOAcceptOptions
. ICE servers can be obtained from Twilio's Network Traversal Service.RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Report
Architecture | App Download Size | App Storage Size |
---|---|---|
Universal | 5.8 MB | 12.4 MB |
arm64 | 2.8 MB | 6.8 MB |
armv7 | 3.0 MB | 5.6 MB |
May 16, 2019
Enhancements
Improved error codes
We now surface more details about errors encountered during [TwilioVoice registerWithAccessToken:deviceToken:completion:], [TwilioVoice unregisterWithAccessToken:deviceToken:completion:], [TwilioVoice connectWithOptions:delegate:], and [TVOCallInvite acceptWithOptions:delegate:]. Previously, these functions reported these errors with the generic error TVOErrorRegistrationError
or TVOErrorConnectionError
.
With the new error codes, you can make more informed decisions with how to remedy the problem. For example, TVOErrorBadRequestError and TVOErrorTooManyRequestsError indicate potential programming issues, while TVOErrorTokenAuthenticationRejected indicate an issue with your Access Token.
Please note, you may need to change your code if you have added special handling for TVOErrorRegistrationError
or TVOErrorConnectionError
.
For more information see the API docs
The following is a summary of the new codes available for [TwilioVoice registerWithAccessToken:deviceToken:completion:], [TwilioVoice unregisterWithAccessToken:deviceToken:completion:]:
Error Code | Value | Error Message |
---|---|---|
TVOErrorBadRequestError | 31400 | Bad Request |
TVOErrorForbiddenError | 31403 | Forbidden |
TVOErrorNotFoundError | 31404 | Not Found |
TVOErrorRequestTimeoutError | 31408 | Request Timeout |
TVOErrorConflictError | 31409 | Conflict |
TVOErrorUpgradeRequiredError | 31426 | Upgrade Required. This is most likely related to a TLS version not accepted by Twilio's infrastructure |
TVOErrorTooManyRequestsError | 31429 | Too Many Requests |
TVOErrorInternalServerError | 31500 | Internal Server Error |
TVOErrorBadGatewayError | 31502 | Bad Gateway |
TVOErrorServiceUnavailableError | 31503 | Service Unavailable |
TVOErrorGatewayTimeoutError | 31504 | Gateway Timeout |
The following is a summary of the new codes available for [TwilioVoice connectWithOptions:delegate:]
, and [TVOCallInvite acceptWithOptions:delegate:]
:
Error Code | Value | Error Message |
---|---|---|
TVOErrorTransportError | 31009 | Transport Error |
TVOErrorBadRequestError | 31400 | Bad Request |
TVOErrorForbiddenError | 31403 | Forbidden |
TVOErrorNotFoundError | 31404 | Not Found |
TVOErrorRequestTimeoutError | 31408 | Request Timeout |
TVOErrorTemporarilyUnavailableError | 31480 | Temporarily Unavailable |
TVOErrorCallDoesNotExistError | 31481 | Call/Transaction Does Not Exist |
TVOErrorBusyHereError | 31486 | Busy Here |
TVOErrorRequestTerminatedError | 31487 | Request Terminated |
TVOErrorInternalServerError | 31500 | Internal Server |
TVOErrorBadGatewayError | 31502 | Bad Gateway |
TVOErrorServiceUnavailableError | 31503 | Service Unavailable |
TVOErrorGatewayTimeoutError | 31504 | Gateway Timeout |
TVOErrorDNSResolutionError | 31530 | DNS Resolution Error |
TVOErrorBusyEverywhereError | 31600 | Busy Everywhere |
TVOErrorDeclineError | 31603 | Decline |
TVOErrorDoesNotExistAnywhereError | 31604 | Does Not Exist Anywhere |
Known Issues
TVOConnectOptions
or TVOAcceptOptions
. ICE servers can be obtained from Twilio's Network Traversal Service.RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Report
Architecture | App Download Size | App Storage Size |
---|---|---|
Universal | 5.8 MB | 12.4 MB |
arm64 | 2.8 MB | 6.8 MB |
armv7 | 3.0 MB | 5.6 MB |
April 25, 2019
We have promoted 3.0.0-beta13
to 3.0.0
. Reference our migration guide to upgrade your applications to 3.0.
Known Issues
TVOConnectOptions
or TVOAcceptOptions
. ICE servers can be obtained from Twilio's Network Traversal Service.RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Report
Architecture | App Download Size | App Storage Size |
---|---|---|
Universal | 5.8 MB | 12.3 MB |
arm64 | 2.8 MB | 6.8 MB |
armv7 | 3.0 MB | 5.6 MB |
April 18, 2019
Bug Fixes
Known Issues
TVOConnectOptions
or TVOAcceptOptions
. ICE servers can be obtained from Twilio's Network Traversal Service.RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Report
Architecture | App Download Size | App Storage Size |
---|---|---|
Universal | 5.8 MB | 12.3 MB |
arm64 | 2.8 MB | 6.8 MB |
armv7 | 3.0 MB | 5.6 MB |
April 17, 2019
Enhancements
TVOErrorConnectionTimeoutError
, TVOErrorSignalingConnectionError
, TVOErrorSignalingConnectionTimeoutError
, TVOErrorSignalingIncomingMessageInvalidError
, TVOErrorSignalingOutgoingMessageInvalidError
, TVOErrorConfigurationAcquireFailedError
and TVOErrorConfigurationAcquireTurnFailedError
from TVOError.h
.Bug Fixes
kDefaultAVAudioSessionConfigurationBlock
to kTVODefaultAVAudioSessionConfigurationBlock
so that TwilioVoice.framework
and TwilioVideo.framework
may be used in the same application.packets_lost_fraction
to Insights instead of integer.Known Issues
TVOConnectOptions
or TVOAcceptOptions
. ICE servers can be obtained from Twilio's Network Traversal Service.RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Report
Architecture | App Download Size | App Storage Size |
---|---|---|
Universal | 5.8 MB | 12.3 MB |
arm64 | 2.8 MB | 6.8 MB |
armv7 | 3.0 MB | 5.6 MB |
April 4, 2019
Enhancements
Bug Fixes
Known Issues
TVOConnectOptions
or TVOAcceptOptions
. ICE servers can be obtained from Twilio's Network Traversal Service.RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Report
Architecture | App Download Size | App Storage Size |
---|---|---|
Universal | 5.8 MB | 12.4 MB |
arm64 | 2.8 MB | 6.8 MB |
armv7 | 3.0 MB | 5.6 MB |
April 2, 2019
Bug Fixes
TVOCallStateConnected
state.Known Issues
TVOConnectOptions
or TVOAcceptOptions
. ICE servers can be obtained from Twilio's Network Traversal Service.RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Report
Architecture | App Download Size | App Storage Size |
---|---|---|
Universal | 5.8 MB | 12.4 MB |
arm64 | 2.8 MB | 6.8 MB |
armv7 | 3.0 MB | 5.6 MB |
March 27, 2019
Enhancements
[TVOCallInvite acceptWithDelegate:]
and [TVOCallInvite acceptWithOptions:delegate:]
.TVOCall
.API Changes
[TwilioVoice connectWithDelegate:]
or [TVOCallInvite acceptWithDelegate:]
that fail prior to reaching the TVOCallStateConnected
state will always result in the call:didFailToConnectWithError:
callback with an error code. However, if [TVOCall disconnect]
is called while an attempt to connect or accept a call is made, the call:didDisconnectWithError:
callback will be raised with no error.Bug Fixes
call:didFailToConnectWithError:
callback. Previously these scenarios erroneously raised call:didDisconnectWithError:
.call:didFailToConnectWithError:
callback. Previously this scenario erroneously raised call:didDisconnectWithError:
.packets_lost_fraction
value reported to Insights is correctly computed and within the expect range of 0 to 100.TVOConnectOptions.enableInsights
property was set to false.Known Issues
TVOConnectOptions
or TVOAcceptOptions
. ICE servers can be obtained from Twilio's Network Traversal Service.RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Report
Architecture | App Download Size | App Storage Size |
---|---|---|
Universal | 5.8 MB | 12.4 MB |
arm64 | 2.8 MB | 6.8 MB |
armv7 | 3.0 MB | 5.6 MB |
March 20, 2019
Bug Fixes
TwilioVoice.framework
that could cause code signing issue when uploading apps to iTunes Connect.Known Issues
TVOConnectOptions
or TVOAcceptOptions
. ICE servers can be obtained from Twilio's Network Traversal Service.packets_lost_fraction
value reported to Insights is incorrectly computed and within the expect range of 0 to 100.TVOConnectOptions.enableInsights
property was set to false.RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Report
Architecture | App Download Size | App Storage Size |
---|---|---|
Universal | 5.8 MB | 12.4 MB |
arm64 | 2.8 MB | 6.8 MB |
armv7 | 3.0 MB | 5.6 MB |
March 19, 2019
API Changes
from
property of the TVOCallInvite
and TVOCancelledCallInvite
objects is now nullable
in case the value is not available in the call invite notification.Bug Fixes
Known Issues
3.0.0-beta7
may have code signing issue when uploading to iTunes Connect due to some development scripts included in TwilioVoice.framework
.TVOConnectOptions
or TVOAcceptOptions
. ICE servers can be obtained from Twilio's Network Traversal Service.packets_lost_fraction
value reported to Insights is incorrectly computed and within the expect range of 0 to 100.TVOConnectOptions.enableInsights
property was set to false.RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Report
Architecture | App Download Size | App Storage Size |
---|---|---|
Universal | 5.8 MB | 12.4 MB |
arm64 | 2.8 MB | 6.8 MB |
armv7 | 3.0 MB | 5.6 MB |
March 14, 2019
Enhancements
Known Issues
3.0.0-beta6
may have code signing issue when uploading to iTunes Connect due to some development scripts included in TwilioVoice.framework
.TVOConnectOptions
or TVOAcceptOptions
. ICE servers can be obtained from Twilio's Network Traversal Service.packets_lost_fraction
value reported to Insights is incorrectly computed and within the expect range of 0 to 100.TVOConnectOptions.enableInsights
property was set to false.RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Report
Architecture | App Download Size | App Storage Size |
---|---|---|
Universal | 5.8 MB | 12.4 MB |
arm64 | 2.8 MB | 6.8 MB |
armv7 | 3.0 MB | 5.6 MB |
March 4, 2019
Enhancements
libboringssl.a
library is now separated and shipped alongside the static library libTwilioVoice.a
. Add -lboringssl
in the Other Linker Flags to link the SDK properly.Bug Fixes
libTwilioVoice.a
is now properly linked with dependencies.Known Issues
3.0.0-beta5
may have code signing issue when uploading to iTunes Connect due to some development scripts included in TwilioVoice.framework
.TVOConnectOptions
or TVOAcceptOptions
. ICE servers can be obtained from Twilio's Network Traversal Service.packets_lost_fraction
value reported to Insights is incorrectly computed and within the expect range of 0 to 100.TVOConnectOptions.enableInsights
property was set to false.RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Report
Architecture | App Download Size | App Storage Size |
---|---|---|
Universal | 6.4 MB | 13.4 MB |
arm64 | 3.1 MB | 7.4 MB |
armv7 | 3.3 MB | 6.1 MB |
February 14, 2019
API Changes
TVOCallFeedbackScoreNoScore
is replaced with TVOCallFeedbackScoreNotReported
.Known Issues
TVOConnectOptions
or TVOAcceptOptions
. ICE servers can be obtained from Twilio's Network Traversal Service.packets_lost_fraction
value reported to Insights is incorrectly computed and within the expect range of 0 to 100.TVOConnectOptions.enableInsights
property was set to false.RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Report
Architecture | App Download Size | App Storage Size |
---|---|---|
Universal | 6.4 MB | 13.4 MB |
arm64 | 3.1 MB | 7.3 MB |
armv7 | 3.3 MB | 6.0 MB |
February 7, 2019
Enhancements
TVOCallOptions.enableInsights
.TVOErrorTokenAuthenticationRejected (51007)
. This error is raised when attempting to perform registration or unregistration with a token that is invalid.[TVOCall postFeedback:issue:]
method to TVOCall
that posts the feedback collected for this Call to Twilio. If TVOCallFeedbackScoreNoScore
and TVOCallFeedbackIssueNotReported
are passed, Twilio will report feedback was not available for this call.Bug Fixes
Known Issues
TVOConnectOptions
or TVOAcceptOptions
. ICE servers can be obtained from Twilio's Network Traversal Service.packets_lost_fraction
value reported to Insights is incorrectly computed and within the expect range of 0 to 100.TVOConnectOptions.enableInsights
property was set to false.RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Report
Architecture | App Download Size | App Storage Size |
---|---|---|
Universal | 3.1 MB | 7.3 MB |
arm64 | 3.1 MB | 7.3 MB |
December 13, 2018
Enhancements
preferredAudioCodecs
property to TVOCallOptions
. Support for Opus
is added to the Voice SDK but yet to be enabled on Twilio infrastructure. It will be notified to the users of the Voice SDK when Opus
codec is enabled on Twilio infrastructure.31008
. This error is raised when a TVOCallInvite
is accepted after the Call has ended.Bug Fixes
Known Issues
TVOConnectOptions
or TVOAcceptOptions
. ICE servers can be obtained from Twilio's Network Traversal Service.RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.Size Report
Architecture | App Download Size | App Storage Size |
---|---|---|
Universal | 3.1 MB | 7.2 MB |
arm64 | 3.1 MB | 7.2 MB |
November 26, 2018
Enhancements
Known Issues
TVOConnectOptions
or TVOAcceptOptions
. ICE servers can be obtained from Twilio's Network Traversal Service.RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.October 24, 2018
Bug Fixes
call:didDisconnectWithError:
delegate method of the caller should be called with nil
error instead of call:didFailToConnectWithError:
when the TVOCallInvite
is rejected with answerOnBridge
enabled.Known Issues
TVOConnectOptions
or TVOAcceptOptions
. ICE servers can be obtained from Twilio's Network Traversal Service.RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.October 2, 2018
Enhancements
customParameters
property to TVOCallInvite
.Pass custom parameters in TwiML
1<?xml version="1.0" encoding="UTF-8"?>2<Response>3<Dial callerId="client:alice">4<Client>5<Identity>bob</Identity>6<Parameter name="caller_first_name" value="alice" />7<Parameter name="caller_last_name" value="smith" />8</Client>9</Dial>10</Response>
callInvite.customParameters
:
1{2"caller_first_name" = "alice";3"caller_last_name" = "smith";4}
Bug Fixes
TVOAudioDevice
is created.NSCameraUsageDescription
key in app's Info.plist to consume the Voice SDK in an app and upload it to the App Store. #164AVAudioSession
interruptions. TVOAVAudioSessionConfigurationBlock
now configures AVAudioSession.preferredIOBufferDuration
to 20 milliseconds by default, to match changes in WebRTC.Known Issues
answerOnBridge
is set to true.TVOConnectOptions
or TVOAcceptOptions
. ICE servers can be obtained from Twilio's Network Traversal Service.RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.September 12, 2018
Bug Fixes
inject_credentials.sh
which was accidentally included in the TwilioVoice.framework
bundle has been removed.Enhancements
[TwilioVoice handleNotification:]
no longer raises errors via the notificationError:
method when processing invalid notifications, instead a BOOL
value is returned when it is called. The Boolean value is YES
when the provided notification payload results in a TVOCallInvite
or TVOCancelledCallInvite
object. If [TwilioVoice handleNotification:]
returns NO
it means the data provided was not a Twilio Voice push notification. The TVOCallInvite
has an accept()
and a reject()
method. While the TVOCancelledCallInvite
provides the to
, from
, and callSid
fields also available in the TVOCallInvite
object. The callSid
can be used to associate a TVOCallInvite
with a TVOCancelledCallInvite
.notificationError:
is removed from the TVONotificationDelegate
protocol. cancelledCallInviteReceived:
is added for the SDK to notify the application when a Call cancellation notification is received.Processing push notifications in 2.X
1- (void)pushRegistry:(PKPushRegistry *)registry2didReceiveIncomingPushWithPayload:(PKPushPayload *)payload3forType:(NSString *)type {4[TwilioVoice handleNotification:payload.dictionaryPayload delegate:self];5}67# pragma mark - TVONotificationDelegate89- (void)callInviteReceived:(TVOCallInvite *)callInvite {10if (callInvite.state == TVOCallInviteStatePending) {11[self handleCallInviteReceived:callInvite];12} else if (callInvite.state == TVOCallInviteStateCanceled) {13[self handleCallInviteCanceled:callInvite];14}15}1617- (void)notificationError:(NSError *)error {18NSLog(@"Failed processing notification payload: %@", error);19}2021- (void)handleCallInviteReceived:(TVOCallInvite *)callInvite {22// Call invite received23}2425- (void)handleCallInviteCanceled:(TVOCallInvite *)callInvite {26// Call invite canceled27}
Processing push notifications in 3.X
1- (void)pushRegistry:(PKPushRegistry *)registry2didReceiveIncomingPushWithPayload:(PKPushPayload *)payload3forType:(NSString *)type {4BOOL result = [TwilioVoice handleNotification:payload.dictionaryPayload delegate:self];5if (!result) {6NSLog(@"The processed data was not a Twilio push notification payload");7}8}910# pragma mark - TVONotificationDelegate1112- (void)callInviteReceived:(TVOCallInvite *)callInvite {13// Call invite received14}1516- (void)cancelledCallInviteReceived:(TVOCancelledCallInvite *)cancelledCallInvite {17// Call invite cancelled18}
API Changes
TVOAudioOptions.levelControl
and TVOAudioOptions.levelControlInitialPeakLevelDBFS
properties as they are no longer supported in Chromium WebRTC 67.Known Issues
3.0.0-preview3
may need to include NSCameraUsageDescription
key and purpose string in it's Info.plist
in order to submit the app to the App Store. The WebRTC used by the Twilio Voice SDK is using camera APIs. We are working on building the Voice SDK with the audio only variant of WebRTC where this workaround will not be required. #163TVOConnectOptions
or TVOAcceptOptions
. ICE servers can be obtained from Twilio Network Traversal Service.RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.August 28, 2018
Enhancements
[TVOCallDelegate callDidStartRinging:]
. This callback is emitted once before the [TVOCallDelegate callDidConnect:]
callback when the callee is being alerted of a Call. The duration of the TVOCallStateRinging
is determined by the answerOnBridge
flag provided in the Dial
verb of your TwiML application associated with this client. If the answerOnBridge
flag is false
, which is the default, the [TVOCallDelegate callDidConnect:]
callback will be emitted immediately after [TVOCallDelegate callDidStartRinging:]
. If the answerOnBridge
flag is true
this will cause the Call to emit the callDidConnect
callback only until the call is answered. See answeronbridge for more details on how to use it with the Dial
TwiML verb. If the TwiML response contains a Say
verb, then the call will emit the [TVOCallDelegate callDidConnect:]
callback immediately after [TVOCallDelegate callDidStartRinging:]
is raised, irrespective of the value of answerOnBridge
being set to true
or false
.TVOCallStateRinging
.TwilioVoice.region
is moved to TVOCallOptions.region
.getStatsWithBlock:
method to TVOCall
that builds a TVOStatsReport
with metrics for all the audio tracks in a Call.Known Issues
3.0.0-preview2
may need to include NSCameraUsageDescription
key and purpose string in it's Info.plist
in order to submit the app to the App Store. The WebRTC used by the Twilio Voice SDK is using camera APIs. We are working on building the Voice SDK with the audio only variant of WebRTC where this workaround will not be required. #163TVOConnectOptions
or TVOAcceptOptions
. ICE servers can be obtained from Twilio Network Traversal Service.RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.August 10, 2018
This is our first WebRTC based release using Chromium WebRTC 57.
This SDK introduces audio device APIs. The Voice SDK uses TVODefaultAudioDevice
by default. This release introduces a new protocol, TVOAudioDevice
. This protocol gives you the ability to replace TVODefaultAudioDevice
. By implementing the TVOAudioDevice
protocol, you can write your own audio capturer to feed audio samples to the Voice SDK and an audio renderer to receive the remote audio samples. For example, you could integrate with ReplayKit2
and capture application audio for broadcast or play music using AVAssetReader
.
This SDK introduces TVOConnectOptions
and TVOAcceptOptions
to allow developers to make behavioral changes associated with a Call.
This SDK allows multiple active Calls to be managed by the application.
Enhancements
TwilioVoice.audioDevice
class property. You should set your audio device on TwilioVoice.audioDevice
before performing any other actions with the SDK such as creating Tracks or connecting to a Call.TVODefaultAudioDevice
to render and capture audio. By default, the Voice SDK uses TVODefaultAudioDevice
to capture and render audio.TVOAudioDevice
protocol. As a part of this change we've also added TVOAudioFormat
which describes audio that is being captured and rendered.CallKitIntegration
category from TwilioVoice
in favor of a new property called TVODefaultAudioDevice.enabled
. This property provides developers with a mechanism to enable or disable the activation of the audio device prior to connecting to a Call or to stop or start the audio device while you are already connected to a Call. A Call can now be connected without activating the audio device by setting TVODefaultAudioDevice.enabled
to NO
and can be enabled during the lifecycle of the Call by setting TVODefaultAudioDevice.enabled
to YES
. The default value is YES
. This API change was made to ensure full compatibility with CallKit as well as supporting other use cases where developers may need to disable the audio device during a call.Examples #1 - Changing the audio route from receiver to the speaker in a live call:
12// The Voice SDK uses TVODefaultAudioDevice by default.34// ... connect to a Call. The `TVODefaultAudioDevice` is configured to route audio to the receiver by default.56TVODefaultAudioDevice *audioDevice = (TVODefaultAudioDevice *)TwilioVoice.audioDevice;78audioDevice.block = ^ {9// We will execute `kDefaultAVAudioSessionConfigurationBlock` first.10kDefaultAVAudioSessionConfigurationBlock();1112if (![session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error]) {13NSLog(@"AVAudiosession overrideOutputAudioPort %@",error);14}15};16audioDevice.block();
Example #2 - Connecting to a Call using the AVAudioSessionCategoryPlayback
category:
1id<TVOAudioDevice> audioDevice = [TVODefaultAudioDevice audioDeviceWithBlock:^ {23// Execute the `kDefaultAVAudioSessionConfigurationBlock` first.4kDefaultAVAudioSessionConfigurationBlock();56// Overwrite the category to `playback`7AVAudioSession *session = [AVAudioSession sharedInstance];8NSError *error = nil;9if (![session setCategory:AVAudioSessionCategoryPlayback10mode:AVAudioSessionModeVoiceChat11options:AVAudioSessionCategoryOptionAllowBluetooth12error:&error]) {13NSLog(@"AVAudioSession setCategory:options:mode:error: %@",error);14}15}];1617TwilioVoice.audioDevice = audioDevice;1819TVOCall *call = [TwilioVoice connectWithOptions:connectOptions delegate:self];
[TwilioVoice call]
to [TwilioVoice connectWithOptions:delegate:]
.1TVOConnectOptions *connectOptions = [TVOConnectOptions optionsWithAccessToken:self.accessToken2block:^(TVOConnectOptionsBuilder *builder) {3builder.params = twiMLParams;4builder.uuid = [NSUUID UUID];5}];6TVOCall *call = [TwilioVoice connectWithOptions:connectOptions delegate:self];
TVOCallInvite
using TVOAcceptOptions
.1TVOAcceptOptions *options = [TVOAcceptOptions optionsWithCallInvite:self2block:^(TVOAcceptOptionsBuilder *builder) {3builder.uuid = weakSelf.callInvite.uuid;4}];5TVOCall *call = [callInvite acceptWithOptions:options delegate:strongSelf];
TVOLogModuleCore
, TVOLogModulePlatform
, TVOLogModuleSignaling
and TVOLogModuleWebRTC
.[TwilioVoice setModule:logLevel:]
is now [TwilioVoice setLogLevel:module:]
.[TwilioVoice logLevelForModule:]
is added for retrieving log level for specific module.[TwilioVoice version]
is now [TwilioVoice getVersion]
to avoid type conflict with NSObject
.Known Issues
3.0.0-preview1
may need to include NSCameraUsageDescription
key and purpose string in it's Info.plist
in order to submit the app to the App Store. The WebRTC used by the Twilio Voice SDK is using camera APIs. We are working on building the Voice SDK with the audio only variant of WebRTC where this workaround will not be required. #163TVOConnectOptions
or TVOAcceptOptions
. ICE servers can be obtained from Twilio Network Traversal Service.RTCNativeAudioSessionDelegateAdapter
symbol conflict during compile time.For older changelog entries including 2.x, click here