Updates from: 06/16/2024 02:36:33
Service Microsoft Docs article Related commit history on GitHub Change details
platform Build Apps For Teams Meeting Stage https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/apps-in-teams-meetings/build-apps-for-teams-meeting-stage.md
To invoke share to stage, users can select the **Share to Stage** icon on the up
## App manifest settings for apps in meeting stage
-To share an app to the meeting stage, you must configure the context and RSC permissions in the [app manifest](../resources/schem):
+To share an app to the meeting stage, you must configure the context and resource-specific consent (RSC) permissions in the [app manifest](../resources/schem):
1. Update the `context` property in the app manifest as follows:
There are many scenarios where sharing the entire app to the meeting stage isn't
1. For a medical app, a doctor may want to share just the X-Ray on the screen with the patient versus sharing the entire app with all the patients records or results and so on.
-1. A user may want to share content from a single content provider at a time (for example, YouTube) versus sharing an entire video catalog onto stage.
+1. For a video streaming app, a user might want to share content from a single content provider at a time (for example, YouTube) versus sharing an entire video catalog onto stage.
To help users in such scenarios, we released APIs within the Microsoft Teams JavaScript client library (TeamsJS) that allow you to programmatically invoke share to stage for specific parts of the app from a button in the meeting side panel.
The following table includes the query parameters:
|Value|Type|Required|Description| |||-|| |**callback**| String | Yes | Callback contains two parameters, error and result. The *error* can contain either an error of type *SdkError* or null when share is successful. The *result* can contain either a true value if there's a successful share or null when the share fails. |
-|**appContentURL**| String | Yes | The URL that will be shared on to the stage. |
+|**appContentURL**| String | Yes | The URL that's shared on to the stage. |
### Example
The following table includes the query parameter:
|Value|Type|Required|Description| |||-||
-|**callback**| String | Yes | Callback contains two parameters, error and result. The *error* can contain either an error of type *SdkError* in case of an error or null when share is successful. The *result* can contain either an `IAppContentStageSharingState` object when share is successful or null in case of an error.|
+|**callback**| String | Yes | Callback contains two parameters, error and result. The *error* can contain either an error of type *SdkError* if there's an error or null when share is successful. The *result* can contain either an `IAppContentStageSharingState` object when share is successful or null if there's an error.|
### Example
The following table includes the query parameter:
|Value|Type|Required|Description| |||-||
-|**callback**| String | Yes | Callback contains two parameters, error and result. The *error* can contain either an error of type *SdkError* or null when share is successful. The result can contain either an `IAppContentStageSharingCapabilities` object, when share is successful or null in case of an error.|
+|**callback**| String | Yes | Callback contains two parameters, error and result. The *error* can contain either an error of type *SdkError* or null when share is successful. The result can contain either an `IAppContentStageSharingCapabilities` object, when share is successful or null if there's an error.|
### Example
The following table provides the user types and lists the features that each use
|Sample name | Description | .NET| Node.js | Manifest | |-|--|--|-|-|
-|Meeting stage sample | This sample app shows a tab in meeting stage for collaboration. This sample also uses live share sdk for collaborative Stageview. | [View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/meetings-stage-view/csharp) | [View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/meetings-stage-view/nodejs) | [View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/meetings-stage-view/csharp/demo-manifest) |
+|Meeting stage sample | This sample app shows a tab in meeting stage for collaboration. This sample also uses Live Share SDK for collaborative Stageview. | [View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/meetings-stage-view/csharp) | [View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/meetings-stage-view/nodejs) | [View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/meetings-stage-view/csharp/demo-manifest) |
| In-meeting notification | Demonstrates how to implement in-meeting notifications using bot. | [View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/meetings-notification/csharp) | [View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/meetings-notification/nodejs) | [View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/meetings-notification/csharp/demo-manifest) |
-| In-meeting document signing | This sample app shows how to implement a document signing Teams app. Includes sharing specific app content to stage, Teams SSO, and user specific Stageview. | [View](https://github.com/officedev/microsoft-teams-samples/tree/main/samples/meetings-share-to-stage-signing/csharp) | NA | NA |
+| In-meeting document signing | This sample app shows how to implement a document signing Teams app. Includes sharing specific app content to stage, Teams single sign-on (SSO), and user specific Stageview. | [View](https://github.com/officedev/microsoft-teams-samples/tree/main/samples/meetings-share-to-stage-signing/csharp) | NA | NA |
## Step-by-step guide
platform Designing Apps In Meetings https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/apps-in-teams-meetings/design/designing-apps-in-meetings.md
In a meeting, users can select **More** :::image type="icon" source="../../asset
## Before a meeting
-Prior to a meeting, your app's available to users in a tab. The following example shows a draft survey question that people will answer during the meeting.
+Prior to a meeting, your app's available to users in a tab. The following example shows a draft survey question that people can answer during the meeting:
:::image type="content" source="../../assets/images/apps-in-meetings/before-meeting-tab.png" alt-text="Example shows how to app content in the meeting details before a call." lightbox="../../assets/images/apps-in-meetings/before-meeting-tab.png":::
The shared meeting stage is all about collaboration and participation. Here are
|Counter|Description| |-|--| |1|**App icon**: The highlighted icon indicates the app's in-meeting tab is open.|
-|2|**Share to meeting button**: The entry point to share the app to the meeting. For a consistent experience, always use the standard Teams share icon. **Share to meeting** is the recommended default text, but you can also customize it for your use cases. For example, **Play together** for a gaming app or **Watch together** for a video app. Either way, make it clear that the action will create a shared, interactive experience with everyone in the meeting.|
+|2|**Share to meeting button**: The entry point to share the app to the meeting. For a consistent experience, always use the standard Teams share icon. **Share to meeting** is the recommended default text, but you can also customize it for your use cases. For example, **Play together** for a gaming app or **Watch together** for a video app. Either way, make it clear that the action creates a shared, interactive experience with everyone in the meeting.|
|3|**iframe**: Displays your app content.| |4|**Stop sharing button**: Stops sharing the app to the meeting stage. Displays only for the participant who started the share.| |5|**Presenter attribution**: Displays the name of the participant who shared the app.|
platform Meeting Apps Apis https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/apps-in-teams-meetings/meeting-apps-apis.md
The `GetParticipant` API must have a bot registration and ID to generate auth to
> > * The user type isn't included in the **getParticipantRole** API. > * Do not cache participant roles since the meeting organizer can change the roles any time.
-> * Currently, the `GetParticipant` API is only supported for distributions lists or rosters with less than 350 participants.
+> * The `GetParticipant` API is only supported for distributions lists or rosters with less than 350 participants.
### Query parameters
POST /v1/meetings/{meetingId}/notification
||| | `meetingId` | The meeting ID is available through bot invoke and TeamsJS library. | | `type` |`targetedMeetingNotification` |
-| `recipients` | List of user IDs. Get user IDs for meeting participants through [Get participant API](#get-participant-api). Get the entire list of chat roster using [Get members API](../bots/how-to/get-teams-context.md#fetch-the-roster-or-user-profile). Empty or null recipients list will return 400.|
+| `recipients` | List of user IDs. Get user IDs for meeting participants through [Get participant API](#get-participant-api). Get the entire list of chat roster using [Get members API](../bots/how-to/get-teams-context.md#fetch-the-roster-or-user-profile). An empty or null recipients list returns 400.|
| `surface` | A type of surface. The supported surface types are `meetingStage` and `meetingTabIcon`. | | `surfaces` | List of surfaces where notifications can be rendered. | | `contentType` | Type of content that the targeted in-meeting notification renders. The supported value is `task`. |
POST /v1/meetings/{meetingId}/notification
| `content.value.height` | **Optional**; requested height of the notification. | |`content.value.width` | **Optional**; requested width of the notification. | | `content.value.title` | **Optional**; title of the notification. |
-| `content.value.url` | **Optional**; URL to be rendered in the notification. Make sure the URL is part of `validDomains` in app manifest. If empty string or no URL is provided, nothing will be rendered on a meeting notification. |
+| `content.value.url` | **Optional**; URL to be rendered in the notification. Make sure the URL is part of `validDomains` in app manifest. If an empty string or no URL is provided, nothing is rendered on a meeting notification. |
| `ChannelData.OnBehalfOf` | **Optional**; this is to support [User attributes](../messaging-extensions/how-to/action-commands/respond-to-task-module-submit.md#user-attribution-for-bots-messages). | | `onBehalfOf.itemid` | Describes identification of the item. Its value must be 0. | | `onBehalfOf.mentionType` |`person` keyword. Describes the mention of a person. |
POST /v1/meetings/{meetingId}/notification
## Get meeting details API
-The meeting details API enables your app to get a meeting's static metadata. The metadata provides data points that don't change dynamically. The API is available through Bot Services. Currently, both private scheduled or recurring meetings and channel scheduled or recurring meetings support API with different RSC permissions respectively.
+The meeting details API enables your app to get a meeting's static metadata. The metadata provides data points that don't change dynamically. The API is available through Bot Services. Both private scheduled or recurring meetings and channel scheduled or recurring meetings support API with different RSC permissions respectively.
The meeting details API must have a bot registration and bot ID. It requires Bot SDK to get `TurnContext`. To use the meeting details API, you must obtain different RSC permission based on the scope of any meeting, such as private meeting or channel meeting.
platform Teams Live Share Capabilities https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/apps-in-teams-meetings/teams-live-share-capabilities.md
Title: Live Share getting started
-description: In this module, learn more about live share SDK capabilities, RSC permissions and live data structures.
+description: Learn more about Live Share SDK capabilities, RSC permissions, and live data structures.
ms.localizationpriority: high
This article focuses on how to integrate the Live Share SDK into your app and ke
The [Live Share SDK](https://github.com/microsoft/live-share-sdk) is a JavaScript package published on [npm](https://www.npmjs.com/package/@microsoft/live-share), and you can download through npm or yarn. You must also install Live Share peer dependencies, which include `fluid-framework` and `@fluidframework/azure-client`. If you're using Live Share in your tab application, you must also install `@microsoft/teams-js` version `2.23.0` or later. If you want to use the `TestLiveShareHost` class for local browser development, you must install `@fluidframework/test-client-utils` and `start-server-and-test` packages in your `devDependencies`.
-#### npm
+#### NPM
```bash npm install @microsoft/live-share fluid-framework @fluidframework/azure-client --save
npm install @microsoft/teams-js --save
npm install @fluidframework/test-client-utils start-server-and-test --save-dev ```
-#### yarn
+#### Yarn
```bash yarn add @microsoft/live-share fluid-framework @fluidframework/azure-client
const LiveShareLoading = () => {
-That's all it took to setup your container and join the session mapped to the meeting, chat, or channel. Now, let's review the different types of _distributed data structures_ that you can use with the Live Share SDK.
+That's all it took to set up your container and join the session mapped to the meeting, chat, or channel. Now, let's review the different types of _distributed data structures_ that you can use with the Live Share SDK.
> [!TIP] > Ensure that the Teams Client SDK is initialized before calling `LiveShareHost.create()`.
The following are a few examples in which `LiveState` can be used in your applic
- Keeping a scroll position in sync for a **follow me** feature. > [!NOTE]
-> Unlike `SharedMap`, the `state` value in `LiveState` will be reset after all the users disconnect from a session.
+> Unlike `SharedMap`, the `state` value in `LiveState` is reset after all the users disconnect from a session.
Example:
followMode.on("stateChanged", (state, local, clientId) => {
const followingUser = followMode.getUserForClient(clientId); switch (state.type) { case FollowModeType.local: {
- // Update app to reflect that the user is not currently following anyone and there is no presenter.
+ // Update app to reflect that the user isn't following anyone and there is no presenter.
infoText.innerHTML = ""; // Show a "Start presenting" button in your app. button.innerHTML = "Start presenting";
followMode.on("stateChanged", (state: IFollowModeState<ICameraPosition>, local:
const followingUser = followMode.getUserForClient(clientId); switch (state.type) { case FollowModeType.local: {
- // Update app to reflect that the user is not currently following anyone and there is no presenter.
+ // Update app to reflect that the user isn't following anyone and there is no presenter.
infoText.innerHTML = ""; // Show a "Start presenting" button in your app. button.innerHTML = "Start presenting";
export const MyLiveFollowMode = () => {
-In `meetingStage` contexts, your users are collaborating and presenting synchronously to facilitate more productive discussions. When a user presents content to the meeting stage, you should call the `startPresenting()` API for the initial presenter. In `content` contexts like collaborative stageview, content is most commonly consumed asynchronously. In this case, it is best to let users opt into realtime collaboration, such as through a "Follow" button. Using the `teamsJs.app.getContext()` API in the Teams JavaScript SDK, you can easily adjust your functionality accordingly.
+In `meetingStage` contexts, your users are collaborating and presenting synchronously to facilitate more productive discussions. When a user presents content to the meeting stage, you should call the `startPresenting()` API for the initial presenter. In `content` contexts like collaborative stageview, content is most commonly consumed asynchronously. In this case, it's best to let users opt into real-time collaboration, such as through a "Follow" button. Using the `teamsJs.app.getContext()` API in the Teams JavaScript SDK, you can easily adjust your functionality accordingly.
Example:
const context: app.Context = await app.getContext();
if (context.page?.frameContext === FrameContexts.meetingStage) { // Check if user is initial presenter meeting.getAppContentStageSharingState((error, state) => {
- // isShareInitiator is not currently declared in the typedocs in the SDK, so we cast as any
+ // isShareInitiator isn't declared in the typedocs in the SDK, so we cast as any
const isShareInitiator = (state as any)?.isShareInitiator; if (!isShareInitiator) return; // The user is the initial presenter, so we "take control"
export const MyLiveFollowMode = () => {
.then(async (context: app.Context) => { if (context.page?.frameContext !== FrameContexts.meetingStage) return; meeting.getAppContentStageSharingState((error, state) => {
- // isShareInitiator is not currently declared in the typedocs in the SDK, so we cast as any
+ // isShareInitiator isn't declared in the typedocs in the SDK, so we cast as any
const isShareInitiator = (state as any)?.isShareInitiator; if (!isShareInitiator) return; setIsShareInitiator(true);
platform Teams Live Share Overview https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/apps-in-teams-meetings/teams-live-share-overview.md
Features supported by the Live Share core package include:
- Synchronize a countdown timer with `LiveTimer`. - Send real-time events to other clients in the session with `LiveEvent`. - Present to and follow other users with `LiveFollowMode`.-- Leverage any feature of Fluid Framework, such as `SharedMap` and `SharedString`.
+- Use any feature of Fluid Framework, such as `SharedMap` and `SharedString`.
You can find more information about this package on the [core capabilities page](./teams-live-share-capabilities.md).
You can find more information about this package on the [Live Share media page](
:::image type="content" source="../assets/images/teams-live-share/Teams-live-share-schematics.png" alt-text="Screenshots shows an example of multiple users drawing on a canvas during a meeting.":::
-When collaborating in realtime, it's essential for users to be able to point out and emphasize content on the screen. Live Share canvas makes it easy to add inking, laser pointers, and cursors to your app for seamless collaboration.
+When collaborating in real time, it's essential for users to be able to point out and emphasize content on the screen. Live Share canvas makes it easy to add inking, laser pointers, and cursors to your app for seamless collaboration.
Features supported by Live Share canvas include:
const { container } = await liveShare.joinContainer(schema);
#### Using a custom Azure Fluid Relay service
-While most of you find it preferable to use our free hosted service, there are still situations where it is beneficial to use your own Azure Fluid Relay service for your Live Share app.
+While most of you find it preferable to use our free hosted service, there are still situations where it's beneficial to use your own Azure Fluid Relay service for your Live Share app.
Consider using a custom service if you:
switch(context.page?.frameContext) {
:::image type="content" source="../assets/images/teams-live-share/live-share-meetings-overview-full.png" alt-text="Screenshot showing meeting side panel and stage.":::
-As we've mentioned earlier, there are two meeting contexts: `meetingStage` and `sidePanel`. In the following section, we'll explore how to optimize these contexts to enhance the user experience.
+As we've mentioned earlier, there are two meeting contexts: `meetingStage` and `sidePanel`. In the following section, explore how to optimize these contexts to enhance the user experience.
#### Meeting stage
-The `meetingStage` context allows users to share your app content to the meeting stage for participants in the meeting. In this context, users typically expect to collaborate in realtime. Unlike when loading a collaborative app like Microsoft Loop or Word in a web browser, presenters usually expect to have more control of the experience. For example, in PowerPoint Live, presenters expect to have control over which PowerPoint slide is visible to attendees by default, even if attendees can choose to stop following them temporarily.
+The `meetingStage` context allows users to share your app content to the meeting stage for participants in the meeting. In this context, users typically expect to collaborate in real time. Unlike when loading a collaborative app like Microsoft Loop or Word in a web browser, presenters usually expect to have more control of the experience. For example, in PowerPoint Live, presenters expect to have control over which PowerPoint slide is visible to attendees by default, even if attendees can choose to stop following them temporarily.
:::image type="content" source="../assets/images/teams-live-share/live-share-meeting-stage.png" alt-text="Overview of unique use cases for Live Share in meeting stage.":::
The meeting `sidePanel` context allows users to pin your app as a tab in a meeti
Consider making the following optimizations for your `sidePanel` app: - Companion experiences to the meeting stage, such as collaborative video or audio playlists.-- Configuration settings prior to sharing content to the meeting stage, such as disabling the "take control" feature.
+- Configuration settings before sharing content to the meeting stage, such as disabling the "take control" feature.
- Performance optimizations, such as broadcasting new content once while sharing has already started, rather than reloading the application. ### Content contexts
The `content` context is designed for asynchronous consumption of your app's con
#### Chat and channel tabs
-Chat and channel tabs allow users to pin your application to a chat or channel. A tab that supports both `sidePanel` and `content` will feature the same pinned URL, but the use cases are usually fairly different. For starters, chat and channel tabs generally have more horizontal space to work with. As a best practice, allow users to search for content to "pin" to the tab. For example, teachers using a note app may pin notes containing educational resources for their students.
+Chat and channel tabs allow users to pin your application to a chat or channel. A tab that supports both `sidePanel` and `content` features the same pinned URL, but the use cases are fairly different. For starters, chat and channel tabs generally have more horizontal space to work with. As a best practice, allow users to search for content to "pin" to the tab. For example, teachers using a note app may pin notes containing educational resources for their students.
-While chat and channel tabs are most commonly used for asynchronous consumption, it is possible for your users to have the same content at the same time. When this happens, it is useful to keep content in sync to prevent data conflicts or duplication of work. Live Share allows you to show what content each user is viewing, what they are doing, and more. This can provide social incentives that draw users into app content, increasing engagement and collaboration. We call this "coincidental collaboration."
+While chat and channel tabs are most commonly used for asynchronous consumption, it's possible for your users to have the same content at the same time. When this happens, it's useful to keep content in sync to prevent data conflicts or duplication of work. Live Share allows you to show what content each user is viewing, what they're doing, and more. This can provide social incentives that draw users into app content, increasing engagement and collaboration. We call this "coincidental collaboration."
:::image type="content" source="../assets/images/teams-live-share/live-share-chat-and-channel-tabs.png" alt-text="Overview of unique use cases for Live Share in chat and channel tabs."::: Consider making the following optimizations for your `content` chat and channel tab: -- Show which users are currently viewing content pinned to the tab, such as users actively viewing each whiteboard.
+- Show which users are viewing content pinned to the tab, such as users actively viewing each whiteboard.
- Nudge users to join an ongoing collaboration session, such as displaying a toast to join an ongoing standup for a task app. - Allow users to follow a specific user or group of users, such as by clicking on the avatar of another connected user they'd like to follow. #### Collaborative stageview When users share your app's content with their colleagues in Teams, we recommend using [collaborative stageview](../tabs/open-content-in-stageview.md#collaborative-stageview). In this scenario, users open content that was shared in a popout window with chat on the side, allowing users to engage with your content while continuing the conversation flow. Similar to chat and channel tabs, this content is primarily consumed asynchronously. However, if users share the content through an Adaptive Card, users are more likely to view the content and chat with one another, increasing the need for collaborative features.
When users share your app's content with their colleagues in Teams, we recommend
Consider making the following optimizations for your collaborative stageview apps: -- Show which users are currently viewing the content and what they are doing, such as displaying a user's avatar at the position they are at in a video.
+- Show which users are viewing the content and what they're doing, such as displaying a user's avatar at the position they are at in a video.
- Allow users to follow a specific user or group of users, such as by clicking on the avatar of another connected user they'd like to follow. - Facilitate ad-hoc communication, such as by enabling inking tools and laser pointers while in follow mode. ## React integration
-Live Share has a dedicated React integration, making Live Share features even easier to integrate into React apps. Rather than using `LiveShareClient` directly, you can use the `LiveShareProvider` component to join a Live Share session when the component first mounts. Each `LiveDataObject` has a corresponding React hook, designed to make using Live Share incredibly easy. For more information, see Live Share for React [GitHub page](https://aka.ms/livesharereact) for more information.
+Live Share has a dedicated React integration, making Live Share features even easier to integrate into React apps. Rather than using `LiveShareClient` directly, you can use the `LiveShareProvider` component to join a Live Share session when the component first mounts. Each `LiveDataObject` has a corresponding React hook, designed to make using Live Share incredibly easy. For more information, see Live Share for React [GitHub page](https://aka.ms/livesharereact).
## User scenarios
platform Debugging Local Testing Calling Meeting Bots https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/bots/calls-and-meetings/debugging-local-testing-calling-meeting-bots.md
Forwarding https://signal.ngrok.io -> localhost:12345
Forwarding tcp://1.tcp.ngrok.io:12332 -> localhost:8445 ```
-Here, `12345` is the signaling port, `8445` is the application-hosted port, and `12332` is the remote media port exposed by ngrok. Note that we have a forwarding from `1.bot.contoso.com` to `1.tcp.ngrok.io`. This will be used as the media URL for the bot. Of course, these port numbers are just examples and you can use any available port.
+Here, `12345` is the signaling port, `8445` is the application-hosted port, and `12332` is the remote media port exposed by ngrok. Note that we have a forwarding from `1.bot.contoso.com` to `1.tcp.ngrok.io`. This is used as the media URL for the bot. Of course, these port numbers are just examples and you can use any available port.
### Update code
statefulClientBuilder.SetNotificationUrl(
> > * The URL in `SetNotificationUrl` must be HTTPS. >
-> Your local instance must be listening to HTTP traffic on the signaling port. The requests made by the calls and online meetings platform will reach the bot as localhost HTTP traffic unless end-to-end encryption is set up.
+> Your local instance must be listening to HTTP traffic on the signaling port. The requests made by the calls and online meetings platform reach the bot as localhost HTTP traffic unless end-to-end encryption is set up.
#### Update media
platform Requirements Considerations Application Hosted Media Bots https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/bots/calls-and-meetings/requirements-considerations-application-hosted-media-bots.md
An application-hosted media bot requires the [`Microsoft.Graph.Communications.Ca
## C# or .NET and Windows Server for development
-An application-hosted media bot requires the following:
+An application-hosted media bot has the following requirements:
-* The bot must be developed in C# and the standard .NET Framework and deployed in Microsoft Azure. You can't use C++ or Node.js APIs to access real-time media and .NET Core isn't supported for an application-hosted media bot.
+* The bot must be developed in C# and the standard .NET Framework and deployed in Microsoft Azure. The Graph Communications SDK supports .NET 6 and .NET Core frameworks. You can't use C++ or Node.js APIs to access real-time media.
* The bot can be hosted within one of the following Azure service environments: * Cloud Service. * Service Fabric with Virtual Machine Scale Sets (VMSS).
- * Infrastructure as a Service (IaaS) Virtual Machine (VM).
+ * Infrastructure as a Service (IaaS) Virtual Machine (VM).
+ * Azure Kubernetes Service (AKS).
* The bot can't be deployed as an Azure web app.
Application-hosted media bots must be directly accessible on the internet. These
* For an Azure Cloud Service, this requires an instance input endpoint. For more information, see [enable communication for role instances in Azure](/azure/cloud-services/cloud-services-enable-communication-role-instances). * For a VM Scale Set, a NAT rule on the load balancer must be configured. For more information, see [virtual networks and virtual machines in Azure](/azure/virtual-machines/windows/network-overview).
-* Application-hosted media bots aren't supported by the Bot Framework Emulator.
+* Bot Framework Emulator doesn't support application-hosted media bots.
The next section provides details on scalability and performance considerations of application-hosted media bots.
The application-hosted media bots require the following scalability and performa
* Application-hosted media bots require more compute and network (bandwidth) capacity than messaging bots and may incur higher operational costs. A real-time media bot developer must carefully measure the bot's scalability, and ensure the bot doesn't accept more simultaneous calls than it can manage. A video-enabled bot may be able to sustain only one or two concurrent media sessions per CPU core (if using the "raw" RGB24 or NV12 video formats). * The Real-time Media Platform doesn't currently take advantage of any Graphics Processing Units (GPU) available on the VM to off-load H.264 video encoding/decoding. Instead, video encode and decode are done in software on the CPU. If a GPU is available, the bot may take advantage of it for its own graphics rendering, for example, if the bot is using a 3D graphics engine.
-* The VM instance hosting the real-time media bot must have at least 2 CPU cores. For Azure, a Dv2-series virtual machine is recommended. For other Azure VM types, a system with four virtual CPUs (vCPU) is the minimum size required. Detailed information about Azure VM types is available in the [Azure documentation](/azure/virtual-machines/windows/sizes-general).
+* The VM instance hosting the real-time media bot must have at least two CPU cores. For Azure, a Dv2-series virtual machine is recommended. For other Azure VM types, a system with four virtual CPUs (vCPU) is the minimum size required. Detailed information about Azure VM types is available in the [Azure documentation](/azure/virtual-machines/windows/sizes-general).
## Code sample
Application-hosted media bots samples are as follows:
* [Graph Calling SDK Documentation](https://microsoftgraph.github.io/microsoft-graph-comms-samples/docs/) * [Sample applications](https://github.com/microsoftgraph/microsoft-graph-comms-samples/tree/master/Samples/V1.0Samples/LocalMediaSamples)
-* The bots require more compute and network bandwidth capacity than messaging bots and incur higher operational costs. A real-time media bot developer must carefully measure the bot's scalability, and ensure the bot doesn't accept more simultaneous calls than it can manage. A video-enabled bot can sustain only one or two concurrent media sessions per CPU core if using the raw RGB24 or NV12 video formats.
-* The Real-time Media Platform doesn't currently take advantage of any Graphics Processing Units (GPU) available on the VM to off-load H.264 video encoding or decoding. Instead, video encode and decode are done in software on the CPU. If a GPU is available, the bot takes advantage of it for its own graphics rendering, for example, if the bot is using a 3D graphics engine.
-* The VM instance hosting the real-time media bot must have at least 2 CPU cores. For Azure, a Dv2-series virtual machine is recommended. For other Azure VM types, a system with 4 virtual CPUs (vCPU) is the minimum size required. For more information about Azure VM types, see [Azure documentation](/azure/virtual-machines/windows/sizes-general).
platform Add Authentication https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/bots/how-to/authentication/add-authentication.md
For more information about how the Azure Bot Service handles authentication, see
In this article you'll learn: -- **How to create an authentication-enabled bot**. You'll use [cs-auth-sample][teams-auth-bot-cs] to handle user sign-in credentials and the generating the authentication token.
+- **How to create an authentication-enabled bot**. Use [cs-auth-sample][teams-auth-bot-cs] to handle user sign-in credentials and the generating the authentication token.
- **How to deploy the bot to Azure and associate it with an identity provider**. The provider issues a token based on user sign-in credentials. The bot can use the token to access resources, such as a mail service, which require authentication. For more information, see [Microsoft Teams authentication flow for bots](auth-flow-bot.md). - **How to integrate the bot within Microsoft Teams**. Once the bot is integrated, you can sign in and exchange messages with it in a chat.
In this article you'll learn:
- Knowledge of [bot basics][concept-basics], [managing state][concept-state], the [dialogs library][concept-dialogs], and how to [implement sequential conversation flow][simple-dialog]. - Knowledge of Azure and OAuth 2.0 development.-- The current versions of Microsoft Visual Studio and Git.
+- The latest versions of Microsoft Visual Studio and Git.
- Azure account. If needed, you can create an [Azure free account](https://azure.microsoft.com/free/). - The following sample:
In this article you'll learn:
## Create the resource group
-The resource group and the service plan aren't strictly necessary, but they allow you to conveniently release the resources you create. It's recommended to keep your resources organized and manageable.
+The resource group and the service plan aren't strictly necessary, but they allow you to conveniently release the resources you create. We recommend that you keep your resources organized and manageable.
You use a resource group to create individual resources for the Bot Framework. For performance, ensure that these resources are located in the same Azure region.
You use a resource group to create individual resources for the Bot Framework. F
1. **Resource group**. Enter the name for the resource group. An example could be *TeamsResourceGroup*. Remember that the name must be unique. 1. From the **Region** dropdown menu, select *West US*, or a region close to your applications. 1. Select the **Review and create** button. You should see a banner that reads *Validation passed*.
- 1. Select the **Create** button. It may take a few minutes to create the resource group.
+ 1. Select the **Create** button. It might take a few minutes to create the resource group.
> [!TIP] > As with the resources you'll create later in this tutorial, it's a good idea to pin this resource group to your dashboard for easy access. If you'd like to do so, select the pin icon &#128204; in the upper right of the dashboard.
You use a resource group to create individual resources for the Bot Framework. F
1. **Region**. Select *West US* or a region close to your applications. 1. **Pricing Tier**. Select *Standard S1*, which is the default value. 1. Select the **Review and create** button. You should see a banner that reads *Validation passed*.
- 1. Select **Create**. It may take a few minutes to create the app service plan. The plan is listed in the resource group.
+ 1. Select **Create**. It might take a few minutes to create the app service plan. The plan is listed in the resource group.
## Create Azure Bot resource registration
You need an identity provider for authentication. In this procedure, you use a M
1. In the [**Azure portal**][azure-portal], on the left navigation panel, select **Microsoft Entra ID**. > [!TIP]
- > You'll need to create and register this Microsoft Entra resource in a tenant
- > in which you can consent to delegate permissions requested by an application.
- > For instruction on creating a tenant, see [Access the portal and create a tenant](/azure/active-directory/fundamentals/active-directory-access-create-new-tenant).
+ > You must create and register this Microsoft Entra resource in a tenant in which you can consent to delegate permissions requested by an application. For instructions on creating a tenant, see [Access the portal and create a tenant](/azure/active-directory/fundamentals/active-directory-access-create-new-tenant).
1. In the left panel, select **App registrations**. 1. In the right panel, select the **New registration** tab, in the upper left. 1. Provide the following information:
You need an identity provider for authentication. In this procedure, you use a M
&#x2713; Set the URL to `https://token.botframework.com/.auth/web/redirect`. 1. Select **Register**.
-1. After it's created, Azure displays the **Overview** page for the app. Copy and save the following information to a file:
+1. After Azure creates the app, it displays the **Overview** page for the app. Copy and save the following information to a file:
- 1. The **Application (client) ID** value. You'll use this value later as the *Client ID* when you register this Azure identity application with your bot.
- 1. The **Directory (tenant) ID** value. You'll use this value later as the *Tenant ID* to register this Azure identity application with your bot.
+ 1. The **Application (client) ID** value. Use this value later as the *Client ID* when you register this Azure identity application with your bot.
+ 1. The **Directory (tenant) ID** value. Use this value later as the *Tenant ID* when you register this Azure identity application with your bot.
1. In the left panel, select **Certificates & secrets** to create a client secret for your application.
You need an identity provider for authentication. In this procedure, you use a M
1. Add a description to identify this secret from others you might need to create for this app, such as *Bot identity app in Teams*. 1. Set **Expires** to your selection. 1. Select **Add**.
- 1. Before leaving this page, **record the secret**. You'll use this value later as the *Client secret* when you register your Microsoft Entra application with your bot.
+ 1. Before leaving this page, **record the secret**. Use this value later as the *Client secret* when you register your Microsoft Entra application with your bot.
### Configure the identity provider connection and register it with the bot
You need an identity provider for authentication. In this procedure, you use a M
- If you selected **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts (e.g. Skype, Xbox)** enter the word **common** instead of a tenant ID. Otherwise, the Microsoft Entra app verifies through the tenant whose ID was selected and exclude personal Microsoft accounts.
- h. For **Resource URL**, enter `https://graph.microsoft.com/`. This URL isn't used in the current code sample.
+ h. For **Resource URL**, enter `https://graph.microsoft.com/`. This URL isn't used in the code sample.
i. Leave **Scopes** blank. The following image is an example: :::image type="content" source="../../../assets/images/authentication/auth-bot-identity-connection-adv1.PNG" alt-text="Screenshot shows how to add Teams bot auth bot identity connection adv1.":::
You need an identity provider for authentication. In this procedure, you use a M
1. Complete the form as follows:
- 1. **Name**. Enter a name for the connection. You'll use this name in your bot in the `appsettings.json` file. For example, *BotTeamsAuthADv2*.
+ 1. **Name**. Enter a name for the connection. Use this name in your bot in the `appsettings.json` file. For example, *BotTeamsAuthADv2*.
1. **Service Provider**. Select **Azure Active Directory v2**. Once you select this option, the Azure AD v2 specific fields are displayed. 1. **Client id**. Enter the Application (client) ID that you recorded for your Azure identity provider app. 1. **Client secret**. Enter the secret that you recorded for your Azure identity provider app.
With the preliminary settings done, let's focus on the creation of the bot to us
- Set `MicrosoftAppId` to the **bot App ID** you saved at the time of the bot registration. - Set `MicrosoftAppPassword` to the **customer secret** you saved at the time of the bot registration.
- Depending on the characters in your bot secret, you may need to XML escape the password. For example, any ampersands (&) will need to be encoded as `&amp;`.
+ Depending on the characters in your bot secret, you might need to XML escape the password. For example, any ampersands (&) must be encoded as `&amp;`.
[!code-json[appsettings](~/../Microsoft-Teams-Samples/samples/bot-teams-authentication/csharp/appsettings.json?range=1-5)]
With the preliminary settings done, let's focus on the creation of the bot to us
- Set `MicrosoftAppId` to the **bot App ID** you saved at the time of the bot registration. - Set `MicrosoftAppPassword` to the **customer secret** you saved at the time of the bot registration. - Set the `connectionName` to the name of the identity provider connection.
- Depending on the characters in your bot secret, you may need to XML escape the password. For example, any ampersands (&) will need to be encoded as `&amp;`.
+ Depending on the characters in your bot secret, you might need to XML escape the password. For example, any ampersands (&) must be encoded as `&amp;`.
[!code-javascript[settings](~/../Microsoft-Teams-Samples/samples/bot-conversation-sso-quickstart/js/.env)]
With the preliminary settings done, let's focus on the creation of the bot to us
- Set `ConnectionName` to the name of the OAuth connection setting you added to your bot. - Set `MicrosoftAppId` and `MicrosoftAppPassword` to your bot's app ID and app secret.
- Depending on the characters in your bot secret, you may need to XML escape the password. For example, any ampersands (&) will need to be encoded as `&amp;`.
+ Depending on the characters in your bot secret, you might need to XML escape the password. For example, any ampersands (&) must be encoded as `&amp;`.
[!code-python[config](~/../Microsoft-Teams-Samples/samples/bot-teams-authentication/python/config.py?range=14-16)]
Alternatively, while in Visual Studio, you can follow these steps:
## Test the bot using the Emulator
-If you haven't done it already, install the [Microsoft Bot Framework Emulator](https://aka.ms/bot-framework-emulator-readme). See also [Debug with the Emulator](/azure/bot-service/bot-service-debug-emulator?view=azure-bot-service-4.0&tabs=csharp&preserve-view=true).
+Install [Microsoft Bot Framework Emulator](https://aka.ms/bot-framework-emulator-readme). For more information, see [test and debug with the Emulator](/azure/bot-service/bot-service-debug-emulator?view=azure-bot-service-4.0&tabs=csharp&preserve-view=true).
In order for the bot sample sign-in to work, you must configure the Emulator.
Once the user does so, the provider generates a user token and sends it to the b
### Test the bot locally
-After you've configured the authentication mechanism, you can perform the actual bot testing.
+After you configure the authentication mechanism, you can perform the actual bot testing.
1. Run the bot sample locally on your machine, via Visual Studio for example. 1. Start the Emulator.
After you've configured the authentication mechanism, you can perform the actual
1. **Using authentication tokens**. &#x2713; You're signed in based on your credentials.
- The following image is an example of the bot UI after you've logged in:
+ The following image is an example of the bot UI after you sign in:
- :::image type="content" source="../../../assets/images/authentication/auth-bot-login-emulator.PNG" alt-text="Screenshot shows an example of the bot UI after you've logged in.":::
+ :::image type="content" source="../../../assets/images/authentication/auth-bot-login-emulator.PNG" alt-text="Screenshot shows an example of the bot UI after you sign in.":::
1. If you select **Yes** when the bot asks *Would you like to view your token?*, you get the following response:
and when for these, and just reference that from here, along with the set of ste
1. A pop-up dialog appears to **Confirm Open URL** to authenticate the bot's user (you). 1. Select **Confirm**. 1. If asked, select the applicable user's account.
- The following image is an example of the bot UI after you've logged in:
+ The following image is an example of the bot UI after you sign in:
- :::image type="content" source="../../../assets/images/authentication/auth-bot-login-deployed.PNG" alt-text="Screenshot shows an example of the Teams bot UI after you've logged in.":::
+ :::image type="content" source="../../../assets/images/authentication/auth-bot-login-deployed.PNG" alt-text="Screenshot shows an example of the Teams bot UI after you sign in.":::
1. Select the **Yes** button to display your authentication token. The following image is an example:
that you can use to exchange messages with the bot.
### Testing the bot locally in Teams
-Teams is an entirely cloud-based product, it requires all services it accesses to be available from the cloud using HTTPS endpoints. Therefore, to enable the bot (our sample) to work in Teams, you need to either publish the code to the cloud of your choice, or make a locally running instance externally accessible via a **tunneling** tool. We recommend [ngrok](https://ngrok.com/download), which creates an externally addressable URL for a port you open locally on your machine.
+Teams is an entirely cloud-based product. It requires all services it accesses to be available from the cloud using HTTPS endpoints. Therefore, to enable the bot (our sample) to work in Teams, you need to either publish the code to the cloud of your choice, or make a locally running instance externally accessible via a **tunneling** tool. We recommend [ngrok](https://ngrok.com/download), which creates an externally addressable URL for a port you open locally on your machine.
To set up ngrok in preparation for running your Teams app locally, follow these steps: 1. In a terminal window, go the directory where you have `ngrok.exe` installed. We suggest setting the *environment variable* path to point to it.
This manifest contains information needed by Teams to connect with the bot:
} ```
-With authentication, Teams behaves slightly differently than other channels.
+With authentication, Teams behaves differently than other channels.
### Handling Invoke Activity
The *Invoke Activity* must be forwarded to the dialog if the **OAuthPrompt** is
**dialogs/main_dialog.py**
-Within a dialog step, use `begin_dialog` to start the OAuth prompt, which asks the user to sign in.
--- If the user is already signed in, it generates a token response event, without prompting the user.-- Otherwise, it prompts the user to sign in. The Azure Bot Service sends the token response event after the user attempts to sign in.
+Within a dialog step, use `begin_dialog` to start the OAuth prompt, which asks the user to sign in. If the user is already signed in, it generates a token response event, without prompting the user. Otherwise, it prompts the user to sign in. The Azure Bot Service sends the token response event after the user attempts to sign in.
[!code-python[Add OAuthPrompt](~/../Microsoft-Teams-Samples/samples/bot-teams-authentication/python/dialogs/main_dialog.py?range=48-49)]
platform Send Proactive Messages https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/bots/how-to/conversations/send-proactive-messages.md
Cache-Control: no-store, must-revalidate, no-cache
## Best practices for proactive messaging
-Sending proactive messages to the users is an effective way to communicate with your users. However, from the user's perspective, the message appears unprompted. If there's a welcome message, it will be the first time that theyΓÇÖve interacted with your app. It's important to use this functionality and provide the complete information to the user to understand the purpose of this message.
+Sending proactive messages to the users is an effective way to communicate with your users. However, from the user's perspective, the message appears unprompted. If there's a welcome message, it marks their first interaction with your app. It's important to use this functionality and provide the complete information to the user to understand the purpose of this message.
### Welcome messages
platform Subscribe To Conversation Events https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/bots/how-to/conversations/subscribe-to-conversation-events.md
export class MyBot extends TeamsActivityHandler {
The message your bot receives when the bot is added to a team. > [!NOTE]
-> In this payload, `conversation.id` and `channelData.settings.selectedChannel.id` will be the id of the channel that the user selected during app installation or where installation was triggered from.
+> In this payload, `conversation.id` and `channelData.settings.selectedChannel.id` are the IDs of the channel that the user selected during app installation or from which the installation was triggered.
```json {
Use the `installationUpdate` event to send an introductory message from your bot
Similar to the `conversationUpdate` event that's sent when bot is added to a team, the conversation.id of the `installationUpdate` event is set to the id of the channel selected by a user during app installation or the channel where the installation occurred. The id represents the channel where the user intends for the bot to operate and must be used by the bot when sending a welcome message. For scenarios where the ID of the General channel is explicitly required, you can get it from `team.id` in `channelData`.
-In this example, the `conversation.id` of the `conversationUpdate` and `installationUpdate` activities will be set to the ID of the Response channel in the Daves Demo team.
+In this example, the `conversation.id` of the `conversationUpdate` and `installationUpdate` activities is set to the ID of the Response channel in the Daves Demo team.
![Create a selected channel](~/assets/videos/addteam.gif)
platform Deep Link Application https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/build-and-test/deep-link-application.md
if(appInstallDialog.isSupported()) {
else { /* handle case where capability isn't supported */ } ```
-For more information about the `appInstallDialog` module, see [appInstallDialog module](/javascript/api/@microsoft/teams-js/appinstalldialog?view=msteams-client-js-latest#@microsoft-teams-js-appinstalldialog-openappinstalldialog&preserve-view=true).
+For more information about the `appInstallDialog` module, see [appInstallDialog module](/javascript/api/@microsoft/teams-js/appinstalldialog?view=msteams-client-js-latest&preserve-view=true#@microsoft-teams-js-appinstalldialog-openappinstalldialog).
# [TeamsJS v1](#tab/teamsjs-v1)
You can configure deep links in your app through TeamsJS to allow the app users
# [TeamsJS v2](#tab/teamsjs-v2)
-You can trigger navigation from your tab using the [pages.navigateToApp()](/javascript/api/@microsoft/teams-js/pages#@microsoft-teams-js-pages-navigatetoapp) function as shown in the following code:
+You can trigger navigation from your tab using the [pages.navigateToApp()](/javascript/api/@microsoft/teams-js/pages?view=msteams-client-js-latest&preserve-view=true#@microsoft-teams-js-pages-navigatetoapp) function as shown in the following code:
```javascript if (pages.isSupported()) {
if (pages.isSupported()) {
else { /* handle case where capability isn't supported */ } ```
-For more information about navigation within a tab app, see [navigate within a tab app](../../tabs/how-to/tab-navigation.md). For more information about using the pages capability, see [pages.navigateToApp()](/javascript/api/@microsoft/teams-js/pages#@microsoft-teams-js-pages-navigatetoapp) and the [pages](/javascript/api/@microsoft/teams-js/pages) namespace for other navigation options. If needed directly open a deep link using the [app.openLink()](/javascript/api/@microsoft/teams-js/app#@microsoft-teams-js-app-openlink) function.
+For more information about navigation within a tab app, see [navigate within a tab app](../../tabs/how-to/tab-navigation.md). For more information about using the pages capability, see [pages.navigateToApp()](/javascript/api/@microsoft/teams-js/pages?view=msteams-client-js-latest&preserve-view=true#@microsoft-teams-js-pages-navigatetoapp) and the [pages](/javascript/api/@microsoft/teams-js/pages?view=msteams-client-js-latest&preserve-view=true) namespace for other navigation options. If needed directly open a deep link using the [app.openLink()](/javascript/api/@microsoft/teams-js/app?view=msteams-client-js-latest&preserve-view=true#@microsoft-teams-js-app-openlink) function.
# [TeamsJS v1](#tab/teamsjs-v1)
You can share deep links to entities in Teams apps to navigate to the content an
# [TeamsJS v2](#tab/teamsjs-v2)
-Add a **copy link** action to each item in whatever way best suits your UI. When the user takes this action, call [`pages.shareDeepLink()`](/javascript/api/@microsoft/teams-js/pages?view=msteams-client-js-latest#@microsoft-teams-js-pages-sharedeeplink&preserve-view=true) to display a dialog containing a link that the user can copy to the clipboard. When you make this call, pass an ID for your item. You get it back in [context](~/tabs/how-to/access-teams-context.md) when the link is followed and your tab is reloaded.
+Add a **copy link** action to each item in whatever way best suits your UI. When the user takes this action, call [`pages.shareDeepLink()`](/javascript/api/@microsoft/teams-js/pages?view=msteams-client-js-latest&preserve-view=true#@microsoft-teams-js-pages-sharedeeplink) to display a dialog containing a link that the user can copy to the clipboard. When you make this call, pass an ID for your item. You get it back in [context](~/tabs/how-to/access-teams-context.md) when the link is followed and your tab is reloaded.
```javascript pages.shareDeepLink({ subPageId: <subPageId>, subPageLabel: <subPageLabel>, subPageWebUrl: <subPageWebUrl> })
You need to replace the following parameters with the appropriate information:
* `subPageLabel`: A label for the item to use for displaying the deep link. * `subPageWebUrl`: A fallback URL to use if the client can't render the page.
-For more information, see [pages.shareDeepLink()](/javascript/api/@microsoft/teams-js/pages?view=msteams-client-js-latest#@microsoft-teams-js-pages-sharedeeplink&preserve-view=true).
+For more information, see [pages.shareDeepLink()](/javascript/api/@microsoft/teams-js/pages?view=msteams-client-js-latest&preserve-view=true#@microsoft-teams-js-pages-sharedeeplink).
# [TeamsJS v1](#tab/teamsjs-v1)
platform App Growth Lifecycle https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/deploy-and-publish/appsource/post-publish/app-growth/app-growth-lifecycle.md
Growing your app is a journey. It's a process thatΓÇÖs not overnight and goes th
- Building awareness for the app through impactful customer and seller marketing channels. - Building readiness of product, sales, customer success and support functions for the appΓÇÖs upcoming adoption, growth, and ROI realization.
- Most growth and GTM activities during this stage are pilots to discover effectiveness, learning and execution rhythms. When the app crosses the *traction barrier*, one can say it has achieved product market fit in Teams marketplace and ecosystem.
+ Most growth and GTM activities during this stage are pilots to discover effectiveness, learning, and execution rhythms. When the app crosses the *traction barrier*, one can say it has achieved product market fit in Teams marketplace and ecosystem.
-- **Scale stage**: This stage encompasses scaling in the market on the back of activation in existing customers who use the SaaS app outside Teams and selling to new customers through product-led, sales-led, and channel-led initiatives. Growth and GTM activities become more programmatic at this stage. When the app crosses the scale barrier, often also referred to as the *growth barrier*, one can conclude the apps is ready to deliver on the business goals and starts to deliver ROI on engineering and GTM investments.
+- **Scale stage**: This stage encompasses scaling in the market on the back of activation in existing customers who use the Software as a Service (SaaS) app outside Teams and selling to new customers through product-led, sales-led, and channel-led initiatives. Growth and GTM activities become more programmatic at this stage. When the app crosses the scale barrier, often also referred to as the *growth barrier*, one can conclude the apps is ready to deliver on the business goals and starts to deliver ROI on engineering and GTM investments.
- **Succeed stage**: The final stage of the Teams collaborative app lifecycle is where the app moves from being a product integration built on Teams into a full-fledged strategic product line just as the core SaaS product for the web browser or native apps for Windows or mobile phones.
Growing your app is a journey. It's a process thatΓÇÖs not overnight and goes th
- Optimizing customer sales and conversion based on PQLs - Investing further in more user-valuable scenarios or experiences inside the app
-There may be examples of developers short circuiting the lifecycle to jump across stages, for example, directly starting to monetize their app after launch using their version 1 experience itself. It's recommended that you follow a stage-by-stage approach as a best practice that most developers follow to derive the best ROI from their Teams app journey.
+There might be examples of developers short circuiting the lifecycle to jump across stages, for example, directly starting to monetize their app after launch using their version 1 experience itself. It's recommended that you follow a stage-by-stage approach as a best practice that most developers follow to derive the best ROI from their Teams app journey.
## Review the Teams partners GTM guide
-Get started first by reviewing (and sharing with your GTM leaders) this high-level visual [Guide to ISV success with Microsoft for Teams Partners](https://aka.ms/teamsappsGTMguide) flipbook. This resource orients you about how to plan and strategize your Teams app offering, insights about key industry-wise personas and trends, how to define your appΓÇÖs value proposition, create content to maximize your appΓÇÖs reach among customers and sellers, access various partner benefits available to you, how to visualize a simplistic customer journey with your app, how to align your marketing activities with key opportunities from Microsoft and how to sell your app via MicrosoftΓÇÖs global marketplace. As you can see from the flipbook, Microsoft partners with app developers once theyΓÇÖve launched their apps on the marketplace by offering select, programmatic GTM investments depending on the appΓÇÖs maturity in the market. You're encouraged to get in touch with your Microsoft field, account or engineering representatives before spending cycles on your app growth planning and execution, so that you can get the most appropriate guidance youΓÇÖre eligible for.
+Get started first by reviewing (and sharing with your GTM leaders) this high-level visual [Guide to ISV success with Microsoft for Teams Partners](https://aka.ms/teamsappsGTMguide) flipbook. This resource orients you about how to plan and strategize your Teams app offering, insights about key industry-wise personas and trends, how to define your appΓÇÖs value proposition, create content to maximize your appΓÇÖs reach among customers and sellers, access various partner benefits available to you, how to visualize a simplistic customer journey with your app, how to align your marketing activities with key opportunities from Microsoft and how to sell your app through MicrosoftΓÇÖs global marketplace. As you can see from the flipbook, Microsoft partners with app developers once theyΓÇÖve launched their apps on the marketplace by offering select, programmatic GTM investments depending on the appΓÇÖs maturity in the market. You're encouraged to get in touch with your Microsoft field, account, or engineering representatives before spending cycles on your app growth planning and execution, so that you can get the most appropriate guidance youΓÇÖre eligible for.
## Step-by-step guide to grow your app
It's time now to expand on the preview provided by the flipbook above! The follo
Developers are encouraged to follow the guidance here to grow their app and drive success for their investments on the Teams marketplace and ecosystem. However, the guidance provided can't be considered comprehensive. It's recommended that developers must always adapt these growth initiatives in the context best known to them based on: - The nature of business.-- The app theyΓÇÖve launched on Teams.
+- The app launched on Teams.
- The target customer personas. <!--
You can plan your app's growth through the app lifecycle:
[Back to top](#growth-lifecycle-for-your-app)
+## Best practices for app growth and adoption
+
+To accelerate the growth of third-party apps and increase the adoption rates, consider the following strategies:
+
+- **Leverage a freemium model**: It's proven that a basic freemium account significantly improves user conversion rates. It allows users to experience the core benefits of your app without initial costs and increases the chances of conversion to paid plans. It's recommended to offer a free trial period of 30 days.
+
+- **Integrate a shareable call-to-action**: Implement a dynamic call-to-action (CTA) button within an Adaptive Card. It enables users to share your app effortlessly, to onboard their team members, thereby fostering organic growth.
+
+- **Implement adoption change management**: Consistent communication with users is a key. Update users regularly about the new and existing features through email, which helps maintain their interest and encourages continued use of your app.
+
+- **Identify and resolve blockers**: Proactively address and resolve any issues to drive app adoption. Collaborate with partners to gather feedback and eliminate any blockers that hinder the user experience.
+
+- **Embrace growth marketing**: Develop a dynamic growth marketing strategy tailored for SaaS offers that focuses on driving usage through data-driven techniques and user engagement analytics.
+
+ Here are a few recommendations for growth marketing strategies:
+
+ - Send active notifications to users through email with a CTA to the Teams app.
+ - Conduct targeted campaigns on social media with direct links to the Teams app.
+ - Secure a premium placement for the Independent software vendor (ISV) Teams app on SaaS platforms with a CTA to the Teams app.
+ - Create informative blog posts, tutorials, or webinars that highlights the unique features of your Teams app.
+
+By adopting these methods, you can observe an increase in app installations, sustained engagement, and growth over time. For more information, see [educate users and drive adoption change management for your app](~/promote-app-adoption.md#step-3-educate-users-and-drive-adoption-change-management-for-your-app).
+ ## Next step > [!div class="nextstepaction"]
platform Browser Device Permissions https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/device-capabilities/browser-device-permissions.md
Title: Device permissions for the browser
-description: app that requires device permissions, such as camera or microphone access, now require users to manually grant permission at a per app level in the web browser.
+description: App that requires device permissions, such as camera or microphone access, now require users to manually grant permission at a per app level in the web browser.
localization_priority: medium Last updated 03/21/2023
If your Teams app has declared in the [application manifest](native-device-permi
After the **App permissions** option is selected, a pop-up appears where the user can enable the permissions button.
-A user will need to enable these permissions in the browser for these permissions to take effect. After user changes the appΓÇÖs device permissions in the browser, they're prompted to reload the application in Teams.
+A user needs to enable these permissions in the browser for these permissions to take effect. After user changes the appΓÇÖs device permissions in the browser, they're prompted to reload the application in Teams.
> [!IMPORTANT] > You must make users aware of where to go to enable these **App permissions** in Teams.
Teams app that requires device permissions in the browser must show instructions
|Sample name | Description | Node.js | Manifest |-|--|--|--|
-| Tab device permissions for browser | The sample shows how to show the device permissions using TeamsJS SDK and browser api's. | [View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/tab-device-permissions/nodejs) | [View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/tab-device-permissions/nodejs/demo-manifest/tab-device-permissions.zip)
+| Tab device permissions for browser | The sample shows how to show the device permissions using TeamsJS SDK and browser APIs. | [View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/tab-device-permissions/nodejs) | [View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/tab-device-permissions/nodejs/demo-manifest/tab-device-permissions.zip)
## Step-by-step guide
Follow the [step-by-step guide](../../sbs-tab-device-permissions.yml) to grant t
## See also * [Device capabilities overview](device-capabilities-overview.md)
-* [Request device permissions](native-device-permissions.md)
* [App manifest schema for Teams](../../resources/schem)
platform Location Capability https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/device-capabilities/location-capability.md
You must ensure to handle these errors appropriately in your Teams app. The foll
## See also
-* [Device capabilities](device-capabilities-overview.md)
* [Integrate media capabilities](media-capabilities.md) * [Integrate location capabilities](location-capability.md) * [Integrate People Picker](people-picker-capability.md)
platform Preapproval Instruction Docs https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/graph-api/rsc/preapproval-instruction-docs.md
+
+ Title: Preapproval of RSC permissions
+description: In this article, learn more about to create, manage, and delete preapprovals of RSC enabled app in Microsoft Teams.
+ms.localizationpriority: medium
+++ Last updated : 08/29/2023++
+# Preapproval of RSC permissions
+
+Resource-Specific Consent (RSC) permissions preapproval provides admins with granular control over the RSC permissions an app can request upon installation. RSC permissions are granted to an app at the time the app gets installed. Through the use of pre-approval policies, admins can declare ahead of time the maximum permissions an app can request from the end user and be consented to during installation time.
+
+For an RSC permission pre-approval policy to take effect for an app, the admin must ensure that the app is enabled (installable) in their organization. If the app is not installable, then the permission pre-approval for that specific app becomes irrelevant. For more information on enabling apps in Teams Admin Center, see [managing apps in Teams Admin Center](/microsoftteams/apps-in-teams).
+
+Admins can create a detailed preapproval policy, based on the app ID, permissions, and the sensitivity of the accessed data. Preapproval of RSC permissions are designed for admins seeking to create advanced custom policies for their organization.
+
+By default, the preapproval policies are managed by Microsoft, and we recommend that organizations maintain `ManagedByMicrosoft` state. This state allows Microsoft's security team to deliver the best security for your organization.
+
+> [!NOTE]
+>
+> * Preapproval of RSC permissions are available only in [public developer preview](../../resources/dev-preview/developer-preview-intro.md).
+> * Preapproval of RSC permissions and its operating procedures are subject to change.
+
+## Set up PowerShell to manage preapproval of RSC permissions
+
+Preapproval of RSC permissions are managed through Microsoft Graph PowerShell. You can learn more about managing Microsoft Teams with PowerShell [here](/powershell/microsoftgraph/get-started).
+
+To create, manage, and delete RSC preapproval policies, you must grant the following permissions to the PowerShell cmdlet:
+
+* `TeamworkAppSettings.ReadWrite.All`
+* `Policy.ReadWrite.Authorization`
+* `AppCatalog.Read.All`
+* `Policy.ReadWrite.PermissionsGrant`
+* `InformationProtectionPolicy.Read`
+* `Application.ReadWrite.All`
+
+> [!NOTE]
+> You need global admin level privileges to connect Graph with your organization for the first time.
+
+The following is an example of the PowerShell setup to manage preapproval policies of RSC permissions:
+
+```powershell
+Connect-MgGraph -Scopes @('TeamworkAppSettings.ReadWrite.All', 'Policy.ReadWrite.Authorization', 'AppCatalog.Read.All', 'Policy.ReadWrite.PermissionGrant', 'InformationProtectionPolicy.Read', 'Application.ReadWrite.All')
+```
+
+## Allow RSC permissions for apps in your organization
+
+For both team and chat specific RSC permissions, admins can set four different states for their organization. Apart from `DisabledForAllApps` state, all the other states allow RSC permissions to different degrees. These states can be set through `Set-MgBetaChatRscConfiguration` and `Set-MgBetaTeamRscConfiguration` cmdlets.
+
+For example, to allow RSC permissions for all unblocked apps in your organization, use the `Set-MgBetaTeamRscConfiguration -State EnabledForAllApps` cmdlets.
+
+The following are the different states that allow and disallow RSC permissions in your organization:
+
+|Configuration| Description|
+|||
+|`ManagedByMicrosoft`|A dynamic policy administered by Microsoft. It might be updated based on best security practices. By default, this state enables RSC for all unblocked apps in the organization. |
+|`EnabledForAllApps`|Users can consent to RSC permissions for any unblocked apps in the organization. |
+|`EnabledForPreApprovedAppsOnly`| Users in the organization can consent to only those unblocked apps that also have an explicit preapproval policy associated with them. This option must be used only if the admin wants to explicitly limit the allowed RSC permissions on a per app basis. |
+|`DisabledForAllApps`| Users can't consent to the RSC permissions required by any app even if the app is unblocked in the organization. **Warning:** This state doesn't allow installation for apps that need RSC permissions. |
+
+ >[!WARNING]
+ > If you change your chat or team RSC configuration to `DisabledForAllApps`, it disables preapproval in your tenant and users run into errors when they install RSC enabled apps.
+
+## Enable RSC permissions for all unblocked apps in the organization
+
+You can enable RSC for all unblocked apps in your organization using PowerShell cmdlets by changing your RSC permission setting state to `EnabledForAllApps`. You can set the state for both chat and team RSC settings in your organization as follows:
+
+```powershell
+Set-MgBetaTeamRscConfiguration -State EnabledForAllApps
+Set-MgBetaChatRscConfiguration -State EnabledForAllApps
+```
+
+## Enable RSC for a specific set of apps only
+
+You can create preapproval policy for specific apps with the permissions and sensitivity labels of the data you wish you preapprove. The following sections show how to create a preapproval policy with and without a sensitivity label attached.
+
+### Create a preapproval policy based on app ID and permissions
+
+Preapproval policies allow users in your organization to consent to RSC permissions for a specific set of apps. This implies that you can determine which RSC-enabled apps your organization can access, without limiting RSC permissions for all apps within your organization.
+
+To create a preapproval policy without a sensitivity label, ensure that you have the following information:
+
+* Teams App ID.
+* The RSC permissions associated with the app.
+* Team or Global admin privilege in your tenant.
+
+You can use PowerShell cmdlets to create a preapproval policy. To create the cmdlet, you must get the information mentioned earlier with the `New-MgBetaTeamAppPreApproval` command and specify the one of the following RSC permissions you want to preapprove in the cmdlet:
+
+|Configuration| Description|
+|||
+|`ResourceSpecificApplicationPermissionsAllowedForChats`|Use this configuration when creating a preapproval policy for RSC permissions for a chat. For a list of all permissions, see [RSC permissions](resource-specific-consent.md).|
+|`ResourceSpecificApplicationPermissionsAllowedForTeams`|Use this configuration when creating a preapproval policy for RSC permissions for a team. For a list of all permissions, see [RSC permissions](resource-specific-consent.md).|
+
+**Preapprove an app with team RSC permissions**
+
+```powershell
+New-MgBetaTeamAppPreapproval -TeamsAppId c626ce8b-6d15-4c07-bfb1-a5fd0bc3c20e -ResourceSpecificApplicationPermissionsAllowedForTeams @('ChannelMessage.Read.Group') -TeamLevelSensitivityLabelCondition AnySensitivityLabel
+```
+
+**Preapprove an app with chat RSC permissions**
+
+```powershell
+New-MgBetaTeamAppPreapproval -TeamsAppId c626ce8b-6d15-4c07-bfb1-a5fd0bc3c20e -ResourceSpecificApplicationPermissionsAllowedForChats @('OnlineMeeting.ReadBasic.Chat')
+```
+
+**Preapprove an app with both team and chat RSC permissions**
+
+```powershell
+New-MgBetaTeamAppPreapproval -TeamsAppId c626ce8b-6d15-4c07-bfb1-a5fd0bc3c20e -ResourceSpecificApplicationPermissionsAllowedForChats @('OnlineMeeting.ReadBasic.Chat') -ResourceSpecificApplicationPermissionsAllowedForTeams @(ΓÇÿChannelMessage.Read.GroupΓÇÖ) -TeamLevelSensitivityLabelCondition AnySensitivityLabel
+```
+
+>[!WARNING]
+> Your preapproval policy creation might fail if you link the wrong permissions with the wrong permission type in your cmdlet. Ensure that the chat RSC permissions end with `.Chat` and the team RSC permissions end with `.Group`.
+
+### Create a preapproval policy based on app ID, permissions and sensitivity labels
+
+Preapproval policies can be created to preapprove RSC permissions against certain sensitivity labels in your tenant. This enables you to control the data that RSC-enabled apps can access. Here, you can learn the process to create a preapproval policy based on the sensitivity of the data.
+
+You can also create a preapproval policy for specific permissions in addition to specific sensitivity labels. You can allow all RSC consent requests to be approved for a particular permission. To create a preapproval policy, ensure that you have the following information:
+
+* Teams App ID.
+* The RSC permissions associated with the app.
+* The sensitivity label ID associated with the sensitivity label. This isn't required if you want the policy to apply to all sensitivity labels or if you preapprove only chat RSC permissions.
+* Team or Global admin privilege in your tenant.
+
+You can use PowerShell cmdlets to create a preapproval policy. To create the cmdlet, you must get the information mentioned earlier with the `New-MgBetaTeamAppPreApproval` command and specify the one of the following RSC permissions you want to preapprove in the cmdlet:
+
+|Configuration| Description|
+|||
+|`ResourceSpecificApplicationPermissionsAllowedForChats`|Use this configuration when you create a preapproval policy for RSC permissions for a chat. For the list of all permissions, see [RSC permissions](resource-specific-consent.md).|
+|`ResourceSpecificApplicationPermissionsAllowedForTeams`|Use this configuration when you create a preapproval policy for RSC permissions for a team. For the list of all permissions, see [RSC permissions](resource-specific-consent.md).|
+
+You can use the `SpecificSensitivityLabel` arguments to define specific sensitivity labels to apply the RSC preapproval policy to.
+
+The following are an example of cmdlets that use these arguments:
+
+```powershell
+New-MgBetaTeamAppPreapproval -TeamsAppId c626ce8b-6d15-4c07-bfb1-a5fd0bc3c20e -ResourceSpecificApplicationPermissionsAllowedForTeams @('ChannelMessage.Read.Group') -TeamLevelSensitivityLabelCondition SpecificSensitivityLabel -SpecificSensitivityLabelIdsApplicableToTeams @('4de11089-adb9-4be8-9b7a-8336be68f3c4')
+```
+
+### Change RSC configuration to only allow apps with custom defined preapproval policies
+
+After creating your preapproval policies, change your organization's RSC settings to use the new policy. This setting is more restrictive and might cause some apps not to function for your end users. To make this change, change the state of your organization's RSC settings. The following example shows the required PowerShell cmdlets:
+
+```powershell
+Set-MgBetaTeamRscConfiguration -State EnabledForPreApprovedAppsOnly
+Set-MgBetaChatRscConfiguration -State EnabledForPreApprovedAppsOnly
+```
+
+## Manage the existing preapproval policies
+
+After you create a preapproval policy, you can modify the policy to change the permissions and the sensitivity label of the policy. When apps are released with additional permissions, you must update the preapproval policy for that app to add the new permissions, ensuring that the app can be installed in your tenant. You need the same information to manage an existing preapproval policy and create a new preapproval policy.
+
+You can also delete an existing preapproval policy if you want to stop preapproving an existing appΓÇÖs RSC permission.
+
+### Update an existing preapproval policy
+
+You can update a preapproval policy with the `Update-MgBetaTeamAppPreApproval` cmdlet. When you specify the permissions to be updated, you must distinguish the type of RSC permissions.
+
+The following RSC configurations are available to manage an existing preapproval policy:
+
+|Configuration| Description|
+|||
+|`ResourceSpecificApplicationPermissionsAllowedForChats`| Use this configuration when you create a preapproval policy for RSC permissions for a chat. For the list of all permissions, see [RSC permissions](resource-specific-consent.md).|
+|`ResourceSpecificApplicationPermissionsAllowedForTeams`| Use this configuration when you create a preapproval policy for RSC permissions for a team, use this configuration. For the list of all permissions, see [RSC permissions](resource-specific-consent.md).|
+
+#### Update the preapproval policy for chat RSC
+
+```powershell
+Update-MgBetaTeamAppPreapproval -TeamsAppId c626ce8b-6d15-4c07-bfb1-a5fd0bc3c20e -ResourceSpecificApplicationPermissionsAllowedForChats @('OnlineMeeting.ReadBasic.Chat', 'TeamsAppInstallation.Read.Chat')
+```
+
+#### Update the preapproval policy for team RSC
+
+```powershell
+Update-MgBetaTeamAppPreapproval -TeamsAppId c626ce8b-6d15-4c07-bfb1-a5fd0bc3c20e -ResourceSpecificApplicationPermissionsAllowedForTeams @('ChannelMessage.Read.Group', 'TeamsAppInstallation.Read.Group') -TeamLevelSensitivityLabelCondition AnySensitivityLabel
+```
+
+If you want to change your preapproval policy from a defined sensitivity label to all sensitivity labels, you must reset the value of the `SpecificSensitivityLabel` argument in your preapproval policy. You can do so by setting the `AnySensitivityLabel` argument to null as follows:
+
+```powershell
+Update-MgBetaTeamAppPreapproval -TeamsAppId c626ce8b-6d15-4c07-bfb1-a5fd0bc3c20e -ResourceSpecificApplicationPermissionsAllowedForTeams @('ChannelMessage.Read.Group') -TeamLevelSensitivityLabelCondition AnySensitivityLabel -SpecificSensitivityLabelIdsApplicableToTeams $null
+```
+
+ >[!NOTE]
+ > You must include all relevant permissions in your `Update-MgBetaTeamAppPreApproval` cmdlet, even if youΓÇÖve already declared them in the existing preapproval.
+
+### Delete an existing preapproval policy
+
+If you want to stop preapproving an existing appΓÇÖs RSC permission, you can delete the preapproval policy for that app. To delete a preapproval policy, ensure that you have the App ID.
+
+You can delete the preapproval policy associated with an app by using the following PowerShell cmdlet:
+
+`Remove-MgBetaTeamAppPreapproval`
+
+```powershell
+Remove-MgBetaTeamAppPreapproval -TeamsAppId c626ce8b-6d15-4c07-bfb1-a5fd0bc3c20e
+```
+
+## See also
+
+* [Grant RSC permissions to your app](grant-resource-specific-consent.md)
+* [Test resource-specific consent permissions in Teams](test-resource-specific-consent.md)
platform Resource Specific Consent https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/graph-api/rsc/resource-specific-consent.md
The following table provides RSC application permissions for a team and their ap
|`ChannelMeetingIncomingAudio.Detect.Group`|Detect incoming audio in channel meetings associated with this team.| Supported | NA | |`ChannelMeetingStage.Write.Group`|Show content on the meeting stage of channel meetings associated with this team.| Supported | NA | |`InAppPurchase.Allow.Group`|Show and complete in-app purchases for users in this team.| Supported | NA |
-|`LiveShareSession.ReadWrite.Group`| Create and synchronize Live Share sessions for meetings associated with this team. | Supported | NA |
+|`LiveShareSession.ReadWrite.Group`| Allows the app to create and synchronize Live Share sessions for the team and get access related information, such as name and role, about the team's roster and any associated meetings. | Supported | NA |
|`MeetingParticipantReaction.Read.Group`| Read reactions of participants in channel meetings associated with this team.| Supported | NA | For more information, see [team resource-specific consent permissions](/graph/permissions-reference#team-resource-specific-consent-permissions).
The following table provides RSC permissions for a chat or meeting and their app
| `OnlineMeetingRecording.Read.Chat` | Read the recordings of the meetings associated with this chat. |NA |Supported | | `OnlineMeetingNotification.Send.Chat` | Send notifications in the meetings associated with this chat. |NA |Supported | | `InAppPurchase.Allow.Chat` | Show and complete in-app purchases for users in this chat and any associated meetings. |Supported |NA |
-| `LiveShareSession.ReadWrite.Chat` | Create and synchronize Live Share sessions for meetings associated with this chat. |Supported |NA |
+| `LiveShareSession.ReadWrite.Chat` | Allows the app to create and synchronize Live Share sessions for the chat and get access related information, such as name and role, about the chat's roster and any associated meetings. |Supported |NA |
| `MeetingStage.Write.Chat` | Show content on the meeting stage of meetings associated with this chat. |Supported |NA | | `MeetingParticipantReaction.Read.Chat` | Read the reactions of participants in meetings associated with this chat. |Supported |NA | | `OnlineMeetingIncomingAudio.Detect.Chat` | Detect incoming audio in meetings associated with this chat. |Supported |NA |
platform Actions In M365 Quick Start Guide https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/m365-apps/actions-in-m365-quick-start-guide.md
You can try your Actions in the Microsoft 365 home page, right-click a Word, Exc
If you want to run Actions in the Microsoft 365 on Azure, see [sample.](https://github.com/OfficeDev/Microsoft-Teams-Samples/blob/main/samples/m365-actions-preview/nodejs/README.md#optional-deploy-the-app-to-azure)
-## See also
-
-* [Actions in Microsoft 365](actions-in-m365.md)
-* [Build Actions in Microsoft 365](build-actions-in-m365.md)
platform Build Actions In M365 https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/m365-apps/build-actions-in-m365.md
Follow instructions to preinstall your app for entire organization or user group
> [!div class="nextstepaction"] > [Actions in Microsoft 365 quick start guide](actions-in-m365-quick-start-guide.md)
-## See also
-[Actions in Microsoft 365](actions-in-m365.md)
platform Extend M365 Meeting App https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/m365-apps/extend-m365-meeting-app.md
To remove or configure your app in the scheduling window, select the dropdown me
## See also
-* [Extend Teams apps across Microsoft 365](overview.md)
-* [Support and feedback](~/feedback.md)
+[Support and feedback](~/feedback.md)
platform Extend M365 Teams Message Extension https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/m365-apps/extend-m365-teams-message-extension.md
Use the [Microsoft Teams developer community channels](/microsoftteams/platform/
> [!div class="nextstepaction"] > [Publish Teams apps for Outlook and Microsoft 365 app](publish.md)-
-## See also
-
-[Message extensions](~/messaging-extensions/what-are-messaging-extensions.md)
platform Me Or Outlook Add In https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/m365-apps/me-or-outlook-add-in.md
The following examples show the recommended app type for different scenarios bas
| Synchronize a signature across devices. | Outlook add-in | | Enable administrator management of signatures for an organization. | Outlook add-in |
-## See also
-
-* [Extend Teams apps across Microsoft 365](overview.md)
-* [Extend a Teams message extension across Microsoft 365](extend-m365-teams-message-extension.md)
platform Teamsjs Support M365 https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/m365-apps/teamsjs-support-m365.md
Preview. Contains functionality to allow web apps to store data in webview cache
- [Extend Teams apps across Microsoft 365](./overview.md) - [Extend a Teams personal tab across Microsoft 365 app](./extend-m365-teams-personal-tab.md)-- [Teams JavaScript client library overview](../tabs/how-to/using-teams-client-library.md) - [TeamsJS API Reference](/javascript/api/@microsoft/teams-js)
platform Promote App Adoption https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/promote-app-adoption.md
Champions help:
* Identify business challenges and possible solutions. * Provide feedback to the project team and sponsors.
-You can use Microsoft [Champions Program Guide](https://adoption.microsoft.com/become-a-champion/) as a reference and build this program in your organization for your app. For more information, see [Create your champions program for Microsoft Teams](/microsoftteams/teams-adoption-create-champions-program).
+You can use Microsoft [Champions Program Guide](https://adoption.microsoft.com/become-a-champion/) as a reference and build this program in your organization for your app. For more information, see [Create your champions program for Microsoft Teams](/microsoftteams/teams-adoption-create-champions-program). For best practices on app adoption, see [app growth and adoption](concepts/deploy-and-publish/appsource/post-publish/app-growth/app-growth-lifecycle.md#best-practices-for-app-growth-and-adoption).
> [!div class="nextstepaction"] > [Back to top](#understand-how-you-can-drive-app-adoption)
platform Manifest Schema Dev Preview https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/schema/manifest-schema-dev-preview.md
Delegated permissions allow the app to access data on behalf of the signed-in us
|`ChannelMeetingAudioVideo.Stream.Group`| Allows the app to stream audio-video content from channel meetings associated with the team. | |`InAppPurchase.Allow.Group`| Allows the app to show marketplace offers to users in the team and complete their purchases within the app, on behalf of the signed-in user.| |`ChannelMeetingStage.Write.Group`| Allows the app to show content on the meeting stage in channel meetings associated with the team, on behalf of the signed-in user.|
- |`LiveShareSession.ReadWrite.Group`|Allows the app to create and synchronize Live Share sessions for meetings associated with the team. Provide access related information about the meeting's roster, such as member's meeting role, on behalf of the signed-in user.|
+ |`LiveShareSession.ReadWrite.Group`|Allows the app to create and synchronize Live Share sessions for the team and get access related information, such as name and role, about the team's roster and any associated meetings, on behalf of the signed-in user.|
|`MeetingParticipantReaction.Read.Group`| Allows the app to read reactions of participants in channel meetings associated with the team.| * **RSC delegated permissions for chats or meetings**
Delegated permissions allow the app to access data on behalf of the signed-in us
|`MeetingStage.Write.Chat`|Allows the app to show content on the meeting stage in meetings associated with the chat, on behalf of the signed-in user.| |`OnlineMeetingParticipant.Read.Chat`|Allows the app to read participant information, including name, role, id, joined, and left times, of meeting associated with the chat, on behalf of the signed-in user.| |`OnlineMeetingParticipant.ToggleIncomingAudio.Chat`|Allows the app to toggle incoming audio for participants in meetings associated with the chat, on behalf of the signed-in user.|
- |`LiveShareSession.ReadWrite.Chat`|Allows the app to create and synchronize Live Share sessions for meetings associated with the chat. Provide access related information about the meeting's roster, such as member's meeting role, on behalf of the signed-in user.|
+ |`LiveShareSession.ReadWrite.Chat`|Allows the app to create and synchronize Live Share sessions for the chat and get access related information, such as name and role, about the chat's roster and any associated meetings, on behalf of the signed-in user.|
|`MeetingParticipantReaction.Read.Chat`| Allows the app to read reactions of participants in meetings associated with the chat.| |`OnlineMeetingIncomingAudio.Detect.Chat`|Allows the app to detect changes in the status of incoming audio in meetings associated with the chat, on behalf of the signed-in user.| |`OnlineMeetingActiveSpeaker.Read.Chat`| Allows the app to read participants who are currently sending audio into the meetings associated with the chat.|
platform Manifest Schema https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/schema/manifest-schema.md
Delegated permissions allow the app to access data on behalf of the signed-in us
|`ChannelMeetingAudioVideo.Stream.Group`| Allows the app to stream audio-video content from channel meetings associated with the team. | |`InAppPurchase.Allow.Group`| Allows the app to show marketplace offers to users in the team and complete their purchases within the app, on behalf of the signed-in user.| |`ChannelMeetingStage.Write.Group`| Allows the app to show content on the meeting stage in channel meetings associated with the team, on behalf of the signed-in user.|
- |`LiveShareSession.ReadWrite.Group`|Allows the app to create and synchronize Live Share sessions for meetings associated with the team, and access related information about the meeting's roster, such as member's meeting role, on behalf of the signed-in user.|
+ |`LiveShareSession.ReadWrite.Group`|Allows the app to create and synchronize Live Share sessions for the team and get access related information, such as name and role, about the team's roster and any associated meetings, on behalf of the signed-in user.|
|`MeetingParticipantReaction.Read.Group`| Allows the app to read reactions of participants in channel meetings associated with the team.| * **RSC delegated permissions for chats or meetings**
Delegated permissions allow the app to access data on behalf of the signed-in us
|`MeetingStage.Write.Chat`|Allows the app to show content on the meeting stage in meetings associated with the chat, on behalf of the signed-in user.| |`OnlineMeetingParticipant.Read.Chat`|Allows the app to read participant information, including name, role, id, joined, and left times, of meeting associated with the chat, on behalf of the signed-in user.| |`OnlineMeetingParticipant.ToggleIncomingAudio.Chat`|Allows the app to toggle incoming audio for participants in meetings associated with the chat, on behalf of the signed-in user.|
- |`LiveShareSession.ReadWrite.Chat`|Allows the app to create and synchronize Live Share sessions for meetings associated with the chat, and access related information about the meeting's roster, such as member's meeting role, on behalf of the signed-in user.|
+ |`LiveShareSession.ReadWrite.Chat`|Allows the app to create and synchronize Live Share sessions for the chat and get access related information, such as name and role, about the chat's roster and any associated meetings, on behalf of the signed-in user.|
|`MeetingParticipantReaction.Read.Chat`| Allows the app to read reactions of participants in meetings associated with the chat.| |`OnlineMeetingIncomingAudio.Detect.Chat`|Allows the app to detect changes in the status of incoming audio in meetings associated with the chat, on behalf of the signed-in user.| |`OnlineMeetingActiveSpeaker.Read.Chat`| Allows the app to read participants who are currently sending audio into the meetings associated with the chat.|
platform Tab Sso Overview https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/tabs/how-to/authentication/tab-sso-overview.md
Here's a list of best practices:
## See also -- [Configure code to enable SSO in a tab app](tab-sso-code.md)-- [Glossary](../../../get-started/glossary.md)
+[Glossary](../../../get-started/glossary.md)
platform Tab Sso Register Aad https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/tabs/how-to/authentication/tab-sso-register-aad.md
Congratulations! You've completed the app configuration in Microsoft Entra ID re
## See also - [Tenancy in Microsoft Entra ID](/azure/active-directory/develop/single-and-multi-tenant-apps)-- [Extend tab app with Microsoft Graph permissions and scope](tab-sso-graph-api.md) - [Quickstart - Register an application with the Microsoft identity platform](/azure/active-directory/develop/quickstart-register-app) - [Quickstart: Configure an application to expose a web API](/azure/active-directory/develop/quickstart-configure-app-expose-web-apis) - [OAuth 2.0 authorization code flow](/azure/active-directory/develop/v2-oauth2-auth-code-flow)
platform Sso Adaptive Cards Universal Action https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/task-modules-and-cards/cards/Universal-actions-for-adaptive-cards/sso-adaptive-cards-universal-action.md
When the app user selects **View and accept**, the existing Microsoft Entra perm
## See also
-* [Work with Universal Actions for Adaptive Cards](Work-with-Universal-Actions-for-Adaptive-Cards.md)
* [Enable SSO for your bot app](../../../bots/how-to/authentication/bot-sso-overview.md) * [Update app manifest for SSO and preview your app](../../../bots/how-to/authentication/bot-sso-manifest.md)
+* [Work with Universal Actions for Adaptive Cards](Work-with-Universal-Actions-for-Adaptive-Cards.md)
+
platform Whats New https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/whats-new.md
Teams platform features that are available to all app developers.
**2024 May** ***May 17, 2024***: [Deploy Teams app to container service.](toolkit/deploy-Teams-app-to-container-service.md)- :::column-end::: :::row-end::: <br/>
Discover Microsoft Teams platform features that are in developer preview. You ca
Developer preview is a public program that provides early access to unreleased Teams platform features.
-**2024 May**
+**2024 June**
-* ***May 14, 2024***: [Introduced a new manifest property to let potential customers contact you with queries before they can confidently adopt your app.](resources/schem#developercontactinfo)
-* ***May 07, 2024***: You can specify a [32x32 color icon](concepts/build-and-test/apps-package.md#outline-icon) with a transparent background to ensure a consistent appearance when your app runs in Outlook and Microsoft 365.
+***June 14, 2024***: [Introduced preapproval of RSC permissions for admins to control RSC permissions for app installation](graph-api/rsc/preapproval-instruction-docs.md).
:::column-end::: :::row-end:::
Developer preview is a public program that provides early access to unreleased T
| **Date** | **Update** | **Find here** | | -- | | -|
+| 14/05/2024 | Introduced a new manifest property to let potential customers contact you with queries before they can confidently adopt your app.| App manifest > [Public developer preview](resources/schem#developercontactinfo)|
+| 07/05/2024 | You can specify a 32x32 color icon with a transparent background to ensure a consistent appearance when your app runs in Outlook and Microsoft 365.| Distribute your app > [32x32 color icon](concepts/build-and-test/apps-package.md#outline-icon)|
| 15/03/2024 | Extend static tabs to channels with a customizable experience. | [Build tabs for Teams](tabs/what-are-tabs.md) | | 12/02/2024 | Build API-based message extension using Developer Portal for Teams. | Build message extension > [Build API-based message extension](messaging-extensions/build-api-based-message-extension.md) | | 06/02/2024 | Introduced `systemDefault` reserved activity type for send activity feed notifications| Build tabs > [Send activity feed notifications](tabs/send-activity-feed-notification.md#requirements-to-use-the-activity-feed-notification-apis)|