-
Notifications
You must be signed in to change notification settings - Fork 29
Migration to improved meetings associated with a space
In Webex, meetings can be broadly classified into Webex Meetings and Space Meetings. Set of features available in each of these meeting types are different. As a result meeting experience differs.
Goal of improved meetings in a space is to provide a single meeting experience which is a superset of Webex Meeting and Space Meetings. Meeting experience would be same regardless of how the meeting is joined or where it is scheduled from.
Note: This new behavior change would be applicable from upcoming February 2024, 3.11.0 release onwards.
-
Dynamic meeting ID and URL. URL includes /MTID. This makes concurrent meetings by different hosts in the same space possible.
-
Ad-hoc meeting/Instant meeting has new meeting URL everytime. Earlier in instant meeting same static URL were used all the time.
-
Earlier meeting experience and feature set was tied to meeting sponsor's entitlement. Meeting sponsor is one who created the space. With improved space meetings, concept of meeting sponsorship is removed. Meeting creator's license determines meeting capabilities.
-
For scheduled meetings, if the user is not part of the space then there is a requirement to enter the password. On entering incorrect password few times, captcha information is provided along with appropriate error code via API. Subsequently correct password and captcha information is required for user to be able to successfully join the meeting.
-
Space meetings now has advanced meeting capabilities such as real time transcriptions and closed captions.
Earlier a group space-id could be passed as an input string to create an instant meeting in the space. This is no longer supported. Error CANNOT_START_INSTANT_MEETING(-7015)
will be thrown for such cases.
SDK clients can only join or start an already created meeting. webex.phone.dial
API only accepts a meeting number
, sip uri of the meeting
or a meeting url
.
eg:
webex.phone.dial("12345678901", option, completionHandler: { result in
switch result {
case .success(let call):
// Success. Do necessary handling
case .failure(let error):
// Handle error
}
})
webex.phone.dial("[email protected]", option, completionHandler: { result in
switch result {
case .success(let call):
// Success. Do necessary handling
case .failure(let error):
// Handle error
}
})
webex.phone.dial("https://cisco.webex.com/cisco/j.php?MTID=m12345fe91b1d96592e749dc331b492eddd", option, completionHandler: { result in
switch result {
case .success(let call):
// Success. Do necessary handling
case .failure(let error):
// Handle error
}
})
Depending on how the meeting is created, participant might have to wait in a lobby before host admits them to the meeting. This is notifed in the Call
observer.
webex.phone.dial("https://cisco.webex.com/cisco/j.php?MTID=m12345fe91b1d96592e749dc331b492eddd", MediaOption.audioVideoScreenShare(video: (local: selfVideoView, remote: remoteVideoView.mediaRenderView), screenShare: screenShareView), completionHandler: { result in
switch result {
case .success(let call):
// Joining a meeting is successful
call.onConnected = {
}
call.onRinging = {
}
call.onWaiting = { reason in
}
call.onDisconnected = { reason in
}
call.onInfoChanged = {
}
call.onMediaChanged = { mediaEvents in
}
call.onScheduleChanged = { schedule in
}
case .failure(let error):
// Handle error
}
})
If SDK client is joining a meeting as a host and if another participant is waiting in the lobby, For such cases, SDK client can admit the participant using below API. CallMembership object needs to be passed of the participant who is waiting in the lobby.
self.call.letIn(callMembershipsToLetIn, completionHandler: { error in
if error != nil {
// success
}
})
If the user is not part of the space where the meeting is created then the user will be prompted for password. On entering incorrect password few times, captcha information is provided along with appropriate error code in the completion result of webex.phone.dial
API. Subsequently correct password and captcha information is required for user to be able to successfully join the meeting.
webex.phone.dial("[email protected]", option, completionHandler: { result in
switch result {
case .success(let call):
// Success. Do necessary handling
case .failure(let error):
switch error {
case .requireHostPinOrMeetingPassword(reason: let reason):
// Prompt user for password. Use MediaOption param in dial API for providing password
case .invalidPassword(reason: let reason):
// Prompt user for password. Use MediaOption param in dial API for providing password
case .captchaRequired(captcha: let captchaObject):
// Prompt user to enter password, captcha. Use MediaOption param in dial API for providing password, captcha value entered by user and captcha id. Captcha ID, Image URL, Audio URL are part of the error data which is Phone.Captcha sent with this error.
case .invalidPasswordOrHostKeyWithCaptcha(captcha: let captchaObject):
// Prompt user to enter password, captcha. Use MediaOption param in dial API for providing password, captcha value entered by user and captcha id. Captcha ID, Image URL, Audio URL are part of the error data which is Phone.Captcha sent with this error.
default:
}
}
})
Note : Password and Captcha flow is applicable only when dialing a meeting number and sip uri. Joining using meeting link does not prompt for password.
A new API is added for refreshing the meeting captcha code if present.
webex.phone.refreshMeetingCaptcha { [weak self] result in
switch result {
case .success(let captcha):
// show refreshed captcha
case .failure(let error):
// handle error
}
}
If the user has the host key and wishes to join the meeting as host, below API can be used.
var mediaOption = MediaOption.audioOnly()
mediaOption.moderator = true
mediaOption.pin = "123456"
webex.phone.dial("[email protected]", mediaOption, completionHandler: { result in
switch result {
case .success(let call):
// Success. Do necessary handling
case .failure(let error):
// Handle error
}
})
When joining a meeting using a meeting link, password is not required. Such a participant is an attendee and not a host. If the attendee has the host key and wishes to reclaim the host role, below API can be used.
If the participant is the creator of the meeting then host pin can be empty in the reclaimHost API.
call.reclaimHost(hostKey: "123456", completionHandler: { result in
switch result {
case .success():
// Success. Do necessary handling
case .failure(let error):
// Handle error
}
})
A participant can be made host using below API. Only a host can make another participant host. Participant Id can be obtained from CallMembership
object.
call.makeHost(participantId: "participantId", completionHandler: { result in
switch result {
case .success():
// Success. Do necessary handling
case .failure(let error):
// Handle error
}
})
A participant can be invited to the meeting using below API. Only a host or co-host can invite another participant. Participant can be invited using an email address.
call.inviteParticipant(participant: "[email protected]") { result in
switch result {
case .success():
// Success. Do necessary handling
case .failure(let error):
// Handle error
}
}
Once you have migrated to this new meetings experience, features like real time transcription, closed captions, etc can be used. Please refer to the Real Time Transcription and Closed Captions documents for more details.