diff --git a/Skype/AppSDK/APIoverview.md b/Skype/AppSDK/APIoverview.md deleted file mode 100644 index 56bd1dcca..000000000 --- a/Skype/AppSDK/APIoverview.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -title: Skype for Business App SDK - API overview -description: This article provides an API overview for the Skype for Business App SDK. ---- - -# Skype for Business App SDK - API overview -## SDK Object Model - -Figure 1 provides an overview of the object model hierarchy of the Skype for Business App SDK. A brief description of the objects follows. Detailed descriptions of the operations provided by each object are available in the Deep Dive section. - -![Skype for Business App SDK object model diagram](images/Fig4_.skype_for_business_OM.png "Figure 4. The Skype for Business App SDK object model hierarchy") - -Figure 1. The Skype for Business App SDK object model hierarchy - -### Application - -The **Application** object is a root entity that provides access to all other entities and services in the SDK. Developers are expected to initialize the application before using other entities in the SDK. - -### AnonymousSession - -The **AnonymousSession** object encapsulates an anonymous user authentication session where the user joins a meeting without presenting Skype for Business credentials. The **AnonymousSession** object provides the -**Conversation** that encapsulates the anonymously joined meeting. - -### Conversation - -The **Conversation**] object represents a communication between one or more participants and is controlled by a set of “services”. - -* Participant child objects can be added and removed. Events are available that indicate when, for example, a new participant has joined the conversation. -* The service child objects are fixed and cannot be added or removed; there is one for each aspect to the communication. -* A **ConversationHelper** class. The SDK comes with a conversation helper class that handles some of the details of managing a conversation. Use the helper class if you want to support the core meeting scenarios with a minimum of code. - -#### Service - -Each service object is of a different type, and provides management of a specific aspect of the conversation, for example, management of chat message sending or its activity history: - -* **Chat** To send an IM, to send message that the participant is typing, and so on. -* **Audio** To start/stop audio in the conversation, to control local audio devices etc. -* **Video** To start/stop video in the conversation, to control local video devices etc. -* **History** To view and manage the previous events (for example, sent messages) for the conversation. - -Events are available that indicate that a new message has arrived or the audio/video state has changed. - -#### Participant - -The **Participant** object represents a specific participant in the conversation. (A conversation may have many participants.) This object provides access to the participant’s attributes (for example, name) and to the chat, audio, and video sub-services that are specific to that participant. - -Events are available that indicate when, for example, the participant starts typing or their audio/video state has changed. - -There is a participant object for the local (or "self") participant. To achieve some operations, both the chat, audio and video sub-services for this specific local participant must be used alongside the local device services described above. See the API reference documentation for further details on how this works for each operation. - -### DevicesManager - -The **DevicesManager** object provides access to configuration of multimedia devices used in audio and video calls. It provides lists of available devices of each type (speakers, microphones, cameras) and allows selection of which one should be used. Devices and their attributes may vary between platforms.  \ No newline at end of file diff --git a/Skype/AppSDK/ConversationHelperCodeList.md b/Skype/AppSDK/ConversationHelperCodeList.md deleted file mode 100644 index ae71ad1f0..000000000 --- a/Skype/AppSDK/ConversationHelperCodeList.md +++ /dev/null @@ -1,526 +0,0 @@ ---- -title: The ConversationHelper class -description: Describes the ConversationHelper class and provides the ConversationHelper class code list and syntax. ---- -# The ConversationHelper class - -The Skype for Business App SDK for Android ships with the ConversationHelper.java source file, found in -the **Helpers** folder of the compressed **SkypeForBusinessAppSDKAndroid** zip file. This helper class -lets you get started with Skype conversation video quickly. Use the code from this class to learn about -the best pattern for implementing video in your app. - -## ConversationHelper class code list - -```java -package com.microsoft.office.sfb.healthcare; - -import android.graphics.SurfaceTexture; -import android.view.TextureView; - -import com.microsoft.media.MMVRSurfaceView; -import com.microsoft.office.sfb.appsdk.Application; -import com.microsoft.office.sfb.appsdk.AudioService; -import com.microsoft.office.sfb.appsdk.Camera; -import com.microsoft.office.sfb.appsdk.ChatService; -import com.microsoft.office.sfb.appsdk.Conversation; -import com.microsoft.office.sfb.appsdk.ConversationActivityItem; -import com.microsoft.office.sfb.appsdk.DevicesManager; -import com.microsoft.office.sfb.appsdk.HistoryService; -import com.microsoft.office.sfb.appsdk.MessageActivityItem; -import com.microsoft.office.sfb.appsdk.Observable; -import com.microsoft.office.sfb.appsdk.ObservableList; -import com.microsoft.office.sfb.appsdk.Participant; -import com.microsoft.office.sfb.appsdk.ParticipantAudio; -import com.microsoft.office.sfb.appsdk.ParticipantService; -import com.microsoft.office.sfb.appsdk.ParticipantVideo; -import com.microsoft.office.sfb.appsdk.SFBException; -import com.microsoft.office.sfb.appsdk.Speaker; -import com.microsoft.office.sfb.appsdk.VideoService; - -import java.net.URI; -import java.util.List; - -/** - * This is a convenience class. It simplifies interaction with the core Conversation interface - * and its children. - * - * It provides the following functionality: - * 1. An integrated callback interface for the most useful property change notifications, - * removing the need to write verbose observer code. - * 2. Audio functionality to toggle mute and switch between loudspeaker and non-loudspeaker - * endpoints. - * 3. Video functionality to start outgoing and incoming video and switch between cameras. - */ -public class ConversationHelper { - - /** - * Callback interface for property and state change notifications. - */ - public interface ConversationCallback { - /** - * This method is called when the state of the conversation changes. - * E.g. On joining a meeting the conversation state changes from idle->establishing->established. - * @param newConversationState The new conversation state. - */ - void onConversationStateChanged(Conversation.State newConversationState); - - /** - * This method is called when the {@link ChatService#CAN_SEND_MESSAGE_PROPERTY_ID} changes. - * @param canSendMessage New value retrieved using {@link ChatService#canSendMessage()} - */ - void onCanSendMessage(boolean canSendMessage); - - /** - * This method is called when a new incoming IM ({@link MessageActivityItem}) is received. - * @param newMessage Incoming MessageActivityItem retrieved by listening to changes on the - * {@link HistoryService#getConversationActivityItems() Activity Item Collection} - */ - void onMessageReceived(MessageActivityItem newMessage); - - /** - * This method is called when the state of the self participant Audio state changes. - * @param newState The new state of Audio {@link com.microsoft.office.sfb.appsdk.ParticipantService.State} - * retrieved by calling {@link ParticipantAudio#getState()} - */ - void onSelfAudioStateChanged(ParticipantService.State newState); - - /** - * This method is called when the mute status of local participant changes. - * {@link ParticipantAudio#PARTICIPANT_SERVICE_STATE_PROPERTY_ID} - * @param newMuteStatus The new mute status retrieved calling {@link ParticipantAudio#isMuted()} - */ - void onSelfAudioMuteChanged(boolean newMuteStatus); - - /** - * This method is called when the state of {@link com.microsoft.office.sfb.appsdk.ConversationService#CAN_START_PROPERTY_ID} - * changes. - * @param newCanStart The new value retrieved by calling {@link VideoService#canStart()} - */ - void onCanStartVideoServiceChanged(boolean newCanStart); - - /** - * This method is called when the state of {@link VideoService#CAN_SET_PAUSED_PROPERTY_ID} - * changes. - * @param newCanSetPaused The new value retrieved by calling {@link VideoService#canSetPaused()} - */ - void onCanSetPausedVideoServiceChanged(boolean newCanSetPaused); - - - /** - * This method is called when the state of {@link VideoService#CAN_SET_ACTIVE_CAMERA_PROPERTY_ID} changes. - * changes. - * @param newCanSetActiveCamera The new value retrieved by calling {@link VideoService#canSetActiveCamera()} - */ - void onCanSetActiveCameraChanged(boolean newCanSetActiveCamera); - } - - private Conversation conversation = null; - private DevicesManager devicesManager = null; - private AudioService audioService = null; - private VideoService videoService = null; - private ChatService chatService = null; - private HistoryService historyService = null; - - /** - * Self participant - */ - private Participant selfParticipant = null; - private ParticipantAudio selfParticipantAudio = null; - - /** - * Self participant video preview control. - */ - private TextureView videoPreviewView = null; - - /** - * Remote participant video control. - */ - private MMVRSurfaceView participantVideoView = null; - - - /** - * List of remote participants. - */ - ObservableList remoteParticipants = null; - Participant remoteParticipantLeader = null; - - /** - * Callback passed in by the caller. - */ - private ConversationCallback conversationCallback = null; - - private ObservableList.OnListChangedCallback listChangedCallback = null; - - /** - * Callback handler class. This handles the property change notifications from SDK entities. - * It extends {@link Observable.OnPropertyChangedCallback} - */ - private ConversationCallbackHandler conversationCallbackHandler = null; - - /** - * Constructor. - * @param conversation Conversation created by calling {@link Application#joinMeetingAnonymously(String, URI)} - * @param devicesManager DevicesManager instance {@link Application#getDevicesManager()} - * @param textureView Self video preview view. - * @param mmvrSurfaceView Remote participant video view. - * @param conversationCallback {@link ConversationCallback} object that should receive - * callbacks from this conversation helper. - */ - public ConversationHelper(Conversation conversation, - DevicesManager devicesManager, - TextureView textureView, - MMVRSurfaceView mmvrSurfaceView, - ConversationCallback conversationCallback) { - - - // Setup the callback and callback handler. - this.conversationCallback = conversationCallback; - this.conversationCallbackHandler = new ConversationCallbackHandler(); - this.listChangedCallback = new MessageListCallbackHandler(); - - this.conversation = conversation; - this.conversation.addOnPropertyChangedCallback(this.conversationCallbackHandler); - this.devicesManager = devicesManager; - - // Get the chat service and register for property change notifications. - this.chatService = conversation.getChatService(); - this.chatService.addOnPropertyChangedCallback(this.conversationCallbackHandler); - - // Get the audio service and register for property change notifications. - this.audioService = conversation.getAudioService(); - this.audioService.addOnPropertyChangedCallback(this.conversationCallbackHandler); - - // Get the video service and register for property change notifications. - this.videoService = conversation.getVideoService(); - this.videoService.addOnPropertyChangedCallback(this.conversationCallbackHandler); - - this.historyService = conversation.getHistoryService(); - this.historyService.getConversationActivityItems().addOnListChangedCallback(this.listChangedCallback); - - this.selfParticipant = conversation.getSelfParticipant(); - this.selfParticipantAudio = this.selfParticipant.getParticipantAudio(); - this.selfParticipantAudio.addOnPropertyChangedCallback(this.conversationCallbackHandler); - - this.videoPreviewView = textureView; - this.videoPreviewView.setSurfaceTextureListener(new VideoPreviewSurfaceTextureListener()); - this.participantVideoView = mmvrSurfaceView; - this.participantVideoView.setCallback(new VideoStreamSurfaceListener()); - - this.remoteParticipants = conversation.getRemoteParticipants(); - } - - /** - * Switch between Loudspeaker and Non-loudspeaker. - */ - public void changeSpeakerEndpoint() { - Speaker.Endpoint endpoint = Speaker.Endpoint.LOUDSPEAKER; - Speaker currentSpeaker = this.devicesManager.getSelectedSpeaker(); - switch(currentSpeaker.getActiveEndpoint()) { - case LOUDSPEAKER: - endpoint = Speaker.Endpoint.NONLOUDSPEAKER; - break; - case NONLOUDSPEAKER: - endpoint = Speaker.Endpoint.LOUDSPEAKER; - break; - } - currentSpeaker.setActiveEndpoint(endpoint); - } - - /** - * Toggle mute state. - */ - public void toggleMute() { - // Get current mute state. - boolean selfMuteState = this.selfParticipantAudio.isMuted(); - try { - this.selfParticipantAudio.setMuted(!selfMuteState); - } catch (SFBException e) { - e.printStackTrace(); - } - } - - /** - * Pause or un-pause video. - */ - public void toggleVideoPaused() { - boolean videoPaused = this.videoService.getPaused(); - try { - this.videoService.setPaused(!videoPaused); - } catch (SFBException e) { - e.printStackTrace(); - } - } - - /** - * Switch the camera by selecting from the list of available cameras. - */ - public void changeActiveCamera() { - try { - Camera activeCamera = this.videoService.getActiveCamera(); - List availableCameras = devicesManager.getCameras(); - int newCameraIndex = (availableCameras.indexOf(activeCamera) + 1) % availableCameras.size(); - this.videoService.setActiveCamera(availableCameras.get(newCameraIndex)); - } catch (SFBException e) { - e.printStackTrace(); - } - } - - /** - * Start outgoing video. - */ - public void startOutgoingVideo() { - if (this.videoPreviewView.isAvailable()) { - surfaceTextureCreatedCallback(this.videoPreviewView.getSurfaceTexture()); - } - } - - /** - * Start incoming video. - */ - public void startIncomingVideo() { - if (this.participantVideoView.isActivated()) { - videoStreamSurfaceCreatedCallback(this.participantVideoView); - } - } - - /** - * Helper method to ensure that the video service is started and video is flowing. - */ - public void ensureVideoIsStartedAndRunning() { - try { - // Check state of video service. - // If not started, start it. - if (this.videoService.canStart()) { - this.videoService.start(); - } else { - // On joining the meeting the Video service is started by default if we have video - // Since the view is created later the video service is paused. - // Resume the service. - if (this.videoService.getPaused()) { - if (this.videoService.canSetPaused()) { - this.videoService.setPaused(false); - } - } - } - } catch (SFBException e) { - e.printStackTrace(); - } - } - - /** - * For displaying the video preview, we need to tie the video stream to the TextureView control. - * This is achieved by registering a listener to the TextureView by passing in an instance of - * class below. - * Clients are expected to pass in the view once inflated from their activity / fragments. - */ - private class VideoPreviewSurfaceTextureListener implements TextureView.SurfaceTextureListener { - - /** - * This method is called when the view is available. We immediately register is with the - * {@link VideoService#showPreview(SurfaceTexture)} in the callback handler. - * @param surface - * @param width - * @param height - */ - @Override - public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { - surfaceTextureCreatedCallback(surface); - } - - @Override - public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { } - - @Override - public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { - return true; - } - - @Override - public void onSurfaceTextureUpdated(SurfaceTexture surface) { } - }; - - /** - * For displaying the remote participant video we need to tie the video stream to the MMVRSurfaceView - * control. This is achieved by registering a listener to the MMVRSurfaceView by passing in an instance of - * class below. - * Clients are expected to pass in the view once inflated from their activity / fragments. - */ - private class VideoStreamSurfaceListener implements MMVRSurfaceView.MMVRCallback { - - /** - * This method is called when the MMVRSurfaceView is created. We will tie in the video stream - * to the control by calling {@link ParticipantVideo#subscribe(MMVRSurfaceView)} - * - * @param mmvrSurfaceView - */ - @Override - public void onSurfaceCreated(MMVRSurfaceView mmvrSurfaceView) { - videoStreamSurfaceCreatedCallback(mmvrSurfaceView); - } - - @Override - public void onFrameRendered(MMVRSurfaceView mmvrSurfaceView) { - } - - @Override - public void onRenderSizeChanged(MMVRSurfaceView mmvrSurfaceView, int i, int i1) { - } - } - - /** - * Setup the Video preview. - * @param texture SurfaceTexture - */ - private void surfaceTextureCreatedCallback(SurfaceTexture texture) { - try { - // Tie the video stream to the texture view control - videoService.showPreview(texture); - - // Check state of video service. - // If not started, start it. - if (this.videoService.canStart()) { - this.videoService.start(); - } else { - // On joining the meeting the Video service is started by default. - // Since the view is created later the video service is paused. - // Resume the service. - if (this.videoService.canSetPaused()) { - this.videoService.setPaused(false); - } - } - } catch (SFBException e) { - e.printStackTrace(); - } - } - - /** - * Setup the remote participant video. - * @param mmvrSurfaceView MMVRSurfaceView - */ - private void videoStreamSurfaceCreatedCallback(MMVRSurfaceView mmvrSurfaceView) { - this.participantVideoView = mmvrSurfaceView; - // Setup the video properties - this.participantVideoView.setAutoFitMode(MMVRSurfaceView.MMVRAutoFitMode_Crop); - // Render the video - this.participantVideoView.requestRender(); - try { - this.remoteParticipants = conversation.getRemoteParticipants(); - for (Participant participant : this.remoteParticipants) { - if (participant.getRole() == Participant.Role.LEADER) { - this.remoteParticipantLeader = participant; - ParticipantVideo participantVideo = this.remoteParticipantLeader.getParticipantVideo(); - participantVideo.subscribe(this.participantVideoView); - break; - } - } - - } catch (SFBException e) { - e.printStackTrace(); - } - } - - /** - * This callback handler class handles property change notifications from SDK entities. - * We have authored a single handler class that distinguishes who the sender was. - */ - class ConversationCallbackHandler extends Observable.OnPropertyChangedCallback { - /** - * onProperty changed will be called by the Observable instance on a property change. - * @param sender Observable instance. - * @param propertyId property that has changed. - * @see com.microsoft.office.sfb.appsdk.Observable.OnPropertyChangedCallback - */ - @Override - public void onPropertyChanged(Observable sender, int propertyId) { - - if (Conversation.class.isInstance(sender)) { - Conversation conversation = (Conversation)sender; - switch(propertyId) { - case Conversation.STATE_PROPERTY_ID: - Conversation.State newState = conversation.getState(); - conversationCallback.onConversationStateChanged(newState); - break; - } - } - - if (ChatService.class.isInstance(sender)) { - ChatService chatService = (ChatService)sender; - switch (propertyId) { - case ChatService.CAN_SEND_MESSAGE_PROPERTY_ID: - boolean canSendMessage = chatService.canSendMessage(); - conversationCallback.onCanSendMessage(canSendMessage); - break; - } - } - - if (ParticipantAudio.class.isInstance(sender)) { - ParticipantAudio selfParticipantAudio = (ParticipantAudio)sender; - switch (propertyId) { - case ParticipantService.PARTICIPANT_SERVICE_STATE_PROPERTY_ID: - conversationCallback.onSelfAudioStateChanged(selfParticipantAudio.getState()); - break; - case ParticipantAudio.PARTICIPANT_IS_MUTED_PROPERTY_ID: - conversationCallback.onSelfAudioMuteChanged(selfParticipantAudio.isMuted()); - break; - } - } - - if (VideoService.class.isInstance(sender)) { - VideoService videoService = (VideoService)sender; - switch (propertyId) { - case VideoService.CAN_START_PROPERTY_ID: - conversationCallback.onCanStartVideoServiceChanged(videoService.canStart()); - break; - case VideoService.CAN_SET_PAUSED_PROPERTY_ID: - conversationCallback.onCanSetPausedVideoServiceChanged(videoService.canSetPaused()); - break; - case VideoService.CAN_SET_ACTIVE_CAMERA_PROPERTY_ID: - conversationCallback.onCanSetActiveCameraChanged(videoService.canSetActiveCamera()); - break; - } - } - } - } - - /** - * This callback handler class handles change notifications on {@link ObservableList} - */ - class MessageListCallbackHandler extends ObservableList.OnListChangedCallback { - @Override - public void onChanged(Object sender) { } - - @Override - public void onItemRangeChanged(Object sender, int positionStart, int itemCount) {} - - /** - * Called whenever items have been inserted into the list. - * - * @param sender ObservableList instance - * @param positionStart starting index of the inserted items. - * @param itemCount number of items that have changed - */ - @Override - public void onItemRangeInserted(Object sender, int positionStart, int itemCount) { - ObservableList messageList = (ObservableList) sender; - - // Is this a message activity item? - if (MessageActivityItem.class.isInstance(messageList.get(positionStart))) { - MessageActivityItem messageActivityItem = (MessageActivityItem)messageList.get(positionStart); - - // Is this an incoming message? - if (messageActivityItem.getDirection() == MessageActivityItem.MessageDirection.INCOMING) { - conversationCallback.onMessageReceived(messageActivityItem); - } - } - } - - @Override - public void onItemRangeMoved(Object sender, int fromPosition, int toPosition, int itemCount) { } - - @Override - public void onItemRangeRemoved(Object sender, int positionStart, int itemCount) { } - } - -} - -``` \ No newline at end of file diff --git a/Skype/AppSDK/Download.md b/Skype/AppSDK/Download.md deleted file mode 100644 index 4ab7793c2..000000000 --- a/Skype/AppSDK/Download.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: 'Download the Skype for Business App SDK' -description: 'The SDK libraries for the iOS and Android SDKs can be downloaded from the Microsoft Download Center.' -ms.date: 03/30/2022 ---- - -# Download the Skype for Business App SDK - -The SDK libraries for the iOS and Android SDKs can be downloaded from the **Microsoft Download Center**: - -## Download SDK packages - -- [iOS](https://aka.ms/sfbAppSDKDownload_ios) -- [Android](https://aka.ms/sfbAppSDKDownload_android) - -## Important information - -### Release notes - -Our [release notes](ReleaseNotes.md) keep you informed about new features and other API enhancements that we include include -in future releases. - -### Server/Services Prerequisites: - -- Skype for Business App SDK release candidate will require [Skype for Business Server 2015 Cumulative Update 4 – November 2016 Release](https://www.microsoft.com/download/details.aspx?id=47690) -- Skype for Business App SDK release candidate can be used with Skype for Business Online with the Trusted Application API without enablepreviewfeatures enabled. -- Skype for Business App SDK release candidate can be used with Skype for Business Online with the enablepreviewfeatures flag enabled(true) for development and testing only with this update. diff --git a/Skype/AppSDK/EmbedSkypeB2Ccomms.md b/Skype/AppSDK/EmbedSkypeB2Ccomms.md deleted file mode 100644 index 0e2330c23..000000000 --- a/Skype/AppSDK/EmbedSkypeB2Ccomms.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: Embed Skype business-to-consumer communications in your mobile app -description: Describes how to embed Skype business-to-consumer communications in the mobile app and provides on-premise and Online Meeting steps. ---- -# Embed Skype business-to-consumer communications in your mobile app - -![Guest meeting join scenario diagram](images/Fig2_anonymous_meeting_join.png "Figure 1. Guest meeting join") - -Figure 1. Guest meeting join - - -## Communication via a Skype for Business meeting - -The app uses the SDK's "guest meeting join" or "anonymous meeting join" capability. Note that while the user is anonymous from the Skype for Business viewpoint, the app may well know who the user is and will authenticate the user against its own back-end authentication systems, before joining the user to the meeting. - -## Skype server platform considerations - -The Skype for Business App SDK supports joining meetings that are hosted on an **on-premise Skype for Business server** or **Skype for Business Online** server. The callflows for either -platform require that your app gets a meeting identifier. In the online scenario, you will also need a server **Discovery URL** and an anonymous authentication token. - -## Online Meeting join resources - -To join a meeting hosted in Skype for Business Online, you need to get a Discovery URI which references a server resource that discovers the right Skype endpoint to join. You also need -an anonymous meeting token to gain access to the meeting. - -## On-premise Meeting join URL - -The way you get a meeting identifier and the format of the identifier depend on which Skype for Business platform the meeting is hosted on. -On-premise meetings are identified by a meeting URL, such as: [https://join.contoso.com/meet/john/BW9Z1MJD]( https://join.contoso.com/meet/john/BW9Z1MJD). The client app will need to obtain this URL from its own back-end services (which in turn, may obtain it using the Skype for Business server-side APIs). - - -This flow is available today. You can experiment with it by creating a meeting in Skype for Business desktop client (or via Outlook) and then launching the meeting URL on a phone with the Skype for Business mobile app installed on it. - -## On-premise steps - -1. Write a back-end application to handle client “visits”: - * Receive a request from your client app, _initially via your own back channel_. - * Verify the visitor. - -2. Use your back-end application to get a meeting URL such as https://join.contoso.com/meet/john/BW9Z1MJD: - * Get this via calendar metadata (for pre-scheduled meetings) or on-demand via our APIs (User API / UCWA). - * Pass the URL (and token) up to your client app and into the App SDK. - -3. Ask the App SDK to join the meeting. -  -## Online Meeting steps - -1. Write a middle-tier application that makes RESTful calls to the [Trusted Application API](../Trusted-Application-API/docs/Overview.md) - * Receive a request from your client app to get a meeting join URL - * Pass the meeting join URL to your client app - * Receive a request from your client app to get a discovery URI and an anonymous meeting join token. - * Pass the discovery URI and token to your client app - -2. Ask the App SDK to join the meeting by using the resources returned by the middle-tier application. - -## Next steps - -- [Getting started with the App SDK](GettingStarted.md) diff --git a/Skype/AppSDK/Feedback.md b/Skype/AppSDK/Feedback.md deleted file mode 100644 index 49d280f85..000000000 --- a/Skype/AppSDK/Feedback.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: Submit your questions, bugs, feature requests, and contributions -description: Describes how the Skype for Business team responds to the developer community and encourages sending questions, bugs, features requests, and contributions. ---- -# Submit your questions, bugs, feature requests, and contributions - -The **Skype for Business** team responds to the developer communitity across several channels. Please tell us about your: - -* **Technical questions**: We listen and respond on [stackoverflow](http://stackoverflow.com/questions/tagged/skypedeveloper). Tag your question with "skypedeveloper" so that our team and the **Skype for Business** developer community can respond with helpful answers. - -* **Documentation bugs**: If you find a bug in the **App SDK** documentation, open an [issue](https://github.com/OfficeDev/skype-docs/issues) on **GitHub**. Be sure to tell us which topic is factually incorrect or unclear. To help us fix the problem more quickly, quote the text to be changed. - -* **Sample application bugs**: If you find a bug in one of our samples, open an issue for [Android sample issues](https://github.com/OfficeDev/skype-android-app-sdk-samples/issues) or [iOS sample issues](https://github.com/OfficeDev/skype-ios-app-sdk-samples/issues) on **GitHub**. Be sure to describe the steps to reproduce the bug. - -* **Contributions**: We accept pull requests against our SDK documentation and our samples. If you'd like to contribute to the documentation, go to our [skype-docs GitHub repository](https://github.com/OfficeDev/skype-docs). You'll find a [contributors guide](https://github.com/OfficeDev/skype-docs/blob/master/CONTRIBUTING.md) that tells you how to create pull requests and what to expect from the Skype for Business team. diff --git a/Skype/AppSDK/GetMeetingURL.md b/Skype/AppSDK/GetMeetingURL.md deleted file mode 100644 index e2bf3d4e9..000000000 --- a/Skype/AppSDK/GetMeetingURL.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: Get a Skype for Business on-premise meeting URL -description: Learn how to get a meeting URL and develop against a live meeting. Users of your production app will rely on server logic to return a new meeting whenever they use the join meeting feature of the App SDK. -ms.date: 03/30/2022 ---- - -# Get a Skype for Business on-premise meeting URL - -If you have not written a server-side feature to schedule a meeting and return a new meeting URL, you can still get a meeting URL and develop against a live meeting. Users of your production app will rely on server logic to return a new meeting whenever they use the join meeting feature of the **App SDK**. - ->[!NOTE] -Production apps must use the generally available App SDK binaries. However, if you are prototyping an app or previewing new features of the App SDK, then you -can enable the preview features of the App SDK by calling the enablePreviewFeatures API method. Doing this allows you -to use the tasks described in this article to join a meeting hosted in a Skype for Business Online server. - -## While developing your app - -While your app is in development, you can create your own anonymous Skype for Business meeting as long as you are a licensed user of Skype for Business. There are two easy ways to do this. - -- Start an ad-hoc meeting from your **Skype for Business** desktop client as shown in figure 1. - - ![Meet Now button on the Skype for Business client](images/meetnow.PNG "Figure 1. Meet Now button on the Skype for Business client") - -- Schedule a **Skype for Business** meeting in outlook. You can set the meeting to run for multiple -days so that you don't need to get a new meeting URL whenever you are testing your code. - - ![Schedule a meeting in Outlook](images/outlookmeeting.PNG "Figure 2. Schedule a meeting in Outlook") - -- Be sure to check the options for the new meeting are what you want, particularly the lobby options. - - ![Set meeting options](images/meetingoptions.PNG "Figure 3. set meeting options") - -### Get the meeting URL - - Join the meeting you scheduled in the previous step. The **Skype for Business** meeting window has a round "..." button at the bottom right corner of the window. Click the button and choose the **Meeting Entry Info** option from the context menu. The dialog that opens shows a **Meeting Link** field which contains the URL that you'll use to join the meeting. - - ![Get the meeting URL from the meeting window](images/entryinfo.PNG "Figure 4. Get the meeting URL from the meeting window") - -## In production for Skype for Business Online - - To create new meetings on demand and send the new meeting URL to your mobile app, you'll write a Trusted Application API-based server application that makes server-to-server REST calls into an Office 365 **Skype for Business Online** service - to create a meeting and get the meeting URL. You will need to write a client-side feature to communicate with your server application to initiate this transaction and get the returned meeting URL. See [Implementing a Anonymous Client with the Skype App SDK](../Trusted-Application-API/docs/ImplementingAnonymousClientWithSkypeAppSDK.md) to learn about adding client side features to an Android or iOS mobile device application. - - See [Anonymous Meeting Scheduling](../Trusted-Application-API/docs/AnonymousMeetingSchedule.md) to learn about scheduling a meeting using the Trusted Application API and obtaining a "joinUrl". - -## Use the meeting URL in your app - -Once you have the meeting URL string, create an **URI** and provide it to the API. The following snippets show this for the Android and iOS platforms: - -- In Java for Android: ```conversation = mApplication.joinMeetingAnonymously(getString(R.string.userDisplayName), meetingURI);``` -- In Objective C for iOS: ```SfBConversation *conversation = [sfb joinMeetingAnonymousWithUri:[NSURL URLWithString:meetingURLString]displayName:meetingDisplayNameerror:&error];``` diff --git a/Skype/AppSDK/GetOnlineMeetingJoinResources.md b/Skype/AppSDK/GetOnlineMeetingJoinResources.md deleted file mode 100644 index 173e69375..000000000 --- a/Skype/AppSDK/GetOnlineMeetingJoinResources.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: Get meeting join resources for Skype for Business Online meetings -description: This article is about getting meeting join resources for Skype for Business Online meetings. ---- - -# Get meeting join resources for Skype for Business Online meetings - -Joining a Skype for Business Online meeting anonymously requires some additional steps that you don't need to do -for on-premise server hosted meetings. Rather than getting a meeting URL and calling into the [joinMeetingAnonymously](https://ucwa.skype.com/reference/appSDK/Android/com/microsoft/office/sfb/appsdk/Application.html\#joinMeetingAnonymously\(java.lang.String, java.net.URI\)) API method, -you need to get a meeting join URL from a [Trusted Application API](../Trusted-Application-API/docs/Overview.md)-enabled service application. You'll also need a Skype for Business Online server discovery URL and an anonymous meeting join token. - -## Develop a Trusted Application API-based service application - -Your mobile app can get the Skype for Business Online resources needed to join a meeting anonymously, but it will need help from the -service application that you need to create. Your SaaS app must perform the following tasks to enable the anonymous meeting join scenario: - -1. Receive a request from your client app to [create an adhoc meeting](../Trusted-Application-API/docs/AnonymousMeetingSchedule.md) and return the meeting join url - - Pass the meeting join URL to your client app -2. Receive a request from your client app to [get a discovery URI and an anonymous meeting join token](../Trusted-Application-API/docs/AnonymousMeetingJoin.md). - - Pass the discovery URI and token to your client app - -The [Implementing a Anonymous Client with the Skype App SDK](../Trusted-Application-API/docs/ImplementingAnonymousClientWithSkypeAppSDK.md) article in the **Trusted Application API** SDK documentation shows you how to get the meeting resources necessary to -join an anonymous meeting. - -## Next steps - -- [Use the SDK to join a meeting with an Android device](HowToJoinMeeting_Android.md) -- [Use the SDK to join a meeting with an iOS device](HowToJoinMeeting_iOS.MD) diff --git a/Skype/AppSDK/GettingStarted.md b/Skype/AppSDK/GettingStarted.md deleted file mode 100644 index c4d919f48..000000000 --- a/Skype/AppSDK/GettingStarted.md +++ /dev/null @@ -1,202 +0,0 @@ ---- -title: Get started with Skype App SDK development -description: Learn how to get started developing mobile applications with the Skype App SDK. It also provides guidance on using the Skype App SDK samples. -ms.date: 03/30/2022 ---- - -# Get started with Skype App SDK development - -This section shows how to get started developing mobile applications with the Skype App SDK. It also provides guidance on using the Skype App SDK samples. - -## Download the Skype App SDK - -The SDKs for iOS and Android are available for download from Microsoft. - -* [Skype for Business App SDK - iOS](https://aka.ms/sfbAppSDKDownload_ios) -* [Skype for Business App SDK - Android](https://aka.ms/sfbAppSDKDownload_android) - ->[!NOTE] -> We maintain a set of [App SDK samples](Samples.md) for Android and iOS on **GitHub**. These samples are configured to use the App SDK and are ready to run. See the readme.md in each of these samples for instructions. - -## Configure your project for the Skype for Business App SDK - -You can start coding with the App SDK after you complete the following configuration tasks for your platform. - -### iOS configuration steps - -1. **Add embedded binary**: In XCode, select the project node and open the project properties pane. Add SkypeForBusiness.framework as an "Embedded Binary" (not a "Linked Framework"). - - > [!NOTE] - > The SDK comes with a binary for use on physical devices (recommended) and a binary for running the iOS simulator (limited because audio and video function won't work correctly). The binaries have the same name but are in separate folders. To run your app on a **device**, navigate to the location where you downloaded the App SDK and select the _SkypeForBusiness.framework_ file in the _AppSDKiOS_ folder. To run your app in a **simulator**, select the _SkypeForBusiness.framework_ file in the _AppSDKiOSSimulator_ folder. - -2. **Add the Conversation Helper** into your project (optional): The SDK comes with an optional "conversation helper" class that can be used to integrate Skype Audio/Video chat feature into your application. These helper classes simplify interaction with the core APIs in mainline scenarios. To use these, add SfBConversationHelper.h/SfBConversationHelper.m files from the _Helpers_ folder in your SDK download into your app's source code. - - > [!NOTE] -> To add text chat feature in your application, you can refer _ChatHandler_ helper class in our [iOS sample apps](https://github.com/OfficeDev/skype-ios-app-sdk-samples). _ChantHandler_ class works similar to _conversation helper_ class and can be used to facilitate text chat integration. - -3. Make sure _Enable Bitcode_ option is set to NO in your iOS project. In the Project Navigator, select your project, go to the Editor pane, select Project -> Build Settings -> select All tab -> Build Options -> Enable Bitcode = NO - -4. **Add description of required permissions** to the application’s Info.plist (use appropriate messages): - -```xml -NSCameraUsageDescription -Access to the camera is required for making video calls. -NSContactsUsageDescription -Access to your address book is required for making calls to contacts. -NSMicrophoneUsageDescription -Access to the microphone is required for making calls. -``` - -5. **Configure AVAudioSession** before attempting to use audio: - -```swift -let audioSession = AVAudioSession.sharedInstance() -try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord, withOptions: [.AllowBluetooth, .MixWithOthers, .DuckOthers]) -try audioSession.setMode(AVAudioSessionModeVoiceChat) -``` - -6. **Configure background modes** to allow continuing an audio call while application is in background. Add Audio and VoIP. - -### Android configuration steps - -1. **Copy the contents of the _AppSDKAndroid_ folder into your project**: Copy from your App SDK download folder into the _libs_ folder of your project module. - -2. **Add the Conversation Helper into your project (optional)**: The SDK comes with an optional "conversation helper" class that simplifies interaction with the core APIs in mainline scenarios. To use it, add SfBConversationHelper.java from the _Helpers_ folder in your App SDK download into your app's source code. - -3. **Update the Conversation Helper package name**: If using the conversation helper, set it to match your app's own package name. - -4. **Add the SDK libraries to the module Gradle dependencies struct:** - -> [!NOTE] - Be sure to include the ```compile fileTree(dir: 'libs', include: ['*.jar'])``` statement. - - ```gradle - dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - compile(name: "SkypeForBusinessNative", ext: 'aar') - compile(name: "SkypeForBusinessPlatform", ext: 'aar') - compile(name: "SkypeForBusiness", ext: 'aar') - compile(name: "SkypeForBusinessTelemetryService", ext: 'aar') - compile(name: "SkypeForBusinessNativeEnums", ext: 'aar') - compile(name: "SkypeForBusinessTelemetryClient", ext: 'aar') - compile(name: "SkypeForBusinessInjector", ext: 'aar') - compile(name: "android-database-sqlcipher", ext: 'aar') - - } - - ``` - -4. **Add app permissions**: Add _uses-permission_ tags to the project **AndroidManifest.xml** file. - - ```xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ``` - ->[!NOTE] -> Subsequent versions of the SDK will eliminate any unneccessary permissions. - -## Configure your Android application as a MultiDex application - -The libraries that support the Android Skype for Business App SDK include a large number of methods. If the total number of methods in your application - including the App SDK methods - exceed 64,000, then you must configure your app as a [MultiDex](https://developer.android.com/studio/build/multidex.html) application. To enable a basic MultiDex configuration, you'll add options to your module **build.gradle** file and the top level application class. - -### MultiDex support in build.gradle - -1. Change the defaultConfig structure in your module **build.gradle** file. Add `multiDexEnabled true` to the structure. - - ```gradle - defaultConfig { - applicationId 'com.microsoft.office.sfb.samples.healthcare' - minSdkVersion 17 - targetSdkVersion 22 - versionCode 2 - versionName "2.1" - multiDexEnabled true - } - ``` - -1. Add a **dexOptions** structure to the module **build.gradle** file. - - ```gradle - dexOptions { - preDexLibraries=false - jumboMode = true - javaMaxHeapSize "4g" - } - ``` - -### Extend your application class as a **MultiDexApplication** - -1. If your application does not have a class that extends the Application class, you must create one. Before you add an application class to your module, update your **AndroidManifest.xml** `Application` node to include the attribute, `android:name=".">` - -1. Create or update your application class to extend **MultiDexApplication**. Be sure to override the **attachBaseContext** method. - -```java -package com.microsoft.office.sfb.healthcare; - -import android.content.Context; -import android.support.multidex.MultiDex; -import android.support.multidex.MultiDexApplication; - -public class SkypeApplication extends MultiDexApplication{ - @Override - protected void attachBaseContext(Context base) { - super.attachBaseContext(base); - MultiDex.install(this); - } -} -``` - -## Next steps - -Now that you've configured your project to code against the **App SDK** API, learn how to get the URL of a **Skype for Business** meeting and then use the API to enable your mobile app to join the meeting: - -In most cases, use a meeting Url to join a meeting anonymously. Otherwise, you'll need to use a **Trusted Application API**-enabled service application to get the Discover Url and anonymous meeting token. Your mobile app will call the service application to get these resources before joining a meeting. To learn more about this, see [Use the App SDK and the Trusted Application API to join an Online meeting - Android](HowToJoinOnlineMeeting_Android.md) or [Use the App SDK and the Trusted Application API to join an Online meeting - iOS](../Trusted-Application-API/docs/ImplementingAnonymousClientWithSkypeAppSDK.md). The following table shows you what resources to use for your SfB deployment scenario. - -|Skype for Business topology|Enable preview features enabled|Enable preview features disabled|Meeting join resource| -|:----|:----|:----|:----| -|CU June 2016|Chat, AV|Chat only|Meeting Url| -|CU November 2016|Chat, AV| Chat, AV|Meeting Url| -|SfB Online|Chat, AV|n/a|Meeting Url| -|SfB Online|n/a|Chat, AV|Discover Uri, Anon Token| - -* [Get a meeting URL](GetMeetingURL.md) -* [Use the SDK to join a meeting with an Android device](HowToJoinMeeting_Android.md) -* [Use the App SDK and the Trusted Application API to join an Online meeting - Android](HowToJoinOnlineMeeting_Android.md) -* [Use the SDK to join a meeting with an iOS device](HowToJoinMeeting_iOS.md) - -## See also - -* [App SDK samples](Samples.md) -* [Submit your questions, bugs, feature requests, and contributions](Feedback.md) diff --git a/Skype/AppSDK/HowToJoinMeeting_Android.md b/Skype/AppSDK/HowToJoinMeeting_Android.md deleted file mode 100644 index 6840cb125..000000000 --- a/Skype/AppSDK/HowToJoinMeeting_Android.md +++ /dev/null @@ -1,171 +0,0 @@ ---- -title: Use the SDK to join a meeting with an Android device -description: Learn how to enable the core Skype for Business anonymous meeting join scenario in your Android app. -ms.date: 3/30/2022 ---- - -# Use the SDK to join a meeting with an Android device - -This article shows you how to enable the core **Skype for Business** anonymous meeting join scenario in your Android app. iOS developers should read -[Use the SDK to join a meeting with an iOS device](HowToJoinMeeting_iOS.md). - -If the anonymous meeting your app joins is hosted in a **Skype for Business Online** service and -your app is not enabled for Skype for Business preview features, then your app must get a **discovery Url** and an **anonymous meeting token** to join. A meeting Url does not give you -meeting access in this scenario. Read [Use the App SDK and the Trusted Application API to join an Online meeting - Android](HowToJoinOnlineMeeting_Android.md) - -After completing the steps in this article, your app can join a **Skype for Business** video meeting with a -meeting URL. No **Skype for Business** credentials are used to join the meeting. - ->[!NOTE] -Be sure to read [Getting started with Skype App SDK development](GettingStarted.md) to learn how to configure your Android project for the **Skype for Business** App SDK. In particular, the following steps assume you have added the _ConversationHelper_ class to your source to let you complete the scenario with a minimum of code. - -1. Initialize the **App SDK** application by calling the static _com.microsoft.office.sfb.appsdk.Application.getInstance(Context)_ method: - - ```java - Application mApplication = com.microsoft.office.sfb.appsdk.Application.getInstance(this.getBaseContext()); - AnonymousSession mAnonymousSession = null; - Conversation mConversation = null; - ``` - - > [!NOTE] - > Be sure to select the Application object in the _com.microsoft.office.sfb.appsdk_ package! - -1. Enable platform preview features and set wifi required for audio/video - - ```java - mApplication.getConfigurationManager().enablePreviewFeatures(true); - mApplication.getConfigurationManager().setRequireWiFiForAudio(true); - mApplication.getConfigurationManager().setRequireWiFiForVideo(true); - mApplication.getConfigurationManager().setMaxVideoChannelCount(2); - - ``` - -1. Start joining the meeting by calling _Application.joinMeetingAnonymously(String displayName, URI meetingUri)_ - - ```java - mAnonymousSession = mApplication - .joinMeetingAnonymously( - getString( - R.string.userDisplayName), meetingURI); - - ``` - - > [!NOTE] - > All of the SDK’s interfaces must be used only from the application main thread (main run loop). Notifications are delivered in the same thread as well. As a result, no synchronization around the SDK’s interfaces is required. The SDK, however, may create threads for internal purposes. - -1. Get the **Conversation** object that encapsulates the meeting from the **AnonymousSession** object by calling _getConversation()_ on the anonymous session. - - ```java - mConversation = mAnonymousSession.getConversation(); - ``` - -1. Show video codec license - - As per the license terms, before you start video for the first time after install, you **must** prompt the user to accept the Microsoft end-user license (also included in the SDK). - This is required to proceed with features that potentially use video codecs. - - This code snippet shows the use of the new Skype App SDK **"setEndUserAcceptedVideoLicense"** api. - Until this method is called, any attempt to use those features will fail. - Once the api has been called, the user is considered in acceptance of the third party video codec license that we use to support video. Subsequent meetings do not require the license acceptance. - - [!code-java [sample](VideoLicense_Android.md)] -1. Connect the conversation property callback to the **Conversation** object returned in the previous step. - - ```java - mConversation.addOnPropertyChangedCallback( - new ConversationPropertyChangeListener()); - ``` - - - Declare a callback class to handle conversation property change Notifications - - ```java - ```java - /** - * Callback implementation for listening for conversation property changes. - */ - class ConversationPropertyChangeListener extends - Observable.OnPropertyChangedCallback { - ConversationPropertyChangeListener() { - } - - /** - * onProperty changed will be called by the Observable instance on a property change. - * - * @param sender Observable instance. - * @param propertyId property that has changed. - */ - @Override - public void onPropertyChanged(Observable sender, int propertyId) { - Conversation conversation = (Conversation) sender; - if (propertyId == Conversation.STATE_PROPERTY_ID) { - if (conversation.getState() == Conversation.State.ESTABLISHED) { - - Log.e("SkypeCall", conversation - .getMeetingInfo() - .getMeetingDescription() - + " is established"); - - try { - runOnUiThread(new Runnable() { - @Override - public void run() { - //Update application UI to show conversation is established. - //Open video call fragment. - - } - }); - } catch (Exception e) { - Log.e("SkypeCall", "exception on meeting started"); - } - } - } - } - } - ``` - -1. When the state of the conversation changes to Conversation.State.ESTABLISHED, construct a ConversationHelper object. Pass the following objects: - - The **Conversation** object returned in a prior step - - the **Application.DevicesManager** - - A **TextureView** control to show a preview of outgoing video - - A view such as a **RelativeLayout** to contain the **MMVRSurfaceview** that will show incoming video. - - ```java - //Initialize the conversation helper with the established conversation, - //the SfB App SDK devices manager, the outgoing video TextureView, - //The view container for the incoming video, and a conversation helper - //callback. - mConversationHelper = new ConversationHelper( - mConversation, - mDevicesManager, - previewVideoTextureView, - mParticipantVideoSurfaceView, - this); - ``` - - > [!NOTE] - > The [ConversationHelper class](ConversationHelperCodeList.md) makes it possible to start a video conversation and handle related events on the conversation, participants, and video streams with fewer lines of application code. You may not want to use the **ConversationHelper** if your application scenario has requirements that are not covered in this how to article. In that case, take the **ConversationHelper** as a starting point and modify or extend it to suite your requirements. - -1. Start the incoming and outgoing meeting video. - - > [!NOTE] - > As per the license terms, before you start video for the first time after install, you must prompt the user to accept the Microsoft end-user license (also included in the SDK). Please refer step 5 - Show video codec license for the sample code. - - ```java - //Start up the incoming and outgoing video - mConversationHelper.startOutgoingVideo(); - mConversationHelper.startIncomingVideo(); - ``` - -1. Implement the **ConversationHelper.ConversationCallback** interface - - ```java - implements ConversationHelper.ConversationCallback - ``` - ---- - -## Sample code - -The code steps shown in this topic are put together in a sample that we've published on GitHub. You can find Android and iOS samples for joining a meeting anonymously by navigating the links in the [Sample applications for the Skype for Business App SDK](./Samples.md) article. - -You can look at the complete conversation helper class code listing in [The ConversationHelper class](./ConversationHelperCodeList.md). diff --git a/Skype/AppSDK/HowToJoinMeeting_iOS.md b/Skype/AppSDK/HowToJoinMeeting_iOS.md deleted file mode 100644 index 40d88957f..000000000 --- a/Skype/AppSDK/HowToJoinMeeting_iOS.md +++ /dev/null @@ -1,282 +0,0 @@ ---- -title: Use the SDK to join a meeting with an iOS device -description: This article shows an iOS developer how to join the Skype for Business meeting using a meeting URL and enable core features like Text chat, Audio/Video chat in your app. -ms.date: 03/30/2022 ---- - -# Use the SDK to join a meeting with an iOS device - -This article shows an iOS developer how to join the **Skype for Business meeting** using a [**meeting URL**](/skype-sdk/appsdk/getmeetingurl) and enable core **Skype for Business App SDK** features like Text chat, Audio/Video chat in your app. - -Android developers should read [Use the SDK to join a meeting with an Android device](HowToJoinMeeting_Android.md). - -> [!NOTE] -> If the anonymous meeting your app joins is hosted in a **Skype for Business Online** service and your app is not enabled for Skype for Business preview features, then your app must get a **discovery Url** and an **anonymous meeting token** to join. A meeting Url does not give you meeting access in this scenario. Read [Use the App SDK and the Trusted Application API to join an Online meeting - iOS](HowToJoinOnlineMeeting_iOS.md) - -No **Skype for Business** credentials are used to join the meeting. - -## Prerequisites - - **Objective C** - -- **Import the SDK header file**: import the required header files. - - ```objective-c - #import - - //Import SfBConversationHelper classes for Audio/Video Chat - #import "SfBConversationHelper.h" - ``` - -**Swift** - -- **Create Swift Bridging - Header file**: Create the bridging-header file and add the following import statement. - -```swift - //Add SfBConversationHelper classes for Audio/Video Chat - #import "SfBConversationHelper.h" -``` - -> [!NOTE] -> Be sure to read [Getting started with Skype App SDK development](GettingStarted.md) to learn how to configure your iOS project for the **Skype for Business** App SDK. In particular, the following steps assume you have added the _ConversationHelper_ class to your source to let you complete the scenario with a minimum of code. - -## How to get started - -1. In your code, initialize the **App SDK** application : - - **Objective C** - -```objectivec - SfBApplication *sfb = SfBApplication.sharedApplication; -``` - - **Swift** - -```swift - let sfb:SfBApplication? = SfBApplication.sharedApplication() -``` - -2. You can handle application level Skype configurations like requireWifiForAudio, maxVideoChannels, requireWifiForVideo, setActiveCamera, get available cameras list and other types of information that can impact the Skype session, for example, by default, video service will be disabled while not on Wi-Fi network. To allow video call on any network connection, we can configure requireWifiForVideo as follow: - - **Objective C** - -```objectivec - - sfb.configurationManager.requireWifiForVideo = NO; -``` - - **Swift** - -```swift - sfb.configurationManager.requireWifiForVideo = false -``` - -> [!NOTE] -> Please refer SfBApplication, SfBConfigurationManager, SfBVideoService, SfBDevicesManager and other classes in SkypeForBusiness framework to handle application level Skype configurations. - -3. Start joining the meeting by calling _Application.joinMeetingAnonymously(String displayName, URI meetingUri)_. This function returns the new conversation instance that represents the meeting. - - **Objective C** - - ```objectivec - - SfBConversation *conversation = [sfb joinMeetingAnonymousWithUri:[NSURL URLWithString:meetingURLString] - displayName:meetingDisplayName - error:&error]; - ``` - - **Swift** - - ```swift - let conversation: SfBConversation = try sfb.joinMeetingAnonymousWithUri(NSURL(string:meetingURLString)!, displayName: meetingDisplayName) - ``` - - > [!NOTE] - > All of the SDK’s interfaces must be used only from the application main thread (main run loop). Notifications are delivered in the same thread as well. As a result, no synchronization around the SDK’s interfaces is required. The SDK, however, may create threads for internal purposes. - -4. Initialize the conversation helper with the conversation instance obtained in the previous step and delegate object that should receive callbacks from this conversation helper. This will automatically start incoming and outgoing video. The delegate class must conform to _SfBConversationHelperDelegate_ protocol. - - **Objective C** - - ```objectivec - - if (conversation) { - _conversationHelper = [[SfBConversationHelper alloc] initWithConversation:conversation - delegate:self - devicesManager:sfb.devicesManager - outgoingVideoView:self.selfVideoView - incomingVideoLayer:(CAEAGLLayer *) self.participantVideoView.layer - userInfo:@{DisplayNameInfo:meetingDisplayName}]; - - } - ``` - - **Swift** - - ```swift - self.conversationHelper = SfBConversationHelper(conversation: conversation, - delegate: self, - devicesManager: sfb.devicesManager, - outgoingVideoView: self.selfVideoView, - incomingVideoLayer: self.participantVideoView.layer as! CAEAGLLayer, - userInfo: [DisplayNameInfo:meetingDisplayName]) - ``` - -5. Show video codec license - - As per the license terms, before you start video for the first time after install, you **must** prompt the user to accept the Microsoft end-user license (also included in the SDK). - - This code snippet shows the use of the new Skype App SDK **"setEndUserAcceptedVideoLicense"** api. This is required to proceed with features that potentially use video codecs. - - Until this method is called, any attempt to use those features will fail. Once the api has been called, the user is considered in acceptance of the third party video codec license that we use to support video. Subsequent meetings do not require the license acceptance. - - [!code-Swift [sample](VideoLicense_iOS.md)] - -6. Implement SfBConversationHelperDelegate methods to handle video service state changes. - - **Objective C** - - ```objectivec - - #pragma mark - Skype Delegates - - // At incoming video, unhide the participant video view - - (void)conversationHelper:(SfBConversationHelper *)avHelper didSubscribeToVideo:(SfBParticipantVideo *)video { - self.participantVideoView.hidden = NO; - } - - // When it's ready, start the video service and show the outgoing video view. - - (void)conversationHelper:(SfBConversationHelper *)avHelper videoService:(SfBVideoService *)videoService didChangeCanStart:(BOOL)canStart { - if (canStart) { - [videoService start:nil]; - - if (self.selfVideoView.hidden) { - self.selfVideoView.hidden = NO; - } - } - } - - // When incoming video is ready, show it. - - (void)conversationHelper:(SfBConversationHelper *)avHelper didSubscribeToVideo:(SfBParticipantVideo *)video { - self.participantVideoView.hidden = NO; - } - ``` - - **Swift** - - ```swift - // When it's ready, start the video service and show the outgoing video view. - func conversationHelper(conversationHelper: SfBConversationHelper, videoService: SfBVideoService, didChangeCanStart canStart: Bool) { - if (canStart) { - do { - try videoService.start() - } - catch let error as NSError { - print(error.localizedDescription) - - } - if (self.selfVideoView.hidden) { - self.selfVideoView.hidden = false - } - } - } - - - //MARK - Skype SfBConversationHelperDelegate methods - - // At incoming video, unhide the participant video view - func conversationHelper(conversationHelper: SfBConversationHelper, didSubscribeToVideo video: SfBParticipantVideo?) { - self.participantVideoView.hidden = false - } - - // When video service is ready to start, unhide self video view and start the service. - func conversationHelper(conversationHelper: SfBConversationHelper, videoService: SfBVideoService, didChangeCanStart canStart: Bool) { - - if (canStart) { - if (self.selfVideoView.hidden) { - self.selfVideoView.hidden = false - } - do{ - try videoService.start() - } - catch let error as NSError { - print(error.localizedDescription) - - } - } - } - // When the audio status changes, reflect in UI - func conversationHelper(avHelper: SfBConversationHelper, selfAudio audio: SfBParticipantAudio, didChangeIsMuted isMuted: Bool) { - if !isMuted { - self.muteButton.setTitle("Unmute", forState: .Normal) - } - else { - self.muteButton.setTitle("Mute", forState: .Normal) - } - } - - ``` - -7. To end the video meeting, monitor the _canLeave_ property of a conversation to prevent leaving prematurely. - - **Objective C** - - ```objectivec - - //Add observer to _canLeave_ property - if (conversation) { - [conversation addObserver:self forKeyPath:@"canLeave" options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew context:nil]; - } - - // Monitor canLeave property of a conversation to prevent leaving prematurely - - - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { - - if ([keyPath isEqualToString:@"canLeave"]) { - self.endCallButton.enabled = _conversationHelper.conversation.canLeave; - } - } - - // Use SfBConversation class leave function to leave the conversation. - NSError *error = nil; - [_conversationHelper.conversation leave:&error]; - - if (error) { - [self handleError:error]; - } - else { - [_conversationHelper.conversation removeObserver:self forKeyPath:@"canLeave"]; - } - ``` - - **Swift** - - ```swift - // Add observer to _canLeave_ property - conversation.addObserver(self, forKeyPath: "canLeave", options: [.Initial, .New] , context: nil) - - // Monitor canLeave property of a conversation to prevent leaving prematurely - - override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer) { - if (keyPath == "canLeave") { - self.endCallButton.enabled = (self.conversationHelper?.conversation.canLeave)! - } - } - - // Use SfBConversation class leave function to leave the conversation. - do{ - try self.conversationHelper?.conversation.leave() - self.conversationHelper?.conversation.removeObserver(self, forKeyPath: "canLeave") - } - ``` - -## Error handling - -SkypeForBusiness SDK API has both _SfBApplication_ and _SfBConversation_ level delegate method for handling possible errors or exceptions. The _SfBApplication_ alertDelegate handles global level concerns, while the _SfBConversation_ alertDelegate handles alerts specific to the conversation instance. - -The delegate method _didReceiveAlert_ is called when new alert appears in the context where alertDelegate is attached. - -## Text chat - -> [!NOTE] -> ChatHandler is the helper class that can be used to integrate Skype text chat feature into your application. It can be integrated in similar manner to SfBConversationHelper. For more information, see [iOS sample apps](https://github.com/OfficeDev/skype-ios-app-sdk-samples). diff --git a/Skype/AppSDK/HowToJoinOnlineMeeting_Android.md b/Skype/AppSDK/HowToJoinOnlineMeeting_Android.md deleted file mode 100644 index 229244e3b..000000000 --- a/Skype/AppSDK/HowToJoinOnlineMeeting_Android.md +++ /dev/null @@ -1,442 +0,0 @@ ---- -title: Use the App SDK and the Trusted Application API to join an Online meeting - Android -description: Learn how to enable the core Skype for Business Online anonymous meeting join scenario in your Android app. -ms.date: 03/30/2022 ---- - -# Use the App SDK and the Trusted Application API to join an Online meeting - Android - -This article shows you how to enable the core **Skype for Business Online** anonymous meeting join scenario in your Android app. iOS developers should read [Use the App SDK and the Trusted Application API to join an Online meeting - iOS](../Trusted-Application-API/docs/ImplementingAnonymousClientWithSkypeAppSDK.md). - -If the anonymous meeting your app joins is hosted in a **Skype for Business Online** service and -your app is **not** enabled for Skype for Business preview features, then your app must get a **discovery Url** and an **anonymous meeting token** to join. This workflow requires that you create and deploy a Trusted Application API-based service application that creates ad-hoc meetings, provides meeting join Urls, discovery Uris, and anonymous meeting tokens to the mobile apps that request them. - ->[!NOTE] ->**For mobile apps that enabled preview features:** If the anonymous meeting your app joins is hosted in a **Skype for Business Online** service and your app is enabled for Skype for Business preview features, then your app can use a meeting Url to join. A Trusted Application API-based service application is **not** needed to complete the scenario in this case. To learn how to use a meeting Url, read [Use the App SDK to join a meeting with an Android device](HowToJoinMeeting_Android.md) - -## Create and deploy a Trusted Application API-based service Application - -The service application you create will give your mobile app access to the needed anonymous meeting join resources - discovery Url and anonymous meeting token. You'll use the RESTful Trusted Application API endpoint to schedule a meeting, get -the discovery Url and token. The rest of this article describes how to enable your Android app to call into such a service application. You can read more about the [Trusted Application API](../Trusted-Application-API/docs/Trusted_Application_API_GeneralReference.md) to learn -about all of the features of this Skype for Business service application api. - -We've published two service application [examples](https://github.com/OfficeDev/skype-docs/tree/main/Skype/Trusted-Application-API/samples) in GitHub to get you started. - -## Add anonymous online meeting code to your mobile app - -Please read [Implementing a Anonymous Client with the Skype App SDK - Android](/skype-sdk/trusted-application-api/docs/implementinganonymousclientwithskypeappsdk) for the sample code. -The sample code is taken from our GitHub [Healthcare app sample](https://github.com/OfficeDev/skype-android-app-sdk-samples/tree/master/HealthcareApp). The example code steps include: - -- Call into a service application sample to get a join Url for a new ad-hoc meeting that is created by the service application -- Use the join url to get an anonymous meeting token and a discovery Uri from the service application -- Call the **joinMeetingAnonymously** method, passing the two resources from the previous step. -- Show use of new Skype App SDK **setEndUserAcceptedVideoLicense** api that is required to proceed with features that potentially use video codecs. -- Get a **Conversation** object from the asynchronously returned **AnonymousSession** object. - -The Android sample uses the **Retrofit 2** library from **Square** to make the RESTful calls into the service application. We've included the source code that sets up the REST adaptor so that -you can see the HTTP headers needed for the sample service application. - -### Get a join Url - -```java - //Retrofit 2 object for making REST calls over https - RESTUtility rESTUtility = new RESTUtility(this,getString(R.string.cloudAppBaseurl)); - - //Get the Middle Tier helpdesk app interface for making REST call - final RESTUtility.SaasAPIInterface apiInterface = rESTUtility.getSaaSClient(); - - String body = "Subject=adhocMeeting&Description=adhocMeeting&AccessLevel="; - - RequestBody bridgeRequest = RequestBody.create( - MediaType.parse("text/plain, */*; q=0.01"), - body); - - - Call call = apiInterface.getAdhocMeeting(bridgeRequest); - call.enqueue(new Callback() { - @Override - public void onResponse(Call call, Response response) { - if (null != response.body()) { - try { - - if (response.body().JoinUrl != null){ - GetAnonymousToken(apiInterface, response.body().JoinUrl); - } else { - Snackbar.make(mRootView, "Meeting URI was not returned", Snackbar.LENGTH_LONG) - .setAction("Action", null).show(); - - } - - - } catch (Exception e) { - if (null != response.body()) { - // body wasn't JSON - mResponseBody.setText(response.body().toString()); - } else { - // set the stack trace as the response body - displayThrowable(e); - } - } - } - } - - @Override - public void onFailure(Call call, Throwable t) { - Log.i("Failed to get meeting url", t.getLocalizedMessage().toString()); - Snackbar.make(mRootView, "Failed: Could not get a meeting url", Snackbar.LENGTH_LONG) - .setAction("Action", null).show(); - mCallDoctorButton.show(); - - - } - }); - -``` - -### Get a Discovery Uri and token - -The following example creates an HTTP request body and then uses a helper interface created with the **Retrofit 2** library to make the RESTful call into the service application. - -```java - String body = String.format( - "ApplicationSessionId=%s&AllowedOrigins=%s&MeetingUrl=%s" - ,UUID.randomUUID() - ,"http%3A%2F%2Fsdksamplesucap.azurewebsites.net%2F" - ,meetingUri); - RequestBody bridgeRequest = RequestBody.create( - MediaType.parse("text/plain, */*; q=0.01"), - body); - - Call callforBridge = apiInterface.getAnonymousToken( - bridgeRequest); - callforBridge.enqueue(new Callback() { - @SuppressLint("LongLogTag") - @Override - public void onResponse(Call call, final Response response) { - Log.i("Succeeded in starting chat bridge", ""); - - runOnUiThread(new Runnable() { - @Override - public void run() { - Intent callIntent = new Intent(getApplicationContext(), SkypeCall.class); - Bundle meetingParameters = new Bundle(); - meetingParameters.putShort(getString(R.string.onlineMeetingFlag), (short) 1); - meetingParameters.putString(getString(R.string.discoveryUrl), response.body().DiscoverUri); - meetingParameters.putString(getString(R.string.authToken), response.body().Token); - meetingParameters.putString(getString(R.string.onPremiseMeetingUrl),""); - callIntent.putExtras(meetingParameters); - startActivity(callIntent); - - } - }); - - } - - @Override - public void onFailure(Call call, Throwable t) { - Log.i("failed token get", t.getLocalizedMessage().toString()); - Snackbar.make(mRootView, "Authentication token was not returned", Snackbar.LENGTH_LONG) - .setAction("Action", null).show(); - - } - }); - -``` - -### Join the new adhoc meeting - -The following code runs in the newly created **SkypeCall** activity. It calls **joinMeetingAnonymously**, gets an **AnonymousSession**, and then the **Conversation** that -represents the adhoc meeting. - ->[!NOTE] ->The sample code shows the use of the new **setEndUserAcceptedVideoLicense** api. This API must be called before a user can join video in a meeting. Once the api has been called, the user is considered in acceptance of the third party video codec license that we use to support video. It is necessary that your app presents the terms of this license to the user before a meeting is started. Subsequent meetings do not require the license acceptance. - -### Show video codec license - -```java - /** - * Shows a video license acceptance dialog if user has not been prompted before. If user - * accepts license, call is started. Else, SkypeCallActivity is finished. - * @param onlineMeetingFlag - * @param discoveryUrl - * @param authToken - * @param meetingUrl - * @return - */ - private boolean checkVideoLicenseAcceptance( - final Short onlineMeetingFlag - , final String discoveryUrl - , final String authToken - , final String meetingUrl) { - mApplication = Application.getInstance(this.getBaseContext()); - - - final Boolean canJoinCall = true; - SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); - - if (!sharedPreferences.getBoolean(getString(R.string.acceptedVideoLicense),false)) { - AlertDialog.Builder alertDialogBuidler = new AlertDialog.Builder(this); - alertDialogBuidler.setTitle("Video License"); - alertDialogBuidler.setMessage(getString(R.string.videoCodecTerms)); - alertDialogBuidler.setPositiveButton("Accept", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - mApplication.getConfigurationManager().setEndUserAcceptedVideoLicense(); - setLicenseAcceptance(true); - joinTheCall(onlineMeetingFlag,meetingUrl,discoveryUrl,authToken); - - } - }); - alertDialogBuidler.setNegativeButton("Decline", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - setLicenseAcceptance(false); - finish(); - - } - }); - alertDialogBuidler.show(); - - } else { - joinTheCall(onlineMeetingFlag,meetingUrl,discoveryUrl,authToken); - } - - return canJoinCall; - } - - /** - * Writes the user's acceptance or rejection of the video license - * presented in the alert dialog - * @param userChoice Boolean, the user's license acceptance choice - */ - private void setLicenseAcceptance(Boolean userChoice){ - SharedPreferences sharedPreferences = PreferenceManager - .getDefaultSharedPreferences(this); - sharedPreferences.edit() - .putBoolean( - getString( - R.string.acceptedVideoLicense) - ,userChoice).apply(); - sharedPreferences.edit() - .putBoolean( - getString( - R.string.promptedForLicense) - ,true).apply(); - - - } - - -``` - -### Join the meeting - -The following code snippet sets configurable parameters for Skype for Business calls and then joins the anonymous meeting. - -```java - /** - * Connect to an existing Skype for Business meeting with the URI you get - * from a server-side UCWA-based web service. - */ - private void joinTheCall( - Short onlineMeetingFlag - , String meetingUrl - , String discoveryUrl - , String authToken){ - try { - - //Set meeting configuration parameters - setMeetingConfiguration(); - - mAnonymousSession = mApplication - .joinMeetingAnonymously( - getString(R.string.userDisplayName) - , new URL(discoveryUrl) - , authToken); - mConversation = mAnonymousSession.getConversation(); - if (mConversation != null) - mConversation.addOnPropertyChangedCallback(new ConversationPropertyChangeListener()); - - - } catch (URISyntaxException ex) { - ex.printStackTrace(); - Log.e("SkypeCall", "On premise meeting uri syntax error"); - } catch (SFBException e) { - e.printStackTrace(); - Log.e("SkypeCall", "exception on start to join meeting"); - } catch (MalformedURLException e) { - Log.e("SkypeCall", "Online meeting url syntax error"); - e.printStackTrace(); - } - } - - /** - * Set up AV call configuration parameters from user preferences - */ - private void setMeetingConfiguration(){ - mApplication.getConfigurationManager().enablePreviewFeatures( - PreferenceManager - .getDefaultSharedPreferences(this) - .getBoolean(getString(R.string.enablePreviewFeatures), false)); - - mApplication.getConfigurationManager().setRequireWiFiForAudio( - PreferenceManager - .getDefaultSharedPreferences(this) - .getBoolean(getString(R.string.requireWifiForAudio), false)); - - mApplication.getConfigurationManager().setRequireWiFiForVideo( - PreferenceManager - .getDefaultSharedPreferences(this) - .getBoolean(getString(R.string.requireWifiForVideo), false)); - - mApplication.getConfigurationManager().setMaxVideoChannelCount( - Long.parseLong(PreferenceManager - .getDefaultSharedPreferences(this) - .getString(getString(R.string.maxVideoChannels), "5"))); - - } - - -``` - -### Retrofit helper interface - -This example creates a constructor, login interceptor method, and interface to the service application REST api. The logging interceptor method injects HTTP headers into RESTful requests -made by the mobile sample. - -```java -/* - * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. - * See LICENSE in the project root for license information. - */ -package com.microsoft.office.sfb.healthcare; -import android.annotation.SuppressLint; -import android.content.Context; -import android.util.Log; - -import java.io.IOException; - -import okhttp3.Interceptor; -import okhttp3.Request; -import okhttp3.RequestBody; -import okhttp3.Response; -import okhttp3.logging.HttpLoggingInterceptor; -import retrofit2.Call; -import retrofit2.Retrofit; -import retrofit2.converter.gson.GsonConverterFactory; -import retrofit2.http.Body; -import retrofit2.http.POST; - - -public class RESTUtility { - - private SaasAPIInterface saaSAPIInterface; - private String mBaseUrl; - private okhttp3.OkHttpClient mOkClient; - private Context mContext; - - public RESTUtility(Context context, String baseUrl){ - mContext = context; - mBaseUrl = baseUrl ; - } - - @SuppressLint("LongLogTag") - private void buildLoggingInterceptor(){ - try { - HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(); - httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); - mOkClient = new okhttp3.OkHttpClient - .Builder() - .addInterceptor(new LoggingInterceptor()) - .addInterceptor(httpLoggingInterceptor) - .build(); - - } catch (Exception e) { - Log.e( - "exception in RESTUtility: ", - e.getLocalizedMessage().toString() ); - } - - } - @SuppressLint("LongLogTag") - public SaasAPIInterface getSaaSClient() { - if (saaSAPIInterface == null) { - - try { - - if (mOkClient == null) { - buildLoggingInterceptor(); - } - - Retrofit SaaSClient = new Retrofit.Builder() - .baseUrl(mBaseUrl) - .client(mOkClient) - .addConverterFactory(GsonConverterFactory.create()) - .build(); - saaSAPIInterface = SaaSClient.create(SaasAPIInterface.class); - - } catch (Exception e){ - Log.e( - "exception in RESTUtility: ", - e.getLocalizedMessage().toString() ); - } - } - return saaSAPIInterface; - } - - - public interface SaasAPIInterface { - - - - @POST("/GetAnonTokenJob") - Call getAnonymousToken( - @Body RequestBody body - ); - - @POST("/GetAdhocMeetingJob") - Call getAdhocMeeting( - @Body RequestBody body); - - } - - class LoggingInterceptor implements Interceptor { - - @Override - public Response intercept(Chain chain) throws IOException { - - - Request request = chain.request(); - request = request.newBuilder() - - .addHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8") - .addHeader("Accept","text/plain, */*; q=0.01") - .addHeader("Referer","https://sdksamplesucap.azurewebsites.net/") - .addHeader("Accept-Language","en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3") - .addHeader("Origin","https://sdksamplesucap.azurewebsites.net") - .addHeader("Accept-Encoding","gzip, deflate") - .addHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko") - .addHeader("Host",mContext.getString(R.string.SaasHostName)) - .addHeader("Content-Length", - String.valueOf( - chain.request() - .body() - .contentLength())) - .addHeader("Connection","Keep-Alive") - .addHeader("Cache-Control","no-cache") - .method(request.method(),request.body()) - .build(); - - - Response response = chain.proceed(request); - return response; - } - } - -} - -``` - -#### The video license terms - -Please read the [Video license terms](videoLicense.md) and include the text in your app. diff --git a/Skype/AppSDK/HowToJoinOnlineMeeting_iOS.md b/Skype/AppSDK/HowToJoinOnlineMeeting_iOS.md deleted file mode 100644 index e94d40b4d..000000000 --- a/Skype/AppSDK/HowToJoinOnlineMeeting_iOS.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Use the App SDK and the Trusted Application API to join an Online meeting - iOS -description: This article shows you how to enable the core Skype for Business Online anonymous meeting join scenario in your iOS app. -ms.date: 03/30/2022 ---- - -# Use the App SDK and the Trusted Application API to join an Online meeting - iOS - -This article shows you how to enable the core **Skype for Business Online** anonymous meeting join scenario in your iOS app. Android developers should read [Use the App SDK and the Trusted Application API to join an Online meeting - Android](HowToJoinOnlineMeeting_Android.md). - -If the anonymous meeting your app joins is hosted in a **Skype for Business Online** service and your app is **not** enabled for Skype for Business preview features, then your app must get a **discovery Url** and an **anonymous meeting token** to join. This workflow requires that you create and deploy a Trused Application API-based service application that creates ad-hoc meetings, provides meeting join Urls, discovery Uris, and anonymous meeting tokens to the mobile apps that request them. - ->[!NOTE] ->**For mobile apps that enabled preview features:** If the anonymous meeting your app joins is hosted in a **Skype for Business Online** service and your app is enabled for Skype for Business preview features, then your app can use a meeting Url to join. A Trusted Application API service application is **not** needed to complete the scenario in this case. To learn how to use a meeting Url, read [Use the App SDK to join a meeting with an iOS device](HowToJoinMeeting_iOS.md) - -## Create and deploy a Trusted Application API-based service Application - -The service application you create will give your mobile app access to the needed anonymous meeting join resources - discovery Url and anonymous meeting token. You'll use the RESTful Trusted Application API endpoint to schedule a meeting, get the discovery Url and token. The rest of this article describes how to enable your iOS app to call into such a service application. You can read more about the [Trusted Appplication API](../Trusted-Application-API/docs/ rusted_Application_API_GeneralReference.md) to learn about all of the features of this Skype for Business service application api. - -We've published two service application [examples](https://github.com/OfficeDev/skype-docs/tree/main/Skype/Trusted-Application-API/samples) in GitHub to get you started. - -## Add anonymous online meeting code to your mobile app - -Please read [Implementing a Anonymous Client with the Skype App SDK - iOS.](/skype-sdk/trusted-application-api/docs/implementinganonymousclientwithskypeappsdk_ios) for the sample code. The sample code is taken from our GitHub [Banking app sample](https://github.com/OfficeDev/skype-ios-app-sdk-samples). The example code steps include: - -- Call into a service application sample to get a join Url for a new ad-hoc meeting that is created by the service application -- Use the join url to get an anonymous meeting token and a discovery Uri from the service application -- Call the **joinMeetingAnonymously** method, passing the two resources from the previous step. -- Show use of new Skype App SDK **setEndUserAcceptedVideoLicense** api that is required to proceed with features that potentially use video codecs. -- Get a **Conversation** object from the asynchronously returned **AnonymousSession** object. diff --git a/Skype/AppSDK/Orientation.md b/Skype/AppSDK/Orientation.md deleted file mode 100644 index 88e23972a..000000000 --- a/Skype/AppSDK/Orientation.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Skype for Business App SDK - Orientation -description: Describes the Skype for Business App SDK and provides the API Overview, Platform considerations, and Versioning resources. ---- -# Skype for Business App SDK - Orientation - -To get more familiar with the **Skype for Business App SDK** and equip yourself to build powerful communication features into your mobile app, read the following sections: - -- [API Overview](APIoverview.md) -- [Platform considerations](PlatformConsiderations.md) -- [Versioning](Versioning.md) diff --git a/Skype/AppSDK/PlatformConsiderations.md b/Skype/AppSDK/PlatformConsiderations.md deleted file mode 100644 index 85356fff5..000000000 --- a/Skype/AppSDK/PlatformConsiderations.md +++ /dev/null @@ -1,119 +0,0 @@ ---- -title: Platform considerations -description: Learn about concurrency, supported OS and hardware versions, error handling, API patterns, and more for Android and iOS platforms. -ms.date: 03/30/2022 ---- - -# Platform considerations - -## iOS considerations - -### Concurrency - -All of the SDK’s interfaces must be used only from the application main thread (main run loop). Notifications are delivered in the same thread as well. As a result, no synchronization around the SDK’s interfaces is required. The SDK, however, may create threads for internal purposes. - -### Supported OS and hardware versions - -The SDK works on iOS 9 and above, and on any iOS hardware model running these OS versions. Like all current iOS apps, it must be built using XCode7. The SDK is provided as an Objective C framework. It can be used transparently from Swift code by using a standard interoperability layer. - -### API patterns - -#### Error handling - -Certain methods may fail. They follow the standard Objective C convention: the return value, which is either a BOOL or object pointer, shows the success (YES or non-nil) or failure (NO or nil). The last parameter is an optional pointer to NSError * where the error instance is stored. This plays well with Swift where errors are translated into Swift exceptions. Neither Objective C nor C++ exceptions are thrown in case of I/O errors. SFBError.h header declares the Skype for Business specific structure of userInfo. - -#### Properties and KVO - -The properties of many objects change dynamically due to network events or other external activity. Those changes are propagated by using the standard KVO mechanism provided by NSObject. - -#### Collections - -Collection properties are NSArray’s of some type. They also implement KVO and notifications are sent whenever objects are added or removed from that collection. - -> [!NOTE] -> To listen to these notifications you add an observer to the parent object and not to the NSArray property itself. - -Some collections are “lazy”. They don’t hold fully initialized contents all the time. Instead when you get an item from such a collection, it transparently gets created (if not cached). You should avoid keeping references to collections’ items unless a corresponding UI view is visible. - -#### Conditional methods - -Some methods may be unavailable at certain times and their availability is changed dynamically. Those methods have a BOOL property named like can<DoSomething> logically attached to them. This property is KVO-enabled. You can observe it to monitor a method’s availability. You can always call a method directly without looking at corresponding property, but if so, you should be prepared to receive an error if the method is disabled. - -### Audio configuration - -DevicesManager audio interfaces are reduced on iOS. When headphones or a headset is connected, microphone and speaker are implicitly rerouted. The only configurable option is the speaker endpoint, which can be switched between loudspeaker (which is the phone’s own loudspeaker no matter what devices are connected) and non-loudspeaker (which is an external device or the phone’s internal speaker). - -### Local data - -The SDK stores some data in local files. Most of the data are not preserved across successive anonymous sessions. Still, some sensitive data, like chat messages, may be cached while session is running or until the next session is initiated. SDK uses the `NSFileProtectionCompleteUntilFirstUserAuthentication` flag on its files to ensure iOS encrypts them on disk. Note that files within backup images or copies made by application itself will not be protected. - -## Android considerations - -All of the SDK’s interfaces must be used only from the application main thread (main run loop). Notifications are delivered in the same thread as well. As a result, no synchronization around the SDK’s interfaces is required. The SDK, however, may create threads for internal purposes. - -### Android versions - -The SDK is currently supported on following versions. - -|Version|Number| -|:-----|:-----| -|MIN_SDK_VERSION|17 (JELLY_BEAN)| -|TARGET_SDK_VERSION|22 (L)| - -The Public Preview App SDK supports armeabi-v7a processors only. You cannot use the SDK on devices with an x86 CPU architecture. You should run any apps in development on a physical Android device. For the Public Preview, emulators are not supported. - -### Concurrency - Android - -All of the SDK’s interfaces must be used only from the application main thread (main run loop). Notifications are delivered in the same thread as well. As a result, no synchronization around the SDK’s interfaces is required. The SDK, however, may create threads for internal purposes. - -### API patterns - Android - -#### Error handling - Android - -Methods provided in the SDK follow the standard Java conventions: return result where specified or throw checked exception of type **SFBException**. The **SFBException** class provides the underlying error code that caused the exception. A complete list of error codes will be published (see **ErrorCode** enum). - -Developers are expected to handle these exceptions and provide the necessary localized error strings where appropriate. - -#### Observable properties - -Some of the interfaces provided expose properties. These properties are observable. Clients can register for callbacks when the property changes. They can do so by providing an implementation of the **Observable.OnPropertyChanged** class, as shown below. -For example, Conversation State is exposed as a property and represented by STATE\_PROPERTY_ID in the Conversation interface. - -```java -// Client implements a property change handler for the conversation object. E.g. -class ConversationPropertyChangeHandler extends Observable.OnPropertyChangedCallback -{ - public void onPropertyChanged(Observable observable, int propId) { - switch(propId) { - // Handle property change - case Conversation.STATE_PROPERTY_ID: - // Get the new state - conversationState = conversation.getState() - break; - } -} - -// Join the meeting and register for events -Conversation conversation = application.getOrCreateConversationByUri(URI); -conversation.addOnPropertyChangedCallback (conversationPropertyChangeHandlerInstance); -``` - -#### Observable collections - -Similar to properties, the collections provided are observable. These collections implement the **ObservableList** interface. Clients can register for callbacks when the collections changes. The can do so by providing an implementation of **ObservableList.OnListChangedCallback** class. - -For example, the collection of participants provided by the **Conversation** is Observable. - -#### Conditional methods - -Some of the operations or actions provided by the interfaces may not be available at all times. For these operations, we expose corresponding can<doSomeThing> methods. For example, the ChatService exposes a **canSendMessage(**) method that should be called before calling the **sendMessage()** method. - -These methods are Observable properties so that clients can listen for state changes, using the technique described previously. For example, the property ID for **canSendMessage()** is **ChatService.CAN_SEND_MESSAGE_PROPERTY_ID**. - -#### Data binding - -The Observable properties and collections intentionally have very similar interfaces to [the Android platform's new data binding support](https://developer.android.com/tools/data-binding/guide.html). Subsequent versions of the SDK may transition to these official Android interfaces. - -### Local data - -The SDK stores some data in local files. SDK encrypts its main data file with a key stored in the system credentials store. Log files are not encrypted. No sensitive information is printed to log. diff --git a/Skype/AppSDK/ReleaseNotes.md b/Skype/AppSDK/ReleaseNotes.md deleted file mode 100644 index dc97b3f88..000000000 --- a/Skype/AppSDK/ReleaseNotes.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: 'Release Notes' -description: 'Skype for Business App SDK General Availability - Release Notes' -ms.date: 03/30/2022 ---- - -# Release Notes - -Skype for Business App SDK General Availability - Release Notes - -- Mute State - The local participants mute state and API to change the it are exposed on the AudioService. -- Meeting join API - The joinMeetingAnonymously API in the Application class is overloaded in this release to support future capabilities that will be available for Skype for Business Online. -- Android SDK - The binaries for Android SDK have been renamed. -- Bug fixes - -## Server/Services Prerequisites: - -- Skype for Business App SDK release candidate will require [Skype for Business Server 2015 Cumulative Update 4 – November 2016 Release](https://www.microsoft.com/download/details.aspx?id=47690) -- Skype for Business App SDK release candidate can be used with Skype for Business Online with the Trusted Application API without enablepreviewfeatures enabled. -- Skype for Business App SDK release candidate can be used with Skype for Business Online with the enablepreviewfeatures flag enabled(true) for development and testing only with this update. - -## Skype for Business App SDK Licenses - -- [Terms of Service](TermsOfService.md) – This document provides the Skype for Business App SDK Release License -- [SfB App SDK Codec End User License Terms](videoLicense.md) – This document provides the license terms that must be presented to the end user before receiving or initializing video call. - -## Download SDK - -We provide native libraries for the Android and iOS mobile platforms. The [Download SDK packages](Download.md) article gives you links to the mobile platforms that we support. An SDK package includes the native libraries, supporting help files, - and licensing agreements. diff --git a/Skype/AppSDK/Samples.md b/Skype/AppSDK/Samples.md deleted file mode 100644 index f259a681f..000000000 --- a/Skype/AppSDK/Samples.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Sample applications for the Skype for Business App SDK -description: Describes the presence of sample Skype for Business App SDKs in GitHub repositories and provides links to iOS and Android samples. ---- -# Sample applications for the Skype for Business App SDK - -There are **Skype for Business App SDK** samples in our **GitHub** repositories for you to clone or download: - -- [iOS samples](https://github.com/OfficeDev/skype-ios-app-sdk-samples) -- [Android samples](https://github.com/OfficeDev/skype-android-app-sdk-samples) diff --git a/Skype/AppSDK/Skype for Business App SDK EULA (RTM) 12-16-16 FINAL.mht b/Skype/AppSDK/Skype for Business App SDK EULA (RTM) 12-16-16 FINAL.mht deleted file mode 100644 index 349ce1456..000000000 --- a/Skype/AppSDK/Skype for Business App SDK EULA (RTM) 12-16-16 FINAL.mht +++ /dev/null @@ -1,5848 +0,0 @@ -MIME-Version: 1.0 -Content-Type: multipart/related; boundary="----=_NextPart_01D2579E.BBDB5AD0" - -This document is a Single File Web Page, also known as a Web Archive file. If you are seeing this message, your browser or editor doesn't support Web Archive files. Please download a browser that supports Web Archive, such as Windows� Internet Explorer�. - -------=_NextPart_01D2579E.BBDB5AD0 -Content-Location: file:///C:/CE85C06C/SkypeforBusinessAppSDKEULA(RTM)12-16-16FINAL.htm -Content-Transfer-Encoding: quoted-printable -Content-Type: text/html; charset="us-ascii" - - - - - - - - - -English - - - - - - - - - - - - - - - - -
- -

MICROSOFT SOFTWARE LICENSE TERMS

- -
- -

MICROSOFT = -SKYPE -FOR BUSINESS APP SDK

- -
- -

The= -se -license terms are an agreement between you and Microsoft Corporation (or on= -e of -its affiliates). They apply to the software named above and any Microsoft -services or software updates (except to the extent such services or updates= - are -accompanied by new or additional terms, in which case those different terms -apply prospectively and do not alter your or Microsoft’s rights relat= -ing -to pre-updated software or services). IF YOU COMPLY WITH THESE LICENSE TERM= -S, -YOU HAVE THE RIGHTS BELOW. BY USING THE SOFTWARE, YOU ACCEPT THESE TERMS.

- -
- -

IF YOU COMP= -LY WITH -THESE LICENSE TERMS, YOU HAVE THE PERPETUAL RIGHTS BELOW.

- -
- -

1.    <= -/span>INSTALLATION AND USE RIGHTS. <= -/h1> - -

a.&n= -bsp;   -Inst= -allation -and Use. You may install and use any number of copies of= - the -software on your devices to design, develop and test your applications that -communicate only with Microsoft Skype for Business Server or Skype for Busi= -ness -Online in order to communicate with validly licensed Skype for Business use= -rs.

- -

b.    <= -/span>Third Party Programs. The -software may include third party programs that Microsoft, not the third par= -ty, -licenses to you under this agreement. Notices, if any, for the third party -program are included for your information only.

- -

2.    <= -/span>ADDITIONAL LICENSING REQUIREMENTS AND/OR USE RIG= -HTS.

- -

a.    <= -/span>H.264 -AVC Video License Required. The Distributable Code uses H.264 AVC video, wh= -ich -requires that you obtain a distribution license from MPEG LA (go to http://www.mpegla.com to obtain such license).  You must not distribute any applica= -tion -that includes Distributable Code and is capable of rendering local or remote -video until you obtain this video license.= -  -You must indemnify, defend, and hold harmless Microsoft from any cla= -ims, -including attorneys’ fees, that arise due to the failure to obtain th= -e MPEG -LA license as required above.

- -

b.    <= -/span>Distributable Code. The -software contains code that you are permitted to distribute in applications= - you -develop if you comply with the terms below.

- -

i.   &n= -bsp;  -Right to Us= -e and -Distribute. The code and text files listed below are “= -Distributable -Code.”

- -

= -·       -Library Code. You may copy and distribute the object code form= - of -all library code.

- -

= -·       -Hel= -per Code. You may copy, -distribute and modify the source code that is clearly labelled as -“helper” code.

- -

= -·       -UI assets.  You may copy and distribute the in= -cluded -images and sounds as part of your application, so long as you use them to -create a user interface for communications that precisely follows the stand= -ard -Skype look-and-feel in accordance with guidelines provided by Microsoft.

- -

ii.    = - Sample Code. You may modify, copy, and distribute the source = -and -object code form of code marked as “sample.”<= -/p> - -

iii.   Third Party Distribution.

- -

= -·       -You may per= -mit -distributors of your applications to copy and distribute the Distributable = -Code -as part of those applications.

- -

iv.   Distribution Requirements. -For any Distributable Code you distribute, you must

- -

= -·       -add signifi= -cant -primary functionality to it in your applications;

- -

= -·       -acknowledge= - the -use of ‘Skype’ or ‘Skype for Business’ technology in -those parts of your user interface that offer communications enabled by this -SDK

- -

= -·       -require -distributors and external end users to agree to terms that protect it and -Microsoft at least as much as this agreement;

- -

= -·       -display your -valid copyright notice on your applications; and

- -

= -·       -indemnify, -defend, and hold harmless Microsoft from any claims, including attorneys= -217; -fees, related to the distribution or use of your applications.

- -

<= -span -style=3D'font-size:10.0pt'> 

- -

v.    <= -/span>Distribution Restrictions. -You may not

- -

= -·       -alter any -copyright, trademark or patent notice in the Distributable Code;= -

- -

= -·       -use -Microsoft’s trademarks or trade dress in your applications in a way t= -hat -suggests your applications come from or are endorsed by Microsoft (except as -specifically required in 2(b)(iv));

- -

= -·       -include -Distributable Code in malicious, deceptive or unlawful applications; or

- -

= -·       -modify or -distribute the source code of any Distributable Code so that any part of it -becomes subject to an Excluded License. An Excluded License is one that -requires, as a condition of use, modification or distribution, that

- -

= -·      = -  -the code be -disclosed or distributed in source code form; or

- -

= -·      = -  -others have= - the -right to modify it.

- -

c.   &n= -bsp; Preview Features Must be Disabled.  As a con= -dition -to the licenses granted herein, you must have the API for Prev= -iew -Features (“enablePreviewFeatures”) = -set to -the default of “false” (disabled) to use this general availabil= -ity -version of the Skype for Business App SDK.

- -

3.    <= -/span>FEEDBACK. If you give feedback about the -software to Microsoft, you give to Microsoft, without charge, the right to = -use, -share and commercialize your feedback in any way and for any purpose. You w= -ill -not give feedback that is subject to a license that requires Microsoft to -license its software or documentation to third parties because Microsoft -includes your feedback in them. These rights survive this agreement.

- -

4.    <= -/span>DATA. The software may collect information about you and your use of the -software and send that to Microsoft. Microsoft may use this information to -provide services and improve Microsoft’s products and services. Your -opt-out rights, if any, are described in the product documentation. Some -features in the software may enable collection of data from users of your -applications that access or use the software. If you use these features to -enable data collection in your applications, you must comply with applicabl= -e law, -including getting any required user consent, and maintain a prominent priva= -cy -policy that accurately informs users about how you use, collect, and share -their data. You can learn more about Microsoft’s data collection and = -use -in the help documentation and the Microsoft Skype for Business Privacy Statement at -http://go.microsoft.com/fwlink/?LinkID=3D517480<= -/span> -(“Privacy Statement”). You agree to comply with all applicable provisions of the Privacy= - Statement.

- -

5.    <= -/span>SCOPE OF LICENSE. The software is licensed, not sold. This -agreement only gives you some rights to use the software. Microsoft reserves -all other rights. Unless applicable law gives you more rights despite this -limitation, you may use the software only as expressly permitted in this -agreement. In doing so, you must comply with any technical limitations in t= -he -software that only allow you to use it in certain ways. For more informat= -ion, -see www.microsoft.com/licensing/userights.You may not

- -

·      = -  -work around any technical limitations in the software;

- -

·      = -  -reverse engineer, decompile or disassemble the software, or attempt= - to -do so, except and only to the extent required by third party licensing term= -s governing -use of certain open source components that may be included with the softwar= -e;

- -

·      = -  -remove, minimize, block or modify any notices of Microsoft or its -suppliers;

- -

·      = -  -use the software in any way that is against the law; or<= -/span>

- -

·      = -  -share, publish, rent or lease the software, or provide the software= - as -a stand-alone hosted as solution for others to use.

- -

6.    <= -/span>DOCUMENTATION. Any person that has valid acc= -ess -to your computer or internal network may copy and use the documentation for -your internal, reference purposes.

- -

7.    -EXPORT RESTRICTIONS. You -must comply with all domestic and international export laws and regulations -that apply to the software, which include restrictions on destinations, end -users and end use.  For further -information on export restrictions, visit (aka.ms/exporting).<= -/h1> - -

8.    <= -/span>SUPPORT SERVICES. Because this software is -“as is,” we may not provide support services for it.

- -

9.    <= -/span>TERMINATION. Without prejudice to any other -rights, Microsoft may terminate this agreement if you fail to comply with a= -ny -of its terms or conditions. In such event, you must destroy all copies of t= -he -software and all of its component parts.

- -

10. ENTIRE AGREEMENT. This agreement, and the terms= - for -supplements, updates, Internet-based services and support services that you -use, are the entire agreement for the software and support services.= -

- -

11. APPLICABLE LAW.= -  -If you acquired the software in the United States, Washington law app= -lies -to interpretation of and claims for breach of this agreement, and the laws = -of -the state where you live apply to all other claims. If you acquired the -software in any other country, its laws apply.

- -

12. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describ= -es -certain legal rights. You may have other rights, including consumer rights, -under the laws of your state or country. Separate and apart from your -relationship with Microsoft, you may also have rights with respect to the p= -arty -from which you acquired the software. This agreement does not change those -other rights if the laws of your state or country do not permit it to do so. -For example, if you acquired the software in one of the below regions, or -mandatory country law applies, then the following provisions apply to you:<= -o:p>

- -

a.    Australia. You have statutory guarantees under the Australi= -an -Consumer Law and nothing in this agreement is intended to affect those righ= -ts.

- -

b.    Canada. If you acquired this software in Canada, you may -stop receiving updates by turning off the automatic update feature, -disconnecting your device from the Internet (if and when you re-connect to = -the -Internet, however, the software will resume checking for and installing -updates), or uninstalling the software. The product documentation, if any, = -may -also specify how to turn off updates for your specific device or software.<= -o:p>

- -

c.     Germany and Austria.

- -

(i)        Warranty. The properly licensed s= -oftware -will perform substantially as described in any Microsoft materials that -accompany the software. However, Microsoft gives no contractual guarantee in -relation to the licensed software.

- -

(ii)  &nbs= -p;    Limitation of Liability. In case = -of -intentional conduct, gross negligence, claims based on the Product Liability -Act, as well as, in case of death or personal or physical injury, Microsoft= - is -liable according to the statutory law.

- -

Subject to the foregoi= -ng -clause (ii), Microsoft will only be liable for slight negligence if Microso= -ft -is in breach of such material contractual obligations, the fulfillment of w= -hich -facilitate the due performance of this agreement, the breach of which would -endanger the purpose of this agreement and the compliance with which a part= -y may -constantly trust in (so-called "cardinal obligations"). In other -cases of slight negligence, Microsoft will not be liable for slight neglige= -nce.

- -

13. LEGAL EFFECT. This agreement -describes certain legal rights. You may have other rights under the laws of -your country. You may also have rights with respect to the party from whom = -you -acquired the software. This agreement does not change your rights under the -laws of your country if the laws of your country do not permit it to do so.= -

- -

14. DISCLAIMER OF WAR= -RANTY. -THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. -MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXT= -ENT -PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES = -OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.

- -

15. LIMITATION ON AND -EXCLUSION OF DAMAGES. YOU CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY -DIRECT DAMAGES UP TO U.S. $5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, -INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMA= -GES.

- -

= -This limitation a= -pplies -to (a) anything related to the software, services, content (including code)= - on -third party Internet sites, or third party applications; and (b) claims for -breach of contract, breach of warranty, guarantee or condition, strict -liability, negligence, or other tort to the extent permitted by applicable = -law.

- -

= -It also applies e= -ven if -Microsoft knew or should have known about the possibility of the damages. T= -he -above limitation or exclusion may not apply to you because your country may= - not -allow the exclusion or limitation of incidental, consequential or other -damages.

- -

16.<= -span -style=3D'font:7.0pt "Times New Roman"'> H.264/AVC and VC-1 video standards. <= -span -style=3D'mso-bookmark:OLE_LINK92'>The software may include H.264/AVC and/or VC-1 -decoding technology.    MPEG LA, L.L.C. require= -s this -notice:= -<= -span -style=3D'font-size:10.0pt;mso-fareast-font-family:SimSun;font-weight:normal; -mso-bidi-font-weight:bold'>

- -

<= -span -style=3D'mso-bookmark:OLE_LINK92'>THIS SOFTWARE IS LICENSED UNDER THE AVC AND THE = -VC-1 -PATENT PORTFOLIO LICENSES FOR THE PERSONAL AND NON-COMMERCIAL USE OF A CONS= -UMER -TO (i) ENCODE VIDEO IN COMPLIANCE WITH THE ABOVE -STANDARDS (“VIDEO STANDARDS”) OR (ii) DECODE AVC AND VC-1 VIDEO -THAT WAS ENCODED BY A CONSUMER ENGAGED IN A PERSONAL AND NON-COMMERCIAL -ACTIVITY OR WAS OBTAINED FROM A VIDEO PROVIDER LICENSED TO PROVIDE SUCH VID= -EO. -NO LICENSE IS GRANTED OR SHALL BE IMPLIED FOR ANY OTHER USE. ADDITIONAL -INFORMATION MAY BE OBTAINED FROM MPEG LA, L.L.C. SEE HTTP://WWW.MPEGLA.COM.= -

- -

 

- -

 = -

- -

- - - - - -------=_NextPart_01D2579E.BBDB5AD0 -Content-Location: file:///C:/CE85C06C/SkypeforBusinessAppSDKEULA(RTM)12-16-16FINAL_files/item0001.xml -Content-Transfer-Encoding: quoted-printable -Content-Type: text/xml - - -------=_NextPart_01D2579E.BBDB5AD0 -Content-Location: file:///C:/CE85C06C/SkypeforBusinessAppSDKEULA(RTM)12-16-16FINAL_files/props002.xml -Content-Transfer-Encoding: quoted-printable -Content-Type: text/xml - - - -------=_NextPart_01D2579E.BBDB5AD0 -Content-Location: file:///C:/CE85C06C/SkypeforBusinessAppSDKEULA(RTM)12-16-16FINAL_files/item0003.xml -Content-Transfer-Encoding: quoted-printable -Content-Type: text/xml - -2015-MAINB-000700false.txtEnglish0x60EAD08499A47E6B927BAB32B56D81DC615EE6C9DF= -DB219A4559241A998090279CC7DD3FFDC6DC399961FE0F08FA9320EA589A11D8BD04027A2A2= -887130E12A0,08 Jan 2016 22:20:37 -0000B2F45EF5= -/wEWAgKO29ip= -CALb4IumDL+uCp29ypbNqczmR0I7gANRBNg32015= --MAINB-000700false= -falseFree, Standalone SoftwareSkype for Business App S= -DKAny number of= - copiesNonefalseRetailOnly to design, develop and test the user= -'s programsfalsetru= -etruefalsefalsefalsetruefalse<= -Value>falsetruetruetrueSk= -ype for BusinesstrueLink to a privacy statement[placeholder]Automatic = -UpdatesSample CodeREDMOND\tracydofalsedisabled4ddc7652-c30e-426e-b057-29ee68937= -21bUSE= -TERMS_MAINB201208162015-MAINB-00070011151123467123467 -------=_NextPart_01D2579E.BBDB5AD0 -Content-Location: file:///C:/CE85C06C/SkypeforBusinessAppSDKEULA(RTM)12-16-16FINAL_files/props004.xml -Content-Transfer-Encoding: quoted-printable -Content-Type: text/xml - - - -------=_NextPart_01D2579E.BBDB5AD0 -Content-Location: file:///C:/CE85C06C/SkypeforBusinessAppSDKEULA(RTM)12-16-16FINAL_files/item0005.xml -Content-Transfer-Encoding: quoted-printable -Content-Type: text/xml - -DocumentLibraryFormD= -ocumentLibraryFormDocumentLibraryForm -------=_NextPart_01D2579E.BBDB5AD0 -Content-Location: file:///C:/CE85C06C/SkypeforBusinessAppSDKEULA(RTM)12-16-16FINAL_files/props006.xml -Content-Transfer-Encoding: quoted-printable -Content-Type: text/xml - - - -------=_NextPart_01D2579E.BBDB5AD0 -Content-Location: file:///C:/CE85C06C/SkypeforBusinessAppSDKEULA(RTM)12-16-16FINAL_files/item0007.xml -Content-Transfer-Encoding: quoted-printable -Content-Type: text/xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - This value indicates the number of saves or revisio= -ns. The application is responsible for updating this value after each revis= -ion. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -------=_NextPart_01D2579E.BBDB5AD0 -Content-Location: file:///C:/CE85C06C/SkypeforBusinessAppSDKEULA(RTM)12-16-16FINAL_files/props008.xml -Content-Transfer-Encoding: quoted-printable -Content-Type: text/xml - - - -------=_NextPart_01D2579E.BBDB5AD0 -Content-Location: file:///C:/CE85C06C/SkypeforBusinessAppSDKEULA(RTM)12-16-16FINAL_files/item0009.xml -Content-Transfer-Encoding: quoted-printable -Content-Type: text/xml - - -------=_NextPart_01D2579E.BBDB5AD0 -Content-Location: file:///C:/CE85C06C/SkypeforBusinessAppSDKEULA(RTM)12-16-16FINAL_files/props010.xml -Content-Transfer-Encoding: quoted-printable -Content-Type: text/xml - - - -------=_NextPart_01D2579E.BBDB5AD0 -Content-Location: file:///C:/CE85C06C/SkypeforBusinessAppSDKEULA(RTM)12-16-16FINAL_files/item0011.xml -Content-Transfer-Encoding: quoted-printable -Content-Type: text/xml - - -------=_NextPart_01D2579E.BBDB5AD0 -Content-Location: file:///C:/CE85C06C/SkypeforBusinessAppSDKEULA(RTM)12-16-16FINAL_files/props012.xml -Content-Transfer-Encoding: quoted-printable -Content-Type: text/xml - - - -------=_NextPart_01D2579E.BBDB5AD0 -Content-Location: file:///C:/CE85C06C/SkypeforBusinessAppSDKEULA(RTM)12-16-16FINAL_files/themedata.thmx -Content-Transfer-Encoding: base64 -Content-Type: application/vnd.ms-officetheme - -UEsDBBQABgAIAAAAIQDp3g+//wAAABwCAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbKyRy07DMBBF -90j8g+UtSpyyQAgl6YLHjseifMDImSQWydiyp1X790zSVEKoIBZsLNkz954743K9Hwe1w5icp0qv -8kIrJOsbR12l3zdP2a1WiYEaGDxhpQ+Y9Lq+vCg3h4BJiZpSpXvmcGdMsj2OkHIfkKTS+jgCyzV2 -JoD9gA7NdVHcGOuJkTjjyUPX5QO2sB1YPe7l+Zgk4pC0uj82TqxKQwiDs8CS1Oyo+UbJFkIuyrkn -9S6kK4mhzVnCVPkZsOheZTXRNajeIPILjBLDsAyJX89nIBkt5r87nons29ZZbLzdjrKOfDZezE7B -/xRg9T/oE9PMf1t/AgAA//8DAFBLAwQUAAYACAAAACEApdan58AAAAA2AQAACwAAAF9yZWxzLy5y -ZWxzhI/PasMwDIfvhb2D0X1R0sMYJXYvpZBDL6N9AOEof2giG9sb69tPxwYKuwiEpO/3qT3+rov5 -4ZTnIBaaqgbD4kM/y2jhdj2/f4LJhaSnJQhbeHCGo3vbtV+8UNGjPM0xG6VItjCVEg+I2U+8Uq5C -ZNHJENJKRds0YiR/p5FxX9cfmJ4Z4DZM0/UWUtc3YK6PqMn/s8MwzJ5PwX+vLOVFBG43lExp5GKh -qC/jU72QqGWq1B7Qtbj51v0BAAD//wMAUEsDBBQABgAIAAAAIQBreZYWgwAAAIoAAAAcAAAAdGhl -bWUvdGhlbWUvdGhlbWVNYW5hZ2VyLnhtbAzMTQrDIBBA4X2hd5DZN2O7KEVissuuu/YAQ5waQceg -0p/b1+XjgzfO3xTVm0sNWSycBw2KZc0uiLfwfCynG6jaSBzFLGzhxxXm6XgYybSNE99JyHNRfSPV -kIWttd0g1rUr1SHvLN1euSRqPYtHV+jT9yniResrJgoCOP0BAAD//wMAUEsDBBQABgAIAAAAIQCW -ta3ilgYAAFAbAAAWAAAAdGhlbWUvdGhlbWUvdGhlbWUxLnhtbOxZT2/bNhS/D9h3IHRvYyd2Ggd1 -itixmy1NG8Ruhx5piZbYUKJA0kl9G9rjgAHDumGHFdhth2FbgRbYpfs02TpsHdCvsEdSksVYXpI2 -2IqtPiQS+eP7/x4fqavX7scMHRIhKU/aXv1yzUMk8XlAk7Dt3R72L615SCqcBJjxhLS9KZHetY33 -37uK11VEYoJgfSLXcduLlErXl5akD8NYXuYpSWBuzEWMFbyKcCkQ+AjoxmxpuVZbXYoxTTyU4BjI -3hqPqU/QUJP0NnLiPQaviZJ6wGdioEkTZ4XBBgd1jZBT2WUCHWLW9oBPwI+G5L7yEMNSwUTbq5mf -t7RxdQmvZ4uYWrC2tK5vftm6bEFwsGx4inBUMK33G60rWwV9A2BqHtfr9bq9ekHPALDvg6ZWljLN -Rn+t3slplkD2cZ52t9asNVx8if7KnMytTqfTbGWyWKIGZB8bc/i12mpjc9nBG5DFN+fwjc5mt7vq -4A3I4lfn8P0rrdWGizegiNHkYA6tHdrvZ9QLyJiz7Ur4GsDXahl8hoJoKKJLsxjzRC2KtRjf46IP -AA1kWNEEqWlKxtiHKO7ieCQo1gzwOsGlGTvky7khzQtJX9BUtb0PUwwZMaP36vn3r54/RccPnh0/ -+On44cPjBz9aQs6qbZyE5VUvv/3sz8cfoz+efvPy0RfVeFnG//rDJ7/8/Hk1ENJnJs6LL5/89uzJ -i68+/f27RxXwTYFHZfiQxkSim+QI7fMYFDNWcSUnI3G+FcMI0/KKzSSUOMGaSwX9nooc9M0pZpl3 -HDk6xLXgHQHlowp4fXLPEXgQiYmiFZx3otgB7nLOOlxUWmFH8yqZeThJwmrmYlLG7WN8WMW7ixPH -v71JCnUzD0tH8W5EHDH3GE4UDklCFNJz/ICQCu3uUurYdZf6gks+VuguRR1MK00ypCMnmmaLtmkM -fplW6Qz+dmyzewd1OKvSeoscukjICswqhB8S5pjxOp4oHFeRHOKYlQ1+A6uoSsjBVPhlXE8q8HRI -GEe9gEhZteaWAH1LTt/BULEq3b7LprGLFIoeVNG8gTkvI7f4QTfCcVqFHdAkKmM/kAcQohjtcVUF -3+Vuhuh38ANOFrr7DiWOu0+vBrdp6Ig0CxA9MxHal1CqnQoc0+TvyjGjUI9tDFxcOYYC+OLrxxWR -9bYW4k3Yk6oyYftE+V2EO1l0u1wE9O2vuVt4kuwRCPP5jeddyX1Xcr3/fMldlM9nLbSz2gplV/cN -tik2LXK8sEMeU8YGasrIDWmaZAn7RNCHQb3OnA5JcWJKI3jM6rqDCwU2a5Dg6iOqokGEU2iw654m -EsqMdChRyiUc7MxwJW2NhyZd2WNhUx8YbD2QWO3ywA6v6OH8XFCQMbtNaA6fOaMVTeCszFauZERB -7ddhVtdCnZlb3YhmSp3DrVAZfDivGgwW1oQGBEHbAlZehfO5Zg0HE8xIoO1u997cLcYLF+kiGeGA -ZD7Ses/7qG6clMeKuQmA2KnwkT7knWK1EreWJvsG3M7ipDK7xgJ2uffexEt5BM+8pPP2RDqypJyc -LEFHba/VXG56yMdp2xvDmRYe4xS8LnXPh1kIF0O+EjbsT01mk+Uzb7ZyxdwkqMM1hbX7nMJOHUiF -VFtYRjY0zFQWAizRnKz8y00w60UpYCP9NaRYWYNg+NekADu6riXjMfFV2dmlEW07+5qVUj5RRAyi -4AiN2ETsY3C/DlXQJ6ASriZMRdAvcI+mrW2m3OKcJV359srg7DhmaYSzcqtTNM9kCzd5XMhg3kri -gW6Vshvlzq+KSfkLUqUcxv8zVfR+AjcFK4H2gA/XuAIjna9tjwsVcahCaUT9voDGwdQOiBa4i4Vp -CCq4TDb/BTnU/23OWRomreHAp/ZpiASF/UhFgpA9KEsm+k4hVs/2LkuSZYRMRJXElakVe0QOCRvq -Griq93YPRRDqpppkZcDgTsaf+55l0CjUTU4535waUuy9Ngf+6c7HJjMo5dZh09Dk9i9ErNhV7Xqz -PN97y4roiVmb1cizApiVtoJWlvavKcI5t1pbseY0Xm7mwoEX5zWGwaIhSuG+B+k/sP9R4TP7ZUJv -qEO+D7UVwYcGTQzCBqL6km08kC6QdnAEjZMdtMGkSVnTZq2Ttlq+WV9wp1vwPWFsLdlZ/H1OYxfN -mcvOycWLNHZmYcfWdmyhqcGzJ1MUhsb5QcY4xnzSKn914qN74OgtuN+fMCVNMME3JYGh9RyYPIDk -txzN0o2/AAAA//8DAFBLAwQUAAYACAAAACEADdGQn7YAAAAbAQAAJwAAAHRoZW1lL3RoZW1lL19y -ZWxzL3RoZW1lTWFuYWdlci54bWwucmVsc4SPTQrCMBSE94J3CG9v07oQkSbdiNCt1AOE5DUNNj8k -UeztDa4sCC6HYb6ZabuXnckTYzLeMWiqGgg66ZVxmsFtuOyOQFIWTonZO2SwYIKObzftFWeRSyhN -JiRSKC4xmHIOJ0qTnNCKVPmArjijj1bkIqOmQci70Ej3dX2g8ZsBfMUkvWIQe9UAGZZQmv+z/Tga -iWcvHxZd/lFBc9mFBSiixszgI5uqTATKW7q6xN8AAAD//wMAUEsBAi0AFAAGAAgAAAAhAOneD7// -AAAAHAIAABMAAAAAAAAAAAAAAAAAAAAAAFtDb250ZW50X1R5cGVzXS54bWxQSwECLQAUAAYACAAA -ACEApdan58AAAAA2AQAACwAAAAAAAAAAAAAAAAAwAQAAX3JlbHMvLnJlbHNQSwECLQAUAAYACAAA -ACEAa3mWFoMAAACKAAAAHAAAAAAAAAAAAAAAAAAZAgAAdGhlbWUvdGhlbWUvdGhlbWVNYW5hZ2Vy -LnhtbFBLAQItABQABgAIAAAAIQCWta3ilgYAAFAbAAAWAAAAAAAAAAAAAAAAANYCAAB0aGVtZS90 -aGVtZS90aGVtZTEueG1sUEsBAi0AFAAGAAgAAAAhAA3RkJ+2AAAAGwEAACcAAAAAAAAAAAAAAAAA -oAkAAHRoZW1lL3RoZW1lL19yZWxzL3RoZW1lTWFuYWdlci54bWwucmVsc1BLBQYAAAAABQAFAF0B -AACbCgAAAAA= - -------=_NextPart_01D2579E.BBDB5AD0 -Content-Location: file:///C:/CE85C06C/SkypeforBusinessAppSDKEULA(RTM)12-16-16FINAL_files/colorschememapping.xml -Content-Transfer-Encoding: quoted-printable -Content-Type: text/xml - - - -------=_NextPart_01D2579E.BBDB5AD0 -Content-Location: file:///C:/CE85C06C/SkypeforBusinessAppSDKEULA(RTM)12-16-16FINAL_files/header.htm -Content-Transfer-Encoding: quoted-printable -Content-Type: text/html; charset="us-ascii" - - - - - - - - - - - - - - - - -
- -

- -


- -

- -
- -
- -

- -


- -

- -
- -
- -

- -


- -

- -
- -
- -

- -


- -

- -
- -
- -

 

- - -

 

-
- -
- -

 

- - -

 

-
- -
- -

 

- - -

 

-
- - - - - -------=_NextPart_01D2579E.BBDB5AD0 -Content-Location: file:///C:/CE85C06C/SkypeforBusinessAppSDKEULA(RTM)12-16-16FINAL_files/filelist.xml -Content-Transfer-Encoding: quoted-printable -Content-Type: text/xml; charset="utf-8" - - - - - - - - - - - - - - - - - - - - -------=_NextPart_01D2579E.BBDB5AD0-- diff --git a/Skype/AppSDK/SkypeAppSDK.md b/Skype/AppSDK/SkypeAppSDK.md index 63f4ce203..6c3fc25e4 100644 --- a/Skype/AppSDK/SkypeAppSDK.md +++ b/Skype/AppSDK/SkypeAppSDK.md @@ -1,33 +1,16 @@ --- -title: Skype for Business App SDK (elementText) +title: Skype for Business App SDK description: Introduction to the Skype for Business App SDK -ms.date: 03/28/2022 +ms.date: 07/03/2024 --- # Skype for Business App SDK - **Last modified:** March 29. 2022 + **Last modified:** July 3, 2024 -The Skype for Business App SDK enables developers to seamlessly integrate messaging, audio, and video experiences into mobile and tablet applications. The focus of this SDK is “remote advisor” solutions that enable consumer iOS and Android apps to embed communications from external guests to users within a Skype for Business organization. To achieve this, the SDK uses the “guest meeting join” capability that is available both for Skype for Business Online and for Skype for Business Server. - -The Skype App SDK documentation consists of the following sections: - -- [Overview: Embed Skype business-to-consumer communications in your mobile app](EmbedSkypeB2Ccomms.md) -- [Getting started](GettingStarted.md) -- [App SDK orientation](Orientation.md) -- [Download the App SDK](Download.md) -- [App SDK samples](Samples.md) -- [App SDK library reference - Android](https://aka.ms/sfbAppSDKRef_Android) -- [App SDK library reference - iOS](https://aka.ms/sfbAppSDKRef_iOS) -- [Submit your questions, bugs, feature requests, and contributions](Feedback.md) - -## Licensing - -Please carefully read the license terms that are included in the SDK download. By using the SDK, you accept the license terms. +The Skype for Business App SDK has been retired and is not available for download and use. Instead, we recommend [Azure Communication Services](/azure/communication-services/concepts/sdk-options), where we will continue to invest our development resources. ## Migrating to Azure Communication Services -[Skype for Business (SfB) Online retired in July 2021](https://techcommunity.microsoft.com/t5/microsoft-teams-blog/skype-for-business-online-to-be-retired-in-2021/ba-p/777833). The Skype for Business App SDK will continue to function for on-premise Skype for Business Server 2019 deployments, but the retirement of SfB Online reduced the market of addressable communication deployments for the SfB App SDK, and many SfB organizations are migrating to Teams. Teams Meetings cannot be joined by the SfB Mobile SDK. - Azure Communication Services is a cloud-based communications service that lets you add voice, video, chat, and telephony to your apps. ACS applications have the ability to join Teams meetings (as a guest), and we encourage implementers of the SfB App SDK to transition to Azure Communication Services. The ability to [join Teams meetings as a guest using ACS](/azure/communication-services/concepts/join-teams-meeting) is now available. ### Azure SDKs that join Teams meetings diff --git a/Skype/AppSDK/TermsOfService.md b/Skype/AppSDK/TermsOfService.md deleted file mode 100644 index 334093753..000000000 --- a/Skype/AppSDK/TermsOfService.md +++ /dev/null @@ -1,107 +0,0 @@ ---- -title: Terms of service App SDK -description: Describes and provides the software license terms of service before downloading the App SDK for Android and iOS. ---- -# Terms of service - -You must read and accept the following software license terms before downloading the App SDK for Android or iOS. - -## MICROSOFT SOFTWARE LICENSE TERMS - -## MICROSOFT SKYPE FOR BUSINESS APP SDK - ---- -These license terms are an agreement between you and Microsoft Corporation (or one of its affiliates). They apply to the software named above and any Microsoft services or software updates (except to the extent such services or updates are accompanied by new or additional terms, in which case those different terms apply prospectively and do not alter your or Microsoft’s rights relating to pre-updated software or services). IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE RIGHTS BELOW. BY USING THE SOFTWARE, YOU ACCEPT THESE TERMS. - ---- - -## **IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE PERPETUAL RIGHTS BELOW.** - -1. **INSTALLATION AND USE RIGHTS.** - - a. **Installation and Use.** You may install and use any number of copies of the software on your devices to design, develop and test your applications that communicate only with Microsoft Skype for Business Server or Skype for Business Online in order to communicate with validly licensed Skype for Business users. - - b. **Third Party Programs.** The software may include third party programs that Microsoft, not the third party, licenses to you under this agreement. Notices, if any, for the third party program are included for your information only. - -1. **ADDITIONAL LICENSING REQUIREMENTS AND/OR USE RIGHTS.** - - a. **H.264 AVC Video License Required. The Distributable Code uses H.264 AVC video, which requires that you obtain a distribution license from MPEG LA (go to http://www.mpegla.com to obtain such license). You must not distribute any application that includes Distributable Code and is capable of rendering local or remote video until you obtain this video license. You must indemnify, defend, and hold harmless Microsoft from any claims, including attorneys’ fees, that arise due to the failure to obtain the MPEG LA license as required above.** - - b. **Distributable Code.** The software contains code that you are permitted to distribute in applications you develop if you comply with the terms below. - - i. **Right to Use and Distribute.** The code and text files listed below are “Distributable Code.” - - - **Library Code.** You may copy and distribute the object code form of all library code. - - **Helper Code.** You may copy, distribute and modify the source code that is clearly labelled as “helper” code. - - **Sample Code.** You may modify, copy, and distribute the source and object code form of code marked as “sample.” - - ii. **Third Party Distribution.** - - - You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. - - iii. **Distribution Requirements. For any Distributable Code you distribute, you must** - - - add significant primary functionality to it in your applications - - acknowledge the use of ‘Skype’ or ‘Skype for Business’ technology in those parts of your user interface that offer communications enabled by this SDK - - require distributors and external end users to agree to terms that protect it and Microsoft at least as much as this agreement - - display your valid copyright notice on your applications; and - - indemnify, defend, and hold harmless Microsoft from any claims, including attorneys’ fees, related to the distribution or use of your applications. - - iv. **Distribution Restrictions. You may not** - - - alter any copyright, trademark or patent notice in the Distributable Code; - - use Microsoft’s trademarks or trade dress in your applications in a way that suggests your applications come from or are endorsed by Microsoft (except as specifically required in 2(b)(iv)); - - include Distributable Code in malicious, deceptive or unlawful applications; or - - modify or distribute the source code of any Distributable Code so that any part of it becomes subject to an Excluded License. An Excluded License is one that requires, as a condition of use, modification or distribution, that - - the code be disclosed or distributed in source code form; or - - others have the right to modify it. - - c. **Preview Features Must be Disabled.** As a condition to the licenses granted herein, you must have the API for Preview Features (“enablePreviewFeatures”) set to the default of “false” (disabled) to use this general availability version of the Skype for Business App SDK. - -1. **FEEDBACK.** If you give feedback about the software to Microsoft, you give to Microsoft, without charge, the right to use, share and commercialize your feedback in any way and for any purpose. You will not give feedback that is subject to a license that requires Microsoft to license its software or documentation to third parties because Microsoft includes your feedback in them. These rights survive this agreement. - -1. **DATA.** The software may collect information about you and your use of the software and send that to Microsoft. Microsoft may use this information to provide services and improve Microsoft’s products and services. Your opt-out rights, if any, are described in the product documentation. Some features in the software may enable collection of data from users of your applications that access or use the software. If you use these features to enable data collection in your applications, you must comply with applicable law, including getting any required user consent, and maintain a prominent privacy policy that accurately informs users about how you use, collect, and share their data. You can learn more about Microsoft’s data collection and use in the help documentation and the Microsoft Skype for Business Privacy Statement at [“Privacy Statement”](https://go.microsoft.com/fwlink/?LinkID=517480). You agree to comply with all applicable provisions of the Privacy Statement. - -1. **SCOPE OF LICENSE.** The software is licensed, not sold. This agreement only gives you some rights to use the software. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not - - - work around any technical limitations in the software; - - reverse engineer, decompile or disassemble the software, or attempt to do so, except and only to the extent required by third party licensing terms governing use of certain open source components that may be included with the software; - - remove, minimize, block or modify any notices of Microsoft or its suppliers; - - use the software in any way that is against the law; or - - share, publish, rent or lease the software, or provide the software as a stand-alone hosted as solution for others to use. - -1. **DOCUMENTATION.** Any person that has valid access to your computer or internal network may copy and use the documentation for your internal, reference purposes. - -1. **EXPORT RESTRICTIONS.** You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users and end use. For further information on export restrictions, visit (aka.ms/exporting). - -1. **ENTIRE AGREEMENT.** This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. - -1. **APPLICABLE LAW.** If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. - -1. **CONSUMER RIGHTS; REGIONAL VARIATIONS.** This agreement describes certain legal rights. You may have other rights, including consumer rights, under the laws of your state or country. Separate and apart from your relationship with Microsoft, you may also have rights with respect to the party from which you acquired the software. This agreement does not change those other rights if the laws of your state or country do not permit it to do so. For example, if you acquired the software in one of the below regions, or mandatory country law applies, then the following provisions apply to you: - - a. **Australia.** You have statutory guarantees under the Australian Consumer Law and nothing in this agreement is intended to affect those rights. - - b. **Canada.** If you acquired this software in Canada, you may stop receiving updates by turning off the automatic update feature, disconnecting your device from the Internet (if and when you re-connect to the Internet, however, the software will resume checking for and installing updates), or uninstalling the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. - - c. **Germany and Austria.** - - (i) **Warranty.** The properly licensed software will perform substantially as described in any Microsoft materials that accompany the software. However, Microsoft gives no contractual guarantee in relation to the licensed software. - - (ii) Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as, in case of death or personal or physical injury, Microsoft is liable according to the statutory law. - - Subject to the foregoing clause (ii), Microsoft will only be liable for slight negligence if Microsoft is in breach of such material contractual obligations, the fulfillment of which facilitate the due performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence. - -1. **LEGAL EFFECT.** This agreement describes certain legal rights. You may have other rights under the laws of your country. You may also have rights with respect to the party from whom you acquired the software. This agreement does not change your rights under the laws of your country if the laws of your country do not permit it to do so. - -1. **DISCLAIMER OF WARRANTY.** **THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.** - -1. **LIMITATION ON AND EXCLUSION OF DAMAGES. YOU CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES.** - - **This limitation applies to (a) anything related to the software, services, content (including code) on third party Internet sites, or third party applications; and (b) claims for breach of contract, breach of warranty, guarantee or condition, strict liability, negligence, or other tort to the extent permitted by applicable law.** - - **It also applies even if Microsoft knew or should have known about the possibility of the damages. The above limitation or exclusion may not apply to you because your country may not allow the exclusion or limitation of incidental, consequential or other damages.** - -16. **H.264/AVC and VC-1 video standards.** The software may include H.264/AVC and/or VC-1 decoding technology. MPEG LA, L.L.C. requires this notice: - - THIS SOFTWARE IS LICENSED UNDER THE AVC AND THE VC-1 PATENT PORTFOLIO LICENSES FOR THE PERSONAL AND NON-COMMERCIAL USE OF A CONSUMER TO (i) ENCODE VIDEO IN COMPLIANCE WITH THE ABOVE STANDARDS (“VIDEO STANDARDS”) OR (ii) DECODE AVC AND VC-1 VIDEO THAT WAS ENCODED BY A CONSUMER ENGAGED IN A PERSONAL AND NON-COMMERCIAL ACTIVITY OR WAS OBTAINED FROM A VIDEO PROVIDER LICENSED TO PROVIDE SUCH VIDEO. NO LICENSE IS GRANTED OR SHALL BE IMPLIED FOR ANY OTHER USE. ADDITIONAL INFORMATION MAY BE OBTAINED FROM MPEG LA, L.L.C. SEE HTTP://WWW.MPEGLA.COM. \ No newline at end of file diff --git a/Skype/AppSDK/Versioning.md b/Skype/AppSDK/Versioning.md deleted file mode 100644 index 1ddfa1836..000000000 --- a/Skype/AppSDK/Versioning.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: Versioning and staying up to date -description: The SDK will be updated frequently with new capabilities. Once the SDK is generally available, we’ll make every effort to ensure API back-compatibility with previous versions. ---- - -# Versioning and staying up to date - -We anticipate that the SDK will be updated frequently with new capabilities. - -* Once the SDK is generally available, we’ll make every effort to ensure API back-compatibility with previous versions. We will communicate any breaking changes clearly. -* To allow the SDK to move forward quickly, our guidance is to update to the latest SDK at your earliest convenience. Where an app is based on a version of the SDK that is older than six months, then you may need to update it so that: - * We can investigate an issue report - * It continues to work against Skype for Business Online or the latest Skype for Business Server CU; such occurrences should be rare and will be communicated with good notice. -* Fixes to bugs will typically be delivered only in new versions of the SDK and **not back-ported** to previous versions. diff --git a/Skype/AppSDK/VideoLicense_Android.md b/Skype/AppSDK/VideoLicense_Android.md deleted file mode 100644 index d58916969..000000000 --- a/Skype/AppSDK/VideoLicense_Android.md +++ /dev/null @@ -1,81 +0,0 @@ ---- -title: Video license acceptance dialog Android -description: Video license acceptance dialog for Android ---- - -# Video license acceptance dialog -```java - /** - * Shows a video license acceptance dialog if user has not been prompted before. If user - * accepts license, call is started. Else, SkypeCallActivity is finished. - * @param onlineMeetingFlag - * @param discoveryUrl - * @param authToken - * @param meetingUrl - * @return - */ - private boolean checkVideoLicenseAcceptance( - final Short onlineMeetingFlag - , final String discoveryUrl - , final String authToken - , final String meetingUrl) { - mApplication = Application.getInstance(this.getBaseContext()); - - - final Boolean canJoinCall = true; - SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); - - if (!sharedPreferences.getBoolean(getString(R.string.acceptedVideoLicense),false)) { - AlertDialog.Builder alertDialogBuidler = new AlertDialog.Builder(this); - alertDialogBuidler.setTitle("Video License"); - alertDialogBuidler.setMessage(getString(R.string.videoCodecTerms)); - alertDialogBuidler.setPositiveButton("Accept", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - mApplication.getConfigurationManager().setEndUserAcceptedVideoLicense(); - setLicenseAcceptance(true); - joinTheCall(onlineMeetingFlag,meetingUrl,discoveryUrl,authToken); - - } - }); - alertDialogBuidler.setNegativeButton("Decline", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - setLicenseAcceptance(false); - finish(); - - } - }); - alertDialogBuidler.show(); - - } else { - joinTheCall(onlineMeetingFlag,meetingUrl,discoveryUrl,authToken); - } - - return canJoinCall; - } - - /** - * Writes the user's acceptance or rejection of the video license - * presented in the alert dialog - * @param userChoice Boolean, the user's license acceptance choice - */ - private void setLicenseAcceptance(Boolean userChoice){ - SharedPreferences sharedPreferences = PreferenceManager - .getDefaultSharedPreferences(this); - sharedPreferences.edit() - .putBoolean( - getString( - R.string.acceptedVideoLicense) - ,userChoice).apply(); - sharedPreferences.edit() - .putBoolean( - getString( - R.string.promptedForLicense) - ,true).apply(); - - - } - - -``` diff --git a/Skype/AppSDK/VideoLicense_iOS.md b/Skype/AppSDK/VideoLicense_iOS.md deleted file mode 100644 index 642f299e7..000000000 --- a/Skype/AppSDK/VideoLicense_iOS.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: Video license acceptance code -description: Video license acceptance code ---- - -# Video license acceptance code - -**Swift** - -```Swift - /** - * Shows a video license acceptance dialog if user has not been prompted before. If user - * accepts license, call is started. Else, user cannot start Audio/Video call. - */ - - let sfb: SfBApplication = SfBApplication.sharedApplication() - let config: SfBConfigurationManager = sfb.configurationManager - let key = "AcceptedVideoLicense" - let defaults = NSUserDefaults.standardUserDefaults() - - if defaults.boolForKey(key) { - /** - * Notify that user has accepted the Video license. - * - * This is required to proceed with features that potentially use video codecs. - * Until this method is called, any attempt to use those features will fail. - */ - config.setEndUserAcceptedVideoLicense() - self.performSegueWithIdentifier("joinOnlineAudioVideoChat", sender: nil) - - } else { - - /** Show video license acceptance view. - * MicrosoftLicenseViewController is class that shows video license - * and stores user's acceptance or rejection of the video license - **/ - - let vc = self.storyboard?.instantiateViewControllerWithIdentifier("MicrosoftLicenseViewController") as! MicrosoftLicenseViewController - vc.delegate = self - self.presentViewController(vc, animated: true, completion: nil) - } - - /** - * Writes the user's acceptance or rejection of the video license - **/ - - let key = "AcceptedVideoLicense" - let defaults = NSUserDefaults.standardUserDefaults() - defaults.setBool(true, forKey: key) - let sfb: SfBApplication = SfBApplication.sharedApplication() - let config: SfBConfigurationManager = sfb.configurationManager - config.setEndUserAcceptedVideoLicense() - self.performSegueWithIdentifier("joinOnlineAudioVideoChat", sender: nil) - - -``` diff --git a/Skype/AppSDK/index.md b/Skype/AppSDK/index.md deleted file mode 100644 index 0f7f0a81a..000000000 --- a/Skype/AppSDK/index.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Skype for Business App SDK -description: Find in-depth developer resources, how-to documentation, SDKs and references, and code samples for the Skype developer platform verticals. -ms.date: 03/30/2020 ---- - -# Skype for Business App SDK (elementText) - -The new Skype Developer Platform provides opportunities to customize and extend the capabilities not only with Skype for Business but also through Skype. Developers don't have to think anymore in "silos" for business and allows for more consumer customization opportunities. Find in-depth developer resources, how-to documentation, SDKs and references, and code samples for Skype developer platform verticals. diff --git a/Skype/AppSDK/readme.md b/Skype/AppSDK/readme.md deleted file mode 100644 index 02828455a..000000000 --- a/Skype/AppSDK/readme.md +++ /dev/null @@ -1,57 +0,0 @@ -# README - -This documentation is hosted at http://aka.ms/skypeappsdk. Please read it there. - -If you're interested in contributing to this documentation, then please read on. - -## Ways to contribute - -You can contribute to **Skype App SDK developer documentation** in a few different ways: - -* Contribute to articles via the [public Skype SDK developer docs repo](https://github.com/OfficeDev/skype-docs)* -* Report documentation bugs via [GitHub Issues](https://github.com/OfficeDev/office-content/issues) -* Add documentation requests to the [Office/SharePoint developer UserVoice](http://officespdev.uservoice.com) - -> [!NOTE] -> We're only taking documentation contributions from authors within Microsoft presently. We will open the repository for the Skype App SDK Conceptual content to non-microsoft contributors soon. - -## Repository organization - -The content in the Skype-docs repository is grouped by topic. The README.md file at the root of the topic directory specifies the structure of the articles within the topic. - -## Articles in this repository -### Skype App SDK - -- [Skype App SDK Conceptual Content](https://github.com/OfficeDev/skype-docs/blob/master/UCWeb_16Con.md) - -## FAQ - -### How do I get a GitHub account? - -Fill out the form at [Join GitHub](https://github.com/join) to open a free GitHub account. - -### Where do I get a Contributor's License Agreement? - -You will automatically be sent a notice that you need to sign the Contributor's License Agreement (CLA) if your pull request requires one. - -As a community member, **you must sign the Contribution License Agreement (CLA) before you can contribute large submissions to this project**. You only need complete and submit the documentation once. Carefully review the document. You may be required to have your employer sign the document. - -### What happens with my contributions? - -When you submit your changes, via a pull request, our team will be notified and will review your pull request. You will receive notifications about your pull request from GitHub; you may also be notified by someone from our team if we need more information. If your pull request is approved, we'll update the documentation. We reserve the right to edit your submission for legal, style, clarity, or other issues. - -### Can I become an approver for this repository's GitHub pull requests? - -Currently, we are not allowing external contributors to approve pull requests in this repository. - -### How soon will I get a response about my change request? - -Pull requests are typically reviewed within 10 business days. - -## Guidance for contributors -For more guidance on contributing to Office developer documentation, see [CONTRIBUTING.md](https://github.com/OfficeDev/skype-docs/blob/master/CONTRIBUTING.md) in this repo. - -## Copyright -Copyright (c) 2016 Microsoft Corporation. All rights reserved. - - diff --git a/Skype/AppSDK/videoLicense.md b/Skype/AppSDK/videoLicense.md deleted file mode 100644 index 5fdaf9102..000000000 --- a/Skype/AppSDK/videoLicense.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: Video codec license terms -description: Describes and provides the video codec license terms that must be agreed upon before installation of the Skype for Business App SDK. ---- -# Video codec license terms - -You must show the following licencing language exactly as it is reproduced here. The App SDK download package contains the video codec license as the **Skype for Business App SDK Codec End User License Terms.pdf** file: - -**MICROSOFT SOFTWARE LICENSE TERMS** -**SOFTWARE FOR VIDEO CONFERENCING IN MOBILE APPLICATIONS POWERED BY SKYPE FOR BUSINESS** - -These license terms are an agreement between you and Microsoft Corporation (or one of its affiliates). They apply to the software named above and any Microsoft services or software updates (except to the extent such services or updates are accompanied by new or additional terms, in which case those different terms apply prospectively and do not alter your or Microsoft’s rights relating to pre-updated software or services). IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE RIGHTS BELOW. -1. INSTALLATION AND USE RIGHTS. - - a)  General. You may run copies of the software on your devices solely with versions of software applications that communicate with validly licensed Microsoft Skype for Business Server or Skype for Business Online. - - b)  Third Party Applications. The software may include third party applications that Microsoft, not the third party, licenses to you under this agreement. Any included notices for third party applications are for your information only. -2. SCOPE OF LICENSE. The software is licensed, not sold. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you will not (and have no right to): - - a)  work around any technical limitations in the software that only allow you to use it in certain ways; - - b)  reverse engineer, decompile or disassemble the software; - - c)  remove, minimize, block, or modify any notices of Microsoft or its suppliers in the software; - - d)  use the software in any way that is against the law or to create or propagate malware; or - - e)  share, publish, or lend the software (except for any distributable code, subject to the applicable terms above), provide the software as a stand-alone hosted solution for others to use, or transfer the software or this agreement to any third party. -3. EXPORT RESTRICTIONS. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information on export restrictions, visit (aka.ms/exporting). -4. SUPPORT SERVICES. Microsoft is not obligated under this agreement to provide any support services for the software. Any support provided is “as is”, “with all faults”, and without warranty of any kind. -5. ENTIRE AGREEMENT. This agreement, and any other terms Microsoft may provide for supplements, updates, or third-party applications, is the entire agreement for the software. -6. APPLICABLE LAW. If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. -7. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You may have other rights, including consumer rights, under the laws of your state or country. Separate and apart from your relationship with Microsoft, you may also have rights with respect to the party from which you acquired the software. This agreement does not change those other rights if the laws of your state or country do not permit it to do so. For example, if you acquired the software in one of the below regions, or mandatory country law applies, then the following provisions apply to you: - - a)  Australia. You have statutory guarantees under the Australian Consumer Law and nothing in this agreement is intended to affect those rights. - - b)  Canada. If you acquired this software in Canada, you may stop receiving updates by turning off the automatic update feature, disconnecting your device from the Internet (if and when you re-connect to the Internet, however, the software will resume checking for and installing updates), or uninstalling diff --git a/Skype/Trusted-Application-API/docs/AnonymousMeetingJoin.md b/Skype/Trusted-Application-API/docs/AnonymousMeetingJoin.md index 07b1bcdc3..945bba145 100644 --- a/Skype/Trusted-Application-API/docs/AnonymousMeetingJoin.md +++ b/Skype/Trusted-Application-API/docs/AnonymousMeetingJoin.md @@ -5,15 +5,11 @@ description: Anonymous meeting join is a powerful feature of the Skype Developer # Anonymous Meeting Join -Anonymous meeting join is a powerful feature of the Skype Developer Platform that enables you to join guest users into Skype Meetings to deliver "remote advisor" and other Business-to-Consumer solutions. For Skype for Business Online, anonymous meeting join is supported through the **Trusted Application API**. The guest join meeting flow for anonymous meetings can use the **Trusted Application API** plus the client-side features of either the Skype Web SDK, App SDK, or UCWA. +Anonymous meeting join is a powerful feature of the Skype Developer Platform that enables you to join guest users into Skype Meetings to deliver "remote advisor" and other Business-to-Consumer solutions. For Skype for Business Online, anonymous meeting join is supported through the **Trusted Application API**. The guest join meeting flow for anonymous meetings can use the **Trusted Application API** plus the client-side features of UCWA. The anonymous user can join into Skype meetings by using a meeting's URI. An online meeting can be scheduled using the Skype for Business Client or Outlook, or even programmatically using UCWA or the **Trusted Application API**. The meeting's URL is passed to the service application, which calls the Trusted Application endpoint and enables anonymous users to join the online meeting. -You'll need to use a **Trusted Application API**-enabled service application to get the Discover Url and anonymous meeting token. Your mobile app will call the service application to get these resources before joining a meeting. To learn more about this, see: - -- [Use the App SDK and the Trusted Application API to join an Online meeting - Android](../../AppSDK/HowToJoinOnlineMeeting_Android.md) -- [Use the App SDK and the Trusted Application API to join an Online meeting - iOS](../../AppSDK/HowToJoinOnlineMeeting_iOS.md) -- [Implementing a Anonymous Client with the Skype Web SDK](ImplementingAnonymousClientWithSkypeWebSDK.md) +You'll need to use a **Trusted Application API**-enabled service application to get the Discover Url and anonymous meeting token. Your mobile app will call the service application to get these resources before joining a meeting. ## Prerequisites diff --git a/Skype/WebSDK/docs/APIProductKeys.md b/Skype/WebSDK/docs/APIProductKeys.md deleted file mode 100644 index b75b82b45..000000000 --- a/Skype/WebSDK/docs/APIProductKeys.md +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: Skype Web SDK Production Use Capabilities -description: Describes Skype Web SDK production use capabilities and provides lists of product keys, features, and supported browsers and server versions. ---- -# Skype Web SDK Production Use Capabilities - - - _**Applies to:** Skype for Business, Skype for Business Online_ - - -This section lists the API product keys and the supported capabilities that are available for your production use application. With each successive release of the Skype Web SDK, additional features are supported. Use the support matrix table in this article to find the appropriate product key to use for the features you implement in your app. - -## Product keys - - -|Release|Product keys| -|:-----|:-----| -|Public Preview (PP)|API Key: 'a42fcebd-5b43-4b89-a065-74450fb91255'
UI Key: '9c967f6b-a846-4df2-b43d-5167e47d81e1' | -|General Availability (GA)|API Key: '595a1aeb-e6dc-4e5b-be96-bb38adc83da1'
UI Key: '08c97289-7d57-404f-bd97-a6047403e370'| - - - - -## Feature support matrix - - -The following table is a mapping of Features to the API version that they are supported in. - -|Feature|Public Preview|General Availability| -|:-----|:-----|:-----| -|Sign in, Sign out. |X |X| -|View Signed in user’s information. |X|X| -|Update Note and Presence for the signed in user. |X|X| -|View the contact list of the signed in users. |X|X| -|Search for persons or groups. |X|X| -|Add/remove/Rename groups in the contact list. |X|X| -|Add/remove distribution groups in the contact list. |X|X| -|Add/remove contacts to groups in the contact list. |X|X| -|Add/remove telephone contacts to groups in the contact list. |X|X| -|Start and have P2P chat conversations as a signed in user with another signed in Skype or Skype for business user via Skype Web SDK API (outgoing invitations). |X|X| -|Accept and have P2P chat conversations as a signed in user with another signed in Skype or Skype for business user via Skype Web SDK API. (incoming invitations). |X|X| -|Start and have meeting chat conversations as a signed in user via Skype Web SDK API. |X|X| -|Start and have P2P or meeting audio/video conversations with the signed in users (IE,Edge,Safari). |X|X| -|Invite more participant to a Skype for Business meeting Chat conversation, or to a P2P Chat conversation to escalate to meeting via the Skype Web SDK API. |X|X| -|Invite more participant to an Skype for Business meeting AV conversation, or to a P2P AV conversation to escalate to meeting (IE,Edge,Safari). |X|X| -|Start and have PSTN audio conversations (outgoing PSTN calling) (IE,Edge,Safari). |X|X| -|Accept and have PSTN audio conversations (incoming PSTN calling) (IE,Edge,Safari). |X|X| -|Schedule a Skype for Business meeting. |X|X| -|Join a Skype for Business meeting and start chat and/or audio service in the conversation (IE,Edge,Safari). |X|X| -|Join a Skype for Business meeting as a signed in user with audio and video (IE,Edge,Safari). |X|X| -|Join a Skype for Business meeting as an anonymous user. |X|-| -|In a Skype for Business meeting, one can open up to four video windows from different remote participants at the same time (IE,Edge,Safari). |X|X| -|Retrieve the different devices, and select a specific device from the list (IE,Edge,Safari). |X|X| -|The application context can be passed to the remote party in the conversation invite. |X|X| -|Use Skype Conversation UI control in your applications for P2P/Group IM. |X|X| -|Use Skype Conversation UI control in your applications for P2P/Group AV (IE,Edge,Safari). |X|X| - -## Supported Browsers - -- IE 11 -- Safari 8-11.X -- Safari 12+ (non Audio/Video functionality) -- Firefox 40+ (non Audio/Video functionality) -- Chrome 43+ (non Audio/Video functionality) -- Microsoft Edge - -## Supported Server versions - -- Lync 2013 cumulative update 6HF2 +, Skype for Business 2015 CU1+: - - - Scenario: - - Sign in - - Sign out - - Presence - - View Contacts - - Groups - - Chat services - - Skype Conversation UI - - -- Skype for Business 2015 Cumulative Update 1+ - - - Scenario: - - P2P AV - - Group AV - - Devices selection - - Anonymous meeting join - - Add/remove contacts and groups - diff --git a/Skype/WebSDK/docs/AddParticipants.md b/Skype/WebSDK/docs/AddParticipants.md deleted file mode 100644 index 81eb51fa2..000000000 --- a/Skype/WebSDK/docs/AddParticipants.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: Add participants to a conversation -description: Additional Persons can be added to a conversation to escalate that conversation to an online meeting. ---- - -# Add participants to a conversation - - - _**Applies to:** Skype for Business 2015_ - -Additional Persons can be added to a conversation to escalate that conversation to an online meeting. - - -## Adding participants to a conversation - - -1. Create a conversation participant. - - ```js - var participant = conversation.createParticipant(person); - ``` - -2. Add the participant to the conversation. - - ```js - conversation.participants.add(participant); - ``` - -3. An event can be subscribed to that is fired when a new participant is added to the conversation. - - ```js - conversation.participants.added(onConversationParticipantAdded); - ``` - - -> [!NOTE] -> If the participant rejects the invitation, the participant will still be in the **conversation.participants** collection with a 'rejected' state. When this occurs, you should remove the participant and clean up any associated user interface. - diff --git a/Skype/WebSDK/docs/AddRemoveConversationAudio.md b/Skype/WebSDK/docs/AddRemoveConversationAudio.md deleted file mode 100644 index de5542b13..000000000 --- a/Skype/WebSDK/docs/AddRemoveConversationAudio.md +++ /dev/null @@ -1,135 +0,0 @@ ---- -title: Add or remove audio in a conversation -description: With an existing conversation instance, audio can be added or removed. ---- - -# Add or remove audio in a conversation - - - _**Applies to:** Skype for Business 2015_ - - **In this article** -[Add audio to a conversation](#sectionSection0) -[Remove audio from a conversation](#sectionSection1) -[Subscribe to changes from the audioService in a conversation](#sectionSection2) -[Accept video and sending video automatically](#sectionSection3) -[Mute a conversation](#sectionSection4) -[Put a conversation on hold](#sectionSection5) - - -With an existing conversation instance, audio can be added or removed. - -## Add audio to a conversation - - - - - ```js - conversation.audioService.start().then(function () { - // Successfully added audio to the conversation -}); - - ``` - - -## Remove audio from a conversation - - - - - - ```js - Conversation.audioService.stop().then(function () { - // Successfully removed audio from the conversation -}); - - ``` - - -## Subscribe to changes from the audioService in a conversation - - -An event is fired when the client has successfully added audio to the conversation, or another participant has invited the client to add audio. - - -1. Subscribe to the event. - - - ```js - conversation.selfParticipant.audio.state.changed(function (val) { -… -}); - - ``` - -2. If the **val** argument in the previous snippet indicates the event is an invitation to add audio, the client may reject or accept the invitation. - - - ```js - if (val == 'Notified') { - if (confirm('Accept incoming audio request?')) { - console.log('accepting the incoming audio request'); - conversation.audioService.accept(); - console.log('Accepting incoming audio request'); - } else { - console.log('declining the incoming audio request'); - conversation.audioService.reject(); - } -} - ``` - - -## Accept video and send video automatically - - -Calling **videoService.accept()** in response to an audio invitation does nothing. Calling **videoService.accept()** in response to a video invitation will accept the audio and video and start its own video as well. - - -1. Subscribe to the audio state changed event. - - - ```js - conversation.selfParticipant.audio.state.changed(function (val) { -… -}); - - ``` - -2. If the **val** argument in the previous snippet indicates the event is an invitation to add audio, the client may accept the invitation while also sending their own video in Skype, as follows. - - - ```js - if (val == 'Notified') { -conversation.videoService.accept(); -} - - ``` - - -## Mute a conversation - - - -The client may temporarily mute their own audio in the conversation. - - - ```js - // Toggle muting the client's audio -conversation.selfParticipant.audio.isMuted.set(!audio.isMuted()); - - ``` - - -## Put a conversation on hold - - -The client may also place itself on hold, temporarily pausing all incoming and outgoing audio. - - - ```js - // Toggle placing the conversation on hold -var isOnHold = conversation.selfParticipant.audio.isOnHold(); -conversation.selfParticipant.audio.isOnHold.set(!isOnHold); - - ``` - diff --git a/Skype/WebSDK/docs/AddRemoveConversationVideo.md b/Skype/WebSDK/docs/AddRemoveConversationVideo.md deleted file mode 100644 index c76a46205..000000000 --- a/Skype/WebSDK/docs/AddRemoveConversationVideo.md +++ /dev/null @@ -1,135 +0,0 @@ ---- -title: Add or remove video in a conversation -description: Describes how to add or remove video in a conversation using the Skype Web SDK and provides a code example. ---- -# Add or remove video in a conversation - - - _**Applies to:** Skype for Business 2015_ - - **In this article** -[Add video to a conversation](#sectionSection0) -[Remove video from a conversation](#sectionSection1) -[Subscribe to changes from the videoService in a conversation](#sectionSection2) -[Accept video without sending video](#sectionSection3) - - -With an existing conversation instance, video can be added or removed. - -## Add video to a conversation - - - - - ```js - conversation.videoService.start().then(function () { - // Successfully added video to the conversation - // Set the video window container - conversation.selfParticipant.video.channels(0).container(document.getElementById("renderWindow")); - channel.isStarted.set(true); -}); - - ``` - - -You may also set the video window container prior to starting the videoService. - - - ```js - // Set the video window container - conversation.selfParticipant.video.channels(0).container(document.getElementById("renderWindow")); - conversation.videoService.start().then(function () { - // Successfully added video to the conversation - conversation.selfParticipant.video.channels(0).isStarted.set(true); - }); - - ``` - - -> [!NOTE] -> Setting the video container more than one time for the same video stream will cause problems with video playback. - - -## Remove video from a conversation - - - - - ```js - Conversation.videoService.stop().then(function () { - // Successfully removed video from the conversation -}); - - ``` - - -Video can also be removed by stopping the audioService. - - ```js - Conversation.audioService.stop().then(function () { - // Successfully removed audio and video from the conversation -}); - ``` - - -## Subscribe to changes from the videoService in a conversation - - -An event is fired when the client has successfully added video to the conversation, or another participant has invited the client to add video. - - -1. Subscribe to the event. - - ```js - conversation.selfParticipant.video.state.changed(function (val) { -… -}); - ``` - -2. If the **val** argument in the previous snippet indicates the event is an invitation to add video, the client may reject or accept the invitation. - - ```js - if (val == 'Notified') { - if (confirm('Accept incoming video request?')) { - console.log('accepting the incoming video request'); - conversation.videoService.accept(); - console.log('Accepting incoming video request'); - } - else { - console.log('declining the incoming video request'); - conversation.videoService.reject(); - } -} - ``` - - -## Accept video without sending video - - -Clients can accept requests for video without sending their own video by calling **audioService.accept()**. - - -1. Subscribe to the video state changed event. - - ```js - conversation.selfParticipant.video.state.changed(function (val) { -… -}); - - ``` - -2. If the **val** argument in the previous snippet indicates the event is an invitation to add video, the client may accept the invitation without sending the client's video. - - ```js - if (val == 'Notified') { - conversation.audioService.accept(); -} - - ``` - -3. The client's video can be added later. - - ```js - conversation.selfParticipant.video.channels(0).isStarted(true); - ``` - diff --git a/Skype/WebSDK/docs/AnonymousMeetingJoin.md b/Skype/WebSDK/docs/AnonymousMeetingJoin.md deleted file mode 100644 index e0913ac70..000000000 --- a/Skype/WebSDK/docs/AnonymousMeetingJoin.md +++ /dev/null @@ -1,73 +0,0 @@ ---- -title: Join a meeting anonymously -description: Describes how to join a meeting anonymously as it applies to Skype for Business and provides a code example. ---- -# Join a meeting anonymously - - - _**Applies to:** Skype for Business_ - -A client can join an existing meeting anonymously by using that meeting's URI. - - **Organizer**: - -1. Schedules a Skype for Business conference and shares the meeting URI with the user. - -2. Ensures conference allows all users to join the conference. - -**Anonymous users**: - -Once users have a meeting URI from the organizer, for example: `sip:user@contoso.com;gruu;opaque=app:conf:focus:id:1WRB13D2`, they take these first steps: - -1. Sign in the anonymous user using the meeting URI. - -2. Get the conversation object for this conference. - -3. Start the needed service in the conversation. - -### Joining a meeting anonymously - - -1. Sign in the anonymous user by using the meeting URI. - - ```js - var uri = 'sip:user@contoso.com;gruu;opaque-app:conf:focus:id:1WRB13D2'; - application.signInManager.signIn({ - name: 'Robin', - meeting: uri - }); - ``` - -2. Create a conversation object for this conference. - - ```js - var conversation = application.conversationsManager.getConversationByUri(uri); - ``` - -3. Start the needed service in the conversation. - - ```js - conversation.chatService.start().then(function() { - // Successfully joined conversation chat - ... - }); - ``` - -4. **Alternatively:** Clients can join the meeting by starting the audio service or video service, as shown below. - - Join the meeting by starting the audio service. - - ```js - conversation.audioService.start().then(function() { - // Successfully joined conversation audio - }); - ``` - - Join the meeting by starting the video service. - - ```js - conversation.videoService.start().then(function() { - // Successfully joined conversation video - }); - ``` - diff --git a/Skype/WebSDK/docs/Architecture.md b/Skype/WebSDK/docs/Architecture.md deleted file mode 100644 index 786fc28d3..000000000 --- a/Skype/WebSDK/docs/Architecture.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: Skype for Business 2015 Web SDK architecture -description: Describes the Skype for Business 2015 Web SDK architecture and provides best practices for the SDK's paradigm. ---- -# Skype Web SDK architecture - - - _**Applies to:** Skype for Business 2015_ - - - - -## Architecture - -The Skype Web SDK is designed to work in a Model - View - View model (MVVM) paradigm in which the SDK represents the model layer. A developer is responsible for creating a presentation layer and JavaScript logic in the view model layer that calls functions in the model. - -The SDK uses common HTTP verbs to implement REST style communication with the Skype for Business server. The Web SDK JavaScript library implements the HTTP request and response handling and exposes a simple presence and conversation API that you use to get and set user availability, get the availability of other users, and start conversations with users. It also handles Basic, integrated, and OAuth user authentication, presence subscription, and conversation operations. - - -![Diagram showing the Web Platform app communicating with the Skype Web SDK, which then communicates to the Skype Network.](../images/abdc8e43-608d-4ea3-a2e3-84267caa51bd.png) - diff --git a/Skype/WebSDK/docs/ConversationControl.md b/Skype/WebSDK/docs/ConversationControl.md deleted file mode 100644 index 27f08365a..000000000 --- a/Skype/WebSDK/docs/ConversationControl.md +++ /dev/null @@ -1,128 +0,0 @@ ---- -title: Conversation Control -description: Describes the Conversation Control object, and provides its properties, methods, and code examples. ---- -# Conversation Control - - _**Applies to:** Skype for Business_ - -Conversation Control members consist of: - -- Properties that return an application instance. -- A method that renders the control in the page. - -## Properties - -The following table lists the properties of the **Conversation Control** object. - - -|Property|Description|Returns| -|:-----|:-----|:-----| -| _UIApplicationInstance_|Returns the instance of Skype Web SDK Application used by renderConversation API|[Application]( http://officedev.github.io/skype-docs/Skype/WebSDK/model/api/interfaces/jcafe.application.html)| - -### Methods - -The following table lists the methods of the **Conversation Control** object. - - -|Method|Description|Returns| -|:-----|:-----|:-----| -| _renderConversation_|Render a conversation in given context
**Parameters**
- _container_ - (**String/DOMelement** ) Mandatory. A CSS selector or DOM element
- _state_ - **Object** Optional. Object holding the optional parameters
- _state.participants_ - **Array** Optional. Array of participants to start a conversation with.
- _state.conversation_ - **Object** Optional. Conversation object to render.
- _state.conversationId_ - **String** Optional. Id/Uri of the group conversation to render.
Use only one of participants, conversation or conversationId.
- _modalities_ - **Array** Optional. Array of modalities to start.
|[Promise]( http://officedev.github.io/skype-docs/Skype/WebSDK/model/api/interfaces/jcafe.promise.html)| - -### Examples - -The following examples show the most common uses of the **renderConversation** method. - -> [!NOTE] -> The HTML container that contains the conversation control must have a width and height set. If width and height are -set to zero, the conversation control does not display. -```html -
-
-``` - -#### Render a new conversation with no modalities enabled, and passing DOM element as container parameter. - -After the control is rendered the user can then click on the Add participants button and add people to the conversation. - -```js -renderConversation(document.querySelector('#container')); -``` - -#### Render a new conversation with Chat modality enabled - -After the control is rendered the user can then click on the Add participants button and add people to the conversation. - -```js -renderConversation('#container', { - modalities: ['Chat'] -}); -``` - -#### Render a 1:1 conversation - -If the sdk finds an existing conversation with that person, then that conversation will be reused. If not, a new conversation is created. - -```js -renderConversation('#container', { - participants: ['sip:denisd@contoso.com'] -}); - -``` - -#### Render a 1:1 conversation with Chat modality - -If the sdk finds an existing conversation with that person, then that conversation will be reused. If not, a new conversation is created. - - -```js -renderConversation('#container', { - participants: ['sip:denisd@contoso.com'], - modalities: ['Chat'] -}); - -``` - - -#### Render a new group conversation with Chat modality - -This will render a new group conversation even if an existing group conversation with the same set of remote participants already exists. - -```js -renderConversation('#container', { - participants: ['sip:remote1@contoso.com', 'sip:remote2@contoso.com'], - modalities: ['Chat'] -}); - -``` - - -#### Join and render an existing group or P2P conversation with Chat modality using conversation object - -This will render an existing group or p2p conversation with using the conversation object. -Do not include the participants array, otherwise it will create a new group conversation. - -```js -renderConversation('#container', { - conversation: conversation, - modalities: ['Chat'] -}); - -``` - -#### Join and render an existing group conversation with Chat modality using conversationId - -This will find an existing group conversation with the given uri and render that conversation. -Do not include the participants array, otherwise it will create a new group conversation. - -```js -// Get the uri of an existing group conversation -// eg. sip:user@contoso.com;gruu;opaque=app:conf:focus:id:EXAMPLE -var uri = conversation.uri(); - -renderConversation('#container', { - conversationId: uri, - modalities: ['Chat'] -}); - -``` diff --git a/Skype/WebSDK/docs/Conversations.md b/Skype/WebSDK/docs/Conversations.md deleted file mode 100644 index 14337eaf1..000000000 --- a/Skype/WebSDK/docs/Conversations.md +++ /dev/null @@ -1,159 +0,0 @@ ---- -title: Conversations -description: Learn about conversations. ---- -# Conversations - - _**Applies to:** Skype for Business 2015_ - -The Skype Web SDK provides the following objects to start or join IM messaging, and to send and receive messages in a conversation. - - -- Use a [ConversationsManager](http://officedev.github.io/skype-docs/Skype/WebSDK/model/api/interfaces/jcafe.conversationsmanager.html) object to start an outgoing conversation. For incoming invitations, the accept and reject actions are taken on the incoming [Conversation](http://officedev.github.io/skype-docs/Skype/WebSDK/model/api/interfaces/jcafe.conversation.html) object. - -- Use a [Conversation](http://officedev.github.io/skype-docs/Skype/WebSDK/model/api/interfaces/jcafe.conversation.html) object to exchange messages, send and receive audio-visual content, and share applications in the conversation. - -- Use the [Skype Web Conversation Control](skype-sdk/websdk/docs/ptuicontrolsconversationcontrol) to host an IM conversation in your webpage. The **Conversation Control** encapsulates the model, view, and view model so that you only write code to host and render the control itself. Use the control when you want to let the Skype Web SDK provide the chat UI. If you use the conversation control, your webpage can host a complete IM dialog with as few as three Skype Web SDK API calls. - -A conversation is a logical container for communication between two or more persons. The properties of a conversation include **selfParticipant**, **participants**, **historyService** in the conversation, and conversation services in use. Each of these objects is represented in Figure 1, and the relationship between conversation objects is represented by connectors in the figure. You can add participants to a conversation before it starts or at any time after starting. Adding participants to a 1-on-1 conversation will escalate that conversation to a multiparty meeting. - - -**Figure 1. The relationship between objects in the Skype Web SDK conversation model** - -![SkypeWebSDK_ConvObjects](../images/7bb0af54-be7a-4c3b-a41c-516b8e7bcd04.png) -### Conversation types - -A conversation can be thought of as two-dimensional, with the number of conversation services representing one dimension, and the number of participants representing the other. - - -- Single modal and multi-modal conversation: A single modal conversation is an Instant Message (IM) or an audio conversation, which is actually audio/video. A multi-modal conversation uses two media modalities: IM and audio/video. - -- Two-party conversation: A two-party conversation is a peer-to-peer conversation. A multi-party conversation is escalated to a meeting when the third-party joins the conversation. - - -### Conversation services - -Several conversation service types are supported by the SDK: - - -- [ChatService](http://officedev.github.io/skype-docs/Skype/WebSDK/model/api/interfaces/jcafe.chatservice.html) - -- [AudioService](http://officedev.github.io/skype-docs/Skype/WebSDK/model/api/interfaces/jcafe.audioservice.html) - -- [VideoService](http://officedev.github.io/skype-docs/Skype/WebSDK/model/api/interfaces/jcafe.videoservice.html) - -- [HistoryService](http://officedev.github.io/skype-docs/Skype/WebSDK/model/api/interfaces/jcafe.historyservice.html) - -### Starting a conversation - -In short, starting a conversation takes three steps: - -- Get a conversation object. -- Add participant objects. -- Start a chat/audio/video service or just send a message. - -If just one participant object is added, the SDK starts a peer-to-peer (1:1) conversation. If no participants or a few participants are added, then the SDk starts a multi-party (1:N) conversation which is also known as an ad-hoc online meeting. - -For the simplest case - starting a 1:1 conversation - use the `getConversation` method that creates new or _gets an existing_ 1:1 conversation with the specified person. - -```js -conv = app.conversationsManager.getConversation("sip:johndoe@contoso.com"); -conv.chatService.sendMessage("Hi"); -``` - -If there was no conversation with this person, it will be created and the conversation object will have one item in the `participants` collection. The created participant object will generally have just one property set: `.person.id` which is the given SIP URI. Other properties will become available once the conversation is started. - -Another way to get the same result is to use a person object. - -```js -p = app.personsAndGroupsManager.all.persons(3); -conv = app.conversationsManager.getConversation(p); -conv.chatService.sendMessage("Hi"); -``` - -In this case the created participant object will use the given person object that may have all the properties filled with data. When starting the conversation, the SDK will do a `p.id.get()` to get the SIP URI, which will be a noop if the SIP URI was already available. - -After a 1:1 conversation is started, more participants can be added to turn the peer-to-peer conversation into a multi-party one: - -```js -conv = app.conversationsManager.getConversation("sip:johndoe@contoso.com"); -conv.chatService.sendMessage("Hi").then(() => { - // joesmith will get an invitation to join the ad-hoc meeting - conv.participants.add("sip:joesmith@contoso.com"); -}); -``` - -Participants can also be removed from the conversation. However removing all the participants except one from a multiparty conversation doesn't convert it back into a peer-to-peer one: the conversation remains an onlinead-hoc meeting with two participants (the local participant and the remote participant). - -```js -pt0 = conv.participants(0) -conv.participants.remove(pt0).catch(err => { - console.log("looks like the current user doesn't have permissions to remove participants:", err); -}); -``` - -It's possible to create an empty ad-hoc meeting and invite participants later. - -```js -conv = app.conversationsManager.createConversation(); -conv.chatService.start(); // sendMessage also works -``` - -Note, that the chat service was used as an example. It's possible to start audio or video service to start conversations. - -Before a conversation is started, it's possible to set the subject/topic of that conversation. After the conversation is started, its topic cannot be changed. - -```js -conv = app.conversationsManager.createConversation(); -conv.topic.set("ABC"); -conv.chatService.start(); // sendMessage also works -``` - -### Ending a conversation - -This is as simple as invoking the `leave` method: - -```js -conversation.leave(); -``` - -### Sending context as part of conversation invites - -In certain scenarios your application may want to send some additional context as part of a conversation invite. For instance, if both the sender and recipient are applications written by you on top of the Skype Web SDK then the conversation initiator may want to indicate to the recipient that an incoming conversation be handled in some special way. This can be accomplished by passing contextual data as part of an invite: - -#### e.g. For the chat service: -```js -conversation.chatService.start({ - .. other parameters - context: 'Some random data', - contextType: 'text/plain' -}); -``` -#### e.g. For the audio service: -```js -conversation.audioService.start({ - .. other parameters - context: { "key1": "value1" }, - contextType: 'text/json' -}); -``` -#### Description of the parameters: -* `context` : Strings, numbers, booleans or objects. Objects are JSON stringified before sending over the wire. -* `contextType`: This is an optional parameter indicating to the recipient the mime.type of the context parameter. If contextType is unspecified then the SDK uses text/plain for primitive types or text/json for anything else. - -#### Obtaining the context on incoming conversations: -The recipient can use the following approach to get the context and contextType sent by the sender. -```js -app.conversationsManager.conversations.added(function(conversation) { - var context = conversation.context(); - var contextType = conversation.context && conversation.context.type(); -}); -``` - -## See also - - -- [Start a conversation](StartConversation.md) -- [Respond to a conversation invitation](RespondToInvitation.md) -- [Add participants to a conversation](AddParticipants.md) -- [Use the Skype Web Conversation Control in a webpage](skype-sdk/websdk/docs/ptuicontrolsconversationcontrol) diff --git a/Skype/WebSDK/docs/CoreCapabilities.md b/Skype/WebSDK/docs/CoreCapabilities.md deleted file mode 100644 index a4761f146..000000000 --- a/Skype/WebSDK/docs/CoreCapabilities.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: Skype Web SDK core capabilities -description: The following table lists tasks that are the building blocks of creating web and mobile applications using the Skype Web SDK. ---- - -# Skype Web SDK core capabilities - - - _**Applies to:** Skype for Business 2015_ - - - - -## Core Concepts - -The following table lists tasks that are the building blocks of creating web and mobile applications using the Skype Web SDK. - - -|Task|Description| -|:-----|:-----| -|[Presence](Presence.md)|Use presence information to help users decide whether and how they should person other users.| -|[Local user](LocalUser.md)|Use the **mePerson** object to represent the currently signed-in user.| -|[Conversations](Conversations.md)|Use conversation services to determine the ways for communication between persons.| -|[Groups](Groups.md)|Use a person group to contain related persons.| -|[Person Lists](PersonLists.md)|The **all.persons** contains all of the user's persons.| -|[Listening for and generating presence events](PresenceEvents.md)|Use events to get a person's current presence.| -|[Persons](Persons.md)|Use person objects to represent individual users.| -|[Devices](Devices.md)|Select Cameras, Microphones, and Speakers to use for audio and video conversations.| diff --git a/Skype/WebSDK/docs/DevelopApplications.md b/Skype/WebSDK/docs/DevelopApplications.md deleted file mode 100644 index 7c6e3e9ba..000000000 --- a/Skype/WebSDK/docs/DevelopApplications.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: Developing applications with Skype Web SDK -description: Describes the Skype Web SDK object model and architecture, and how to develop applications for servers using the Skype Web SDK. ---- -# Developing applications with Skype Web SDK - - - _**Applies to:** Skype for Business_ - -The following sections describe the Skype Web SDK object model and architecture, and explain how to develop applications for on-premises server and online server using the Skype Web SDK. In the online server scenario, your application authenticates against Azure Active Directory. In the on-premises server scenario, your application authenticates against your own server with its own Active Directory. - - -- [Skype Web SDK architecture](Architecture.md) - -- [Skype Web SDK object model](ObjectModel.md) - -- [Developing Web SDK applications for Skype for Business Server](DevelopForSkypeforBusiness.md) - -- [Developing Web SDK applications for Skype for Business Online](DevelopWebSDKappsForSfBOnline.md) - diff --git a/Skype/WebSDK/docs/DevelopForSkypeforBusiness.md b/Skype/WebSDK/docs/DevelopForSkypeforBusiness.md deleted file mode 100644 index 44023f8ee..000000000 --- a/Skype/WebSDK/docs/DevelopForSkypeforBusiness.md +++ /dev/null @@ -1,216 +0,0 @@ ---- -title: Developing Web SDK applications for Skype for Business Server -description: This section shows how to develop a Skype Web SDK client application for Skype for Business Server. ---- -# Developing Web SDK applications for Skype for Business Server - - - _**Applies to:** Skype for Business_ - - **In this article** -[Initialize the Skype application object](#sectionSection0) -[Password grant authentication](#sectionSection1) -[Integrated Windows Authentication (IWA)](#sectionSection2) -[Anonymous meeting join](#sectionSection3) -[Passive/ADFS authentication](#sectionSection4) -[OAuth2 authentication](#sectionSection5) - -This section shows how to develop a Skype Web SDK client application for Skype for Business Server. - -## Download the SDK and sign in - - -Add the following code to the document function of an index page in your app. - -```js -Skype.initialize({ - apiKey: 'a42fcebd-5b43-4b89-a065-74450fb91255' // SDK preview -}, api => { - var app = new api.application; - app.signInManager.signIn(...).then(() => { - console.log("signed in as", app.personsAndGroupsManager.mePerson.displayName()); - }, err => { - console.log("cannot sign in", err); - }); -}, err => { - console.log("cannot download the SDK", err); -}); -``` - -## Password grant authentication - - -In the password grant authentication flow, the SDK sends username and password to the server to get a web ticket: - -```js -app.signInManager.signIn({ - username: 'user123@contoso.com', - password: '17Psnds732' -}); -``` - -If no other parameters are provided, the SDK extracts the domain name from the username and attempts to discover UCWA with the two GETs: - -- `GET https://lyncdiscover.contoso.com` -- `GET https://lyncdiscoverinternal.contoso.com` - -The two URLs are also known as `root` URLs. One of the two servers is supposed to exist and have a valid certificate. If this is not possible, but you know or can discover by other means the `root` URLs, they can be given in the _origins_ parameter: - -```js -app.signInManager.signIn({ - username: '****', - password: '****', - origins: [ - "https://sfbweb1.contoso.com/autodiscover/autodiscoverservice.svc/root", - "https://sfbweb2.contoso.com/autodiscover/autodiscoverservice.svc/root" - ] -}); -``` - -This will tell the SDK to send GETs to these URLs instead: - -- `GET https://sfbweb1.contoso.com/autodiscover/autodiscoverservice.svc/root` -- `GET https://sfbweb2.contoso.com/autodiscover/autodiscoverservice.svc/root` - -GETs to `root` URLs do not require authentication. A GET to a `root` URL returns a so called `user` URL which does require authentication: - -``` -GET https://sfbweb1.contoso.com/autodiscover/autodiscoverservice.svc/root - -HTTP 200 -{ "_links": { "user": { href: "https://sfbweb1.contoso.com/autodiscover/autodiscoverservice.svc/user" } } } -``` - -If the `user` URL is known beforehand, it can be useful in some cases to start the discovery process from it: - -```js -app.signInManager.signIn({ - username: '****', - password: '****', - root: { user: "https://sfbweb1.contoso.com/autodiscover/autodiscoverservice.svc/user" } -}); -``` - -The SDK proceeds with a GET to the `user` URL and gets back a `401` response. Most browsers log such responses in the dev console. - -``` -GET https://sfbweb1.contoso.com/autodiscover/autodiscoverservice.svc/user - -HTTP 401 -WWW-Authenticate: MsRtcOAuth grant_type="password" -``` - -The SDK checks that in the 401 response the server says that it supports the password grant auth. Then the SDK sends a POST request with username and password to get a web ticket and resends the GET /user request with the web ticket. The response is supposed to have a so called `applications` URL which is also known as UCWA URL, because this is when the UCWA service is hosted. - -``` -GET https://sfbweb1.contoso.com/autodiscover/autodiscoverservice.svc/user -Authorization: Bearer cwt=AAB... - -HTTP 200 -{ "_links": { "user": { href: "https://sfbwebfes0b0m.infra.contoso.com/.../applications" } } } -``` - -If the `applications` URL is known beforehand, it can be useful in some cases to skip the discovery process and go to that URL directly. This URL usually changes even for the same user. - -```js -app.signInManager.signIn({ - username: '****', - password: '****', - snapshot: { applications: "https://sfbwebfes0b0m.infra.contoso.com/.../applications" } -}); -``` - -More often than not the `applications` URL belongs to a different domain. This happens because before the GET /user request, the server doesn't know who the user is and thus cannot know where the user data is hosted; but after the GET request, the server gets the user identity in the web ticket, discovers the server where the user is homed, and returns a URL to that server. - -Web tickets are usually issued for a specific server domain and cannot be used to access a different server. This is why when the SDK attempts to access the `applications` URL, it gets an authorization-related error (can be a 401, 403 or 500) and another 4xx/5xx response gets printed to the dev console by the browser. Once the SDK gets another web ticket for the new server FQDN, it sends a POST /applications to create a UCWA endpoint: - -``` -POST https://sfbwebfes0b0m.infra.contoso.com/.../applications -Authorization: Bearer cwt=AAC... - -HTTP 201 -{ "rel": "application", "_links": { "self": { href: "/.../application" } } } -``` - -Once this 201 is received, the sign-in operation is considered to be done and the promise object returned by the **signIn** method is resolved. - -```js -app.signInManager.signIn(...).then(() => { - console.log("POST /applications has returned a 2xx"); -}); -``` - -## Integrated Windows Authentication (IWA) - - -To sign in using the Integrated Windows Authentication (IWA) flow, provide the _domain_ parameter: - -```js -app.signInManager.signIn({ - domain: 'contoso.com' -}); -``` - -The SDK will start with GETs to the lyncdiscover URLs as described above and will use the intergrated auth to get a web ticket. In this mode the SDK doesn't have access to username and password as they are managed by the browser and the operating system. - -This auth mode is enabled when 401 responses have `urn:microsoft.rtc:window` in the `WWW-Authenticate.MsRtcOAuth.grant_type` setting. - -## Anonymous meeting join - - -To sign in using the anonymous meeting join flow, your application needs to provide the URI of the online meeting: - - -```js -app.signInManager.signIn({ - meeting: 'sip:user123@contoso.com;gruu;opaque=app:conf:focus:id:AHSJDNA' -}); -``` - -The SDK will extract the FQDN from the conference URI and will use it to construct the `lyncdiscover` requests. To get a web ticket, the SDK will extract the conference key from the URI (`AHSJDNA` in this example). The discovery process can be customized as described above. - -This auth mode is enabled when 401 responses have `urn:microsoft.rtc:anonmeeting` in the `WWW-Authenticate.MsRtcOAuth.grant_type` setting. - -## Passive/ADFS authentication - - -You can use the passive authentication if your on-premises server has ADFS configured. To use this auth, set the `auth` param: - -```js -app.signInManager.signIn({ - auth: "passive", - domain: "contoso.com" -}); -``` - -Prior to calling the **signIn** method, the user needs to enter credentials at the ADFS site. Once this is done, the site sends a few auth cookies that get stored in the browser's cache. When the SDK gets a web ticket in this mode, it creates a hidden `