Skip to content

Migration to improved meetings associated with a space

Akshay Agarwal edited this page Jul 8, 2024 · 2 revisions

Introduction

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.

New key behavior changes in space meetings

  • 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.

Meeting join flow

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
        }
    })

Join Meeting by Entering Password/Captcha

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.

Refresh captcha

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
        }
    }

Join meeting as host

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
        }
    })

Reclaim host role

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
        }
    })

Make another participant host

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
       }
   })

Invite another participant

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
        }
    }

Move Meeting

We can also transfer the meeting to this device if the meeting is already joined on another device by setting the CompanionMode parameter in the MediaOption to MoveMeeting. The default value for the CompanionMode is None. The feature toggle "mobile-move-meeting-enabled" must be enabled for users to utilize the move meeting feature. The meeting must be on a converged site to use the move meeting feature.

webex.calendarMeetings.get(meetingId: meetingId) { result in
    switch result {
    case .success(let meeting):
        guard let meeting = meeting else {
            print("Unable to fetch meeting with id: \(meetingId)")
            return
        }
    case .failure(let error):
        print(error)
    }
}

let isMoveMeetingPossible = meeting.isOngoingMeeting && webex.calendarMeetings.isMoveMeetingSupported(meetingId: meeting.meetingId))

if(isMoveMeetingPossible) {
    let option: MediaOption = MediaOption.audioOnly()
    option.companionMode = .MoveMeeting
    webex.phone.dial("meeting_id", option: option, completionHandler: {
        result in
        switch(result) {
        case .success(let call):
            //success
        case.failure(let err):
            //error
        }
    }
}

Webex assistant and more

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.

Clone this wiki locally