Updates from: 11/19/2022 02:57:07
Service Microsoft Docs article Related commit history on GitHub Change details
platform Channel And Group Conversations https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/bots/how-to/conversations/channel-and-group-conversations.md
Bots in a group or channel only receive messages when they're mentioned @botname
See the following video to learn about channel and group chat conversations with a bot: <br>
-> [!VIDEO <https://www.microsoft.com/en-us/videoplayer/embed/RE4NzEs>]
+> [!VIDEO https://www.microsoft.com/en-us/videoplayer/embed/RE4NzEs]
<br> ## Design guidelines
platform Deep Links https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/build-and-test/deep-links.md
Deep links are a navigation mechanism that you can use to connect users with inf
* Navigating the user to the content within one of your app's tabs. For instance, your app can have a bot that sends messages notifying the user of an important activity. When the user taps on the notification, the deep link navigates to the tab so that the user can view more details about the activity. * Your app automates or simplifies certain user tasks. You can create a chat or schedule a meeting, by pre-populating the deep links with required parameters. Avoids the need for users to manually enter information.
-The Microsoft Teams JavaScript client SDK (TeamsJS) simplifies the process of navigation. For many scenarios, such as navigating to content and information within your tab or launching a chat dialog. The SDK provides typed APIs that provide improved experience and can replace the usage of deep links. These APIs are recommended for Teams apps that might be run in other hosts (Outlook, Office), as they also provide a way to check that the capability being used is supported by that host. The following sections show information about deep linking, but also highlight how scenarios that used to require it have changed with the v2 release of TeamsJS.
+The Microsoft Teams JavaScript client SDK (TeamsJS) simplifies the process of navigation. For many scenarios, such as navigating to content and information within your tab or launching a chat dialog. The typed APIs are recommended for Teams apps that run in other hosts, such as Outlook or Office, as they also provide a way to check if the host supports the capability in use. The following sections show information about deep linking, but also highlight how scenarios that used to require it have changed with the v2 release of TeamsJS.
[!INCLUDE [sdk-include](~/includes/sdk-include.md)]
For more information, see, [pages.shareDeepLink()](/javascript/api/@microsoft/te
# [TeamsJS v1](#tab/teamsjs-v1)
-To implement this, you add a **copy link** action to each item, in whatever way best suits your UI. When the user takes this action, you call `shareDeepLink()` to display a dialog box containing a link that the user can copy to the clipboard. When you make this call, you also pass an ID for your item, which you get back in the [context](~/tabs/how-to/access-teams-context.md) when the link is followed and your tab is reloaded.
+To implement this, you add a **copy link** action to each item, in whatever way best suits your UI. When the user takes this action, you call `shareDeepLink()` to display a dialog box 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 microsoftTeams.shareDeepLink({ subEntityId: <subEntityId>, subEntityLabel: <subEntityLabel>, subEntityWebUrl: <subEntityWebUrl> })
The query parameters are:
| Parameter name | Description | Example | |:|:--|:| | `appId`&emsp; | The ID from Teams Admin Center. |fe4a8eba-2a31-4737-8e33-e5fae6fee194|
-| `entityId`&emsp; | The ID for the item in the tab, which you provided when [configuring the tab](~/tabs/how-to/create-tab-pages/configuration-page.md). When generating a URL for deep linking continue to use entityID as a parameter name in the URL. When configuring the tab the context object refers to the entityID as {page.id}. |Tasklist123|
+| `entityId`&emsp; | The ID for the item in the tab, which you provided when [configuring the tab](~/tabs/how-to/create-tab-pages/configuration-page.md). When generating a URL for deep linking, continue to use entityID as a parameter name in the URL. When configuring the tab, the context object refers to the entityID as {page.id}. |Tasklist123|
| `entityWebUrl` or `subEntityWebUrl`&emsp; | An optional field with a fallback URL to use if the client doesn't support rendering the tab. | `https://tasklist.example.com/123` or `https://tasklist.example.com/list123/task456` | | `entityLabel` or `subEntityLabel`&emsp; | A label for the item in your tab, to use when displaying the deep link. | Task List 123 or "Task 456 |
-| `context.subEntityId`&emsp; | An ID for the item within the tab. When generating a URL for deep linking continue to use subEntityId as the parameter name in the URL. When configuring the tab the context object refers to the subEntityID as subPageID. |Task456 |
+| `context.subEntityId`&emsp; | An ID for the item within the tab. When generating a URL for deep linking, continue to use subEntityId as the parameter name in the URL. When configuring the tab, the context object refers to the subEntityID as subPageID. |Task456 |
| `context.channelId`&emsp; | Microsoft Teams channel ID that is available from the tab [context](~/tabs/how-to/access-teams-context.md). This property is only available in configurable tabs with a scope of **team**. It isn't available in static tabs, which have a scope of **personal**.| 19:cbe3683f25094106b826c9cada3afbe0@thread.skype | | `chatId`&emsp; | ChatId that is available from the tab [context](~/tabs/how-to/access-teams-context.md) for group and meeting chat | 17:b42de192376346a7906a7dd5cb84b673@thread.v2 | | `contextType`&emsp; | Chat is the only supported contextType for meetings | chat |
The query parameters are:
## Navigation from your tab
-You can navigate to content in Teams from your tab using TeamsJS or deep links. This is useful if your tab needs to connect users with other content in Teams, such as to a channel, message, another tab or even to open a scheduling dialog. Formerly, navigation might have required a deep link, but it can now in many instances be accomplished using the SDK. The following sections show both methods, but where possible use of the typed capabilities of the SDK is recommended.
+You can navigate to content in Teams from your tab using TeamsJS or deep links. This is useful if your tab needs to connect users with other content in Teams, such as to a channel, message, another tab, or to open a scheduling dialog. Formerly, navigation might have required a deep link, but it can now in many instances be accomplished using the SDK. The following sections show both methods, but where possible use of the typed capabilities of the SDK is recommended.
One of the benefits of using TeamsJS, particularly for Teams app that might run in other hosts (Outlook and Office), is that it's possible to check that the host supports the capability you're attempting to use. To check a host's support of a capability, you can use the `isSupported()` function associated with the namespace of the API. The TeamsJS SDK organizes APIs into capabilities by way of namespaces. For example, prior to usage of an API in the `pages` namespace you can check the returned boolean value from `pages.isSupported()` and take the appropriate action within the context of your app and apps UI.
The query parameters are:
> [!NOTE] > You can see `channelId` and `groupId` in the URL from the channel.
+### Generate deep links to chat messages
+
+Use this deep link format to navigate a user to a message in a personal or group chat in Teams:
+
+`http://teams.microsoft.com/l/message/{chatId}/{messageId}?context={"contextType":"chat"}`
+
+Example: `http://teams.microsoft.com/l/message/19:253f5895-9a62-4362-8d38-43f0205c702c_f1b94dcf-0aa3-4989-bcdf-ef4a5ed00f86@unq.gbl.spaces/1563480968434?context=%7B%22contextType%22:%22chat%22%7D`
+
+The query parameters are:
+
+* `chatId`: ChatId of the conversation. The supported format for `chatId` is 19:xxx. For example, `19:253f5895-9a62-4362-8d38-43f0205c702c_f1b94dcf-0aa3-4989-bcdf-ef4a5ed00f86@unq.gbl.spaces`.
+
+Apps can read a chat ID through app context in Teams, incoming payload to bot, or through [Microsoft Graph APIs](/graph/api/chat-get?view=graph-rest-1.0&tabs=http&preserve-view=true).
+
+ > [!NOTE]
+ > For One-on-One chats with bot, the incoming payload to bot contains the conversation ID in a:xxx format.
+
+* `messageId`: Each message in a chat has a unique ID. When a bot posts a message in chat, the `messageId` is returned. You can also get the `messageId` through [Microsoft Graph APIs](/graph/api/message-get?view=graph-rest-1.0&tabs=http&preserve-view=true). For example, `1563480968434`.
+
+* `context`: Specify the contextType as chat.
+ ### Generate deep links to file in channel The following deep link format can be used in a bot, connector, or message extension card:
Example: `https://teams.microsoft.com/l/entity/fe4a8eba-2a31-4737-8e33-e5fae6fee
## Navigate to an audio or audio-video call
-You can invoke audio only or audio-video calls to a single user or a group of users, by specifying the call type and the participants. Before placing the call, Teams client prompts a confirmation to make the call. In the case of a group call, you can call a set of VoIP users and a set of PSTN users in the same deep link invocation.
+You can invoke audio only or audio-video calls to a single user or a group of users, by specifying the call type and the participants. Before placing the call, Teams client prompts a confirmation to make the call. For a group call, you can call a set of VoIP users and a set of PSTN users in the same deep link invocation.
In a video call, the client will ask for confirmation and turn on the caller's video for the call. The receiver of the call has a choice to respond through audio only or audio and video, through the Teams call notification window.
platform Extend M365 Teams Personal Tab https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/m365-apps/extend-m365-teams-personal-tab.md
To start with a [personal tab](https://github.com/OfficeDev/TeamsFx-Samples/tree
From here, you can skip ahead to [sideload your app in Teams](#sideload-your-app-in-teams) and preview your app in Outlook and Office. (The app manifest and TeamsJS API calls have already been updated for Microsoft 365.)
+### SharePoint Framework (SPFx) apps
+
+Starting with version 1.16 of [SharePoint Framework](/sharepoint/dev/spfx/integrate-with-teams-introduction) (SPFx), Teams personal tabs built and hosted with SPFx are also supported in Outlook and Office. To update a SPFx Teams personal tab app, follow these steps:
+
+1. Ensure you have the latest version of SPFx.
+
+ ```
+ npm install @microsoft/generator-sharepoint@latest --global
+ ```
+
+1. [Update the app manifest](#update-the-app-manifest).
+1. [Update the SDK references](#update-sdk-references).
+
+After you update the SDK references, [sideload your app in Teams](#sideload-your-app-in-teams) to preview your SPFx personal tab app running in Outlook and Office. For more information, see [Extend Outlook and Office with the SharePoint Framework](/sharepoint/dev/spfx/office/overview).
+ ## Update the app manifest You need to use the [Teams developer manifest](../resources/schem) schema version `1.13` to enable your Teams personal tab to run in Outlook and Office.
platform Overview https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/m365-apps/overview.md
For guidance about the Teams app manifest and SDK versioning guidance, and furth
## Personal tabs and messaging extensions in Outlook and Office
-Reach your users where they are, right in the context of their work by extending your web app as a [Teams personal tab](extend-m365-teams-personal-tab.md) application that also runs in both Outlook and Office.
+Reach your users where they are, right in the context of their work by extending your web app as a [Teams personal tab](extend-m365-teams-personal-tab.md) application that also runs in both Outlook and Office. Teams personal tabs built and hosted with [SharePoint Framework](extend-m365-teams-personal-tab.md#sharepoint-framework-spfx-apps) (SPFx) version 1.16 and later are also supported in Outlook and Office.
:::image type="content" source="images/outlook-office-teams-personal-tab.png" alt-text="The screenshot is an example that shows Personal tab running in Outlook, Office, and Teams.":::
platform Link Unfurling https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/messaging-extensions/how-to/link-unfurling.md
description: Add link unfurling with messaging extension in a Microsoft Teams app with app manifest or manually. Add link unfurling using Developer Portal. How to update your web service code to handle the invoke request. ms.localizationpriority: medium -+
-# Add link unfurling
+# Link unfurling
[!include[v4-to-v3-SDK-pointer](~/includes/v4-to-v3-pointer-me.md)]
-This document guides you on how to add link unfurling to your app manifest using Developer Portal or manually. With link unfurling, your app can register to receive an `invoke` activity when URLs with a particular domain are pasted into the compose message area. The `invoke` contains the full URL that was pasted into the compose message area. You can respond with a card that the user can unfurl for additional information or actions. This works as a search command with the URL as the search term.
+The document guides you on how to add link unfurling to your app manifest using Developer Portal and manually. With link unfurling, your app can register to receive an `invoke` activity when URLs with a particular domain are pasted into the compose message area. The `invoke` contains the full URL that was pasted into the compose message area, and you can respond with a card that the user can unfurl, providing additional information or actions. This works similar to a search command with the URL serving as the search term. You can now add link unfurling to Microsoft Teams without installing app.
+ > [!NOTE] > > * Currently, link unfurling is not supported on Mobile clients. > * The link unfurling result is cached for 30 minutes.
-> * Messaging extension commands are not required for Link unfurling. However, there must be at least one command in manifest as it is a mandatory property in messaging extensions. For more information, see [compose extensions](/microsoftteams/platform/resources/schema/manifest-schema)
+> * Messaging extension commands are not required for Link unfurling. However, there must be at least one command in manifest as it is a mandatory property in messaging extensions. For more information, see [compose extensions](/microsoftteams/platform/resources/schema/manifest-schema).
-The Azure DevOps message extension uses link unfurling to look for URLs pasted into the compose message area pointing to a work item. In the following image, a user pasted a URL for an item in Azure DevOps that the message extension has resolved into a card:
+The following image is an example of link unfurling using the Azure DevOps message extension. When the Azure DevOps link is pasted into the Teams compose message area, the link unfurls into a card with the work item details:
See the following video to learn more about link unfurling: <br>
-> [!VIDEO <https://www.microsoft.com/en-us/videoplayer/embed/RE4OFZG>]
+> [!VIDEO https://www.microsoft.com/en-us/videoplayer/embed/RE4OFZG]
<br> ## Add link unfurling to your app manifest
See the following video to learn more about link unfurling:
To add link unfurling to your app manifest, add a new `messageHandlers` array to the `composeExtensions` section of your app manifest JSON. You can add the array with the help of Developer Portal or manually. Domain listings can include wildcards, for example `*.example.com`. This matches exactly one segment of the domain; if you need to match `a.b.example.com` then use `*.*.example.com`. > [!NOTE]
-> Don't add domains that are not in your control, either directly, or through wildcards. For example, `yourapp.onmicrosoft.com` is valid, but `*.onmicrosoft.com` is not valid. The top-level domains are prohibited, for example, `*.com`, `*.org`.
+> Ensure not to add domains that are not in your control, either directly or through wildcards. For example, `yourapp.onmicrosoft.com` is valid, but `*.onmicrosoft.com` is not valid. The top-level domains are prohibited, for example, `*.com`, `*.org`.
### Add link unfurling using Developer Portal 1. Open **Developer Portal** from the Microsoft Teams client and then select the **Apps** tab.+
+ :::image type="content" source="../../assets/images/tdp/create-new-app.png" alt-text="create new app in developer portal" lightbox="../../assets/images/tdp/create-new-app.png":::
+
+ > [!NOTE]
+ > You need to add Developer Portal app, if you don't have it added in your Teams client.
+
+ :::image type="content" source="../../assets/images/tdp/dev-portal-app.png" alt-text="Add developer portal app" lightbox="../../assets/images/tdp/dev-portal-app.png":::
+ 1. Load your app manifest.
-1. On the **Messaging Extension** page under **App features**, select existing bot or create a new bot.
+
+ :::image type="content" source="../../assets/images/tdp/load-app-manifest.png" alt-text="load your app manifest" lightbox="../../assets/images/tdp/load-app-manifest.png":::
+
+1. Select **Messaging Extension** under **App features** and then either choose **Select an existing bot** or **Create a new bot**.
+
+ :::image type="content" source="../../assets/images/tdp/select-messaging-extension.png" alt-text="Select messaging extension option" lightbox="../../assets/images/tdp/select-messaging-extension.png":::
+
+ :::image type="content" source="../../assets/images/tdp/select-create-bot.png" alt-text="select existing bot or create a new bot" lightbox="../../assets/images/tdp/select-create-bot.png":::
+ 1. Select **Save**. 1. Select **Add a domain** under **Preview links** section and then enter valid domain. 1. Select **Add**. The following image explains the process:
- :::image type="content" source="../../assets/images/tdp/add-domain-button.PNG" alt-text="Screenshot of the message handlers section in Developer Portal." lightbox="../../assets/images/tdp/add-domain.PNG":::
+ :::image type="content" source="../../assets/images/tdp/add-domain-button.png" alt-text="Screenshot of the message handlers section in Developer Portal." lightbox="../../assets/images/tdp/add-domain.png":::
### Add link unfurling manually > [!NOTE] > If authentication is added through Azure AD, [unfurl links in Teams using bot](/microsoftteams/platform/sbs-botbuilder-linkunfurling?tabs=vs&tutorial-step=4).
-To enable your message extension to interact with links, first you must add the `messageHandlers` array to your app manifest. The following example explains how to add link unfurling manually:
+First, you need to add the `messageHandlers` array to your app manifest and enable your message extension to interact with links. The following example explains how to add link unfurling manually:
```json ...
-"composeExtensions": [
- {
- "botId": "abc123456-ab12-ab12-ab12-abcdef123456",
- "messageHandlers": [
- {
- "type": "link",
- "value": {
- "domains": [
- "*.trackeddomain.com"
- ]
+{
+ "composeExtensions": [
+ {
+ "botId": "abc123456-ab12-ab12-ab12-abcdef123456",
+ "messageHandlers": [
+ {
+ "type": "link",
+ "value": {
+ "domains": [
+ "*.trackeddomain.com"
+ ]
+ }
}
- }
- ]
- }
-],
+ ]
+ }
+ ]
+}
... ```
The following card types are supported:
For more information, see [Action type invoke](~/task-modules-and-cards/cards/cards-actions.md#action-type-invoke).
-### Example
+The following is an example of the `invoke` request:
# [C#/.NET](#tab/dotnet) ```csharp
-protected override async Task<MessagingExtensionResponse> OnTeamsAppBasedLinkQueryAsync(ITurnContext<IInvokeActivity> turnContext, AppBasedLinkQuery query, CancellationToken cancellationToken)
-{
- //You'll use the query.link value to search your service and create a card response
- var card = new HeroCard
- {
- Title = "Hero Card",
- Text = query.Url,
- Images = new List<CardImage> { new CardImage("https://raw.githubusercontent.com/microsoft/botframework-sdk/master/icon.png") },
- };
-
- var attachments = new MessagingExtensionAttachment(HeroCard.ContentType, null, card);
- var result = new MessagingExtensionResult(AttachmentLayoutTypes.List, "result", new[] { attachments }, null, "test unfurl");
-
- return new MessagingExtensionResponse(result);
-}
+ protected override async Task<MessagingExtensionResponse> OnTeamsAppBasedLinkQueryAsync(ITurnContext<IInvokeActivity> turnContext, AppBasedLinkQuery query, CancellationToken cancellationToken)
+ {
+ //You'll use the query.link value to search your service and create a card response
+ var card = new HeroCard
+ {
+ Title = "Hero Card",
+ Text = query.Url,
+ Images = new List<CardImage> { new CardImage("https://raw.githubusercontent.com/microsoft/botframework-sdk/master/icon.png") },
+ };
+
+ var attachments = new MessagingExtensionAttachment(HeroCard.ContentType, null, card);
+ var result = new MessagingExtensionResult(AttachmentLayoutTypes.List, "result", new[] { attachments }, null, "test unfurl");
+
+ return new MessagingExtensionResponse(result);
+ }
``` # [JavaScript/Node.js](#tab/javascript) ```javascript
-class TeamsLinkUnfurlingBot extends TeamsActivityHandler {
- handleTeamsAppBasedLinkQuery(context, query) {
- const attachment = CardFactory.thumbnailCard('Thumbnail Card',
- query.url,
- ['https://raw.githubusercontent.com/microsoft/botframework-sdk/master/icon.png']);
+ class TeamsLinkUnfurlingBot extends TeamsActivityHandler {
+ handleTeamsAppBasedLinkQuery(context, query) {
+ const attachment = CardFactory.thumbnailCard('Thumbnail Card',
+ query.url,
+ ['https://raw.githubusercontent.com/microsoft/botframework-sdk/master/icon.png']);
const result = { attachmentLayout: 'list',
class TeamsLinkUnfurlingBot extends TeamsActivityHandler {
composeExtension: result }; return response;
- }
-}
+
+ }
+ }
``` # [JSON](#tab/json)
-Following is an example of the `invoke` sent to your bot:
+ Following is an example of the `invoke` sent to your bot:
```json
-{
- "type": "invoke",
- "name": "composeExtension/queryLink",
- "value": {
- "url": "https://theurlsubmittedbyyouruser.trackeddomain.com/id/1234"
- }
-}
+ {
+ "type": "invoke",
+ "name": "composeExtension/queryLink",
+ "value": {
+ "url": "https://theurlsubmittedbyyouruser.trackeddomain.com/id/1234"
+ }
+ }
``` Following is an example of the response: ```json
-{
- "composeExtension": {
- "type": "result",
- "attachmentLayout": "list",
- "attachments": [
+ {
+ "composeExtension": {
+ "type": "result",
+ "attachmentLayout": "list",
+ "attachments": [
+ {
+ "contentType": "application/vnd.microsoft.teams.card.o365connector",
+ "content": {
+ "sections": [
+ {
+ "activityTitle": "[85069]: Create a cool app",
+ "activityImage": "https://placekitten.com/200/200"
+ },
+ {
+ "title": "Details",
+ "facts": [
+ {
+ "name": "Assigned to:",
+ "value": "[Larry Brown](mailto:larryb@example.com)"
+ },
+ {
+ "name": "State:",
+ "value": "Active"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+```
++
+## Zero install for link unfurling
+
+Zero install link unfurling helps you unfurl previews for your shared links even before a user discovered or installed your app in Teams. You can anonymously unfurl cards with a new invoke request or create a pre-authenticated Adaptive Card preview for users before they install or authenticate your app.
+
+The following image provides a sequential flow to enable and use zero install link unfurling:
+
+ :::image type="content" source="../../assets/images/tdp/user-flow-image.png" alt-text="Screenshot of the link unfurling code user flow." lightbox="../../assets/images/tdp/user-flow-image.png":::
+
+### Enable zero install link unfurling
+
+To get your app ready for zero install link unfurling, follow these steps:
+
+1. Set the property `supportsAnonymizedPayloads` to true in the [manifest schema](../../resources/schem).
+
+1. Set your app to handle the new invoke request `composeExtension/anonymousQueryLink`.
+
+ Example of the new invoke request:
+
+ :::image type="content" source="../../assets/images/tdp/link-unfurl_1.png" alt-text="Screenshot of the invoke request `composeExtension/anonymousQueryLink` declaration in the manifest." lightbox="../../assets/images/tdp/link-unfurl_1.png":::
+
+ Example of the invoke request payload:
+
+ ```json
+ {
+ "name":"composeExtension/anonymousQueryLink",
+ "type":"invoke",
+ "timestamp":"2021-12-02T08:12:21.148Z",
+ "localTimestamp":"2021-12-02T00:12:21.148-08:00",
+ "id":"f:43d59e15-6114-bd53-08c3-b232aa648ec1",
+ "channelId":"msteams",
+ "serviceUrl":"https://smba.trafficmanager.net/amer/",
+ "from":{
+ "id":"redacted",
+ "name":"redacted"
+ },
+ "conversation":{
+ "isGroup":true,
+ "conversationType":"groupChat",
+ "tenantId":"redacted",
+ "id":" redacted",
+ "name":" redacted"
+ },
+ "recipient":{
+ "id":"28:85fa138c-7654-4236-86eb-466160687029",
+ "name":"test bot"
+ },
+ "entities":[
+ {
+ "locale":"en-US",
+ "country":"US",
+ "platform":"Mac",
+ "timezone":"America/Los_Angeles",
+ "type":"clientInfo"
+ }
+ ],
+ "channelData":{
+ "tenant":{
+ "id":" redacted"
+ },
+ "source":{
+ "name":"compose"
+ }
+ },
+ "value":{
+ "url":"https://test.test.com/test"
+ },
+ "locale":"en-US",
+ "localTimezone":"America/Los_Angeles"
+ }
+ ```
+
+1. Respond to the `composeExtension/anonymousQueryLink` payload.
+
+ 1. For non-auth scenarios: You need to send back a response with the `type` as `result` and a card. Use the following template:
+
+ ```json
{
- "contentType": "application/vnd.microsoft.teams.card.o365connector",
- "content": {
- "sections": [
- {
- "activityTitle": "[85069]: Create a cool app",
- "activityImage": "https://placekitten.com/200/200"
- },
+ "composeExtension": {
+ "type": "result",
+ "attachmentLayout": "list",
+ "attachments": [
{
- "title": "Details",
- "facts": [
- {
- "name": "Assigned to:",
- "value": "[Larry Brown](mailto:larryb@example.com)"
- },
- {
- "name": "State:",
- "value": "Active"
- }
- ]
+ "contentType": "application/vnd.microsoft.teams.card.o365connector",
+ "content": {
+ "sections": [
+ {
+ "activityTitle": "[85069]: Create a cool app",
+ "activityImage": "https://placekitten.com/200/200"
+ },
+ {
+ "title": "Details",
+ "facts": [
+ {
+ "name": "Assigned to:",
+ "value": "[Larry Brown](mailto:larryb@example.com)"
+ },
+ {
+ "name": "State:",
+ "value": "Active"
+ }
+ ]
+ }
+ ]
+ }
} ] } }
- ]
- }
-}
-```
+ ```
+
+ 1. For auth scenarios: You need to send back a response with the `type` as `auth` with an optional pre-auth card in the attachments. Use the following template:
+
+ ```json
+ {
+ "composeExtension": {
+ "type": "auth",
+ "attachmentLayout": "list",
+ "attachments": [
+ {
+ "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
+ "type": "AdaptiveCard",
+ "version": "1.5",
+ "actions": [],
+ "body": [
+ {
+ "type": "TextBlock",
+ "size": "medium",
+ "weight": "bolder",
+ "text": "Zero-install test app"
+ },
+ {
+ "type": "TextBlock",
+ "text": "Link your account with this app for a full experience",
+ "wrap": true
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ```
+
+1. Pre-auth card (for auth only): Create a card preview to unfurl your links for users who don't have your app installed. You can either create a pre-templated card or add relevant placeholder fields for the users to update. The users can learn about the app even before theyΓÇÖve installed it.
+
+ You can create customized card and add relevant fields. The users can fill in the required information as per the fields. The following image illustrates a customized card preview:
+
+ :::image type="content" source="../../assets/images/tdp/custom-card.png" alt-text="Screenshot of the customized card with fields for user to update." lightbox="../../assets/images/tdp/custom-card.png":::
+
+ The following image illustrates a default preview card:
+
+ :::image type="content" source="../../assets/images/tdp/default-preview-card.png" alt-text="Screenshot of the link unfurling code default preview card." lightbox="../../assets/images/tdp/default-preview-card.png":::
+
+ > [!NOTE]
+ > After the link is pasted in the message compose area, Teams unfurls the link into a card and prompts the user to sign in to the app. If the user doesn't sign in to the app, the link isn't posted as a card in the chat.
+
+1. Advantages and limitations.
+
+ # [Advantages](#tab/advantages)
+
+ Zero install link unfurling helps you provide enhanced experience to the users, such as:
+
+ * Unfurl previews for your links that users share in Teams even before they've installed your app.
+
+ * Create a welcome card for your app to show a preview with the placeholder fields.
+
+ # [Limitations](#tab/limitations)
+
+ The following are the limitations:
+
+ * The bot can only send back a response as `result` or `auth` as the value for the `type` property in response to the `composeExtension/anonymousQueryLink` invoke request. The user can log an error for all other response types, such as, *silentAuth* and *config*.
+
+ * The bot can't send back an acv2 card in response to the `composeExtension/anonymousQueryLink` invoke request, either as a result or as a pre-auth card in auth.
-* * *
+ * If the bot selects to send back the `"type": "auth"` with a pre-auth card, the Teams client strips away any action buttons from the card, and adds a sign in action button to get users to authenticate into your app.
+
## Step-by-step guide
Follow the [step-by-step guide](../../sbs-botbuilder-linkunfurling.yml) to unfur
* [Adaptive Cards](../../task-modules-and-cards/what-are-cards.md#adaptive-cards) * [Tabs link unfurling and Stage View](../../tabs/tabs-link-unfurling.md) * [composeExtensions](../../resources/schem#composeextensions)
+* [Bot activity handlers](../../bots/bot-basics.md)
platform Manifest Schema Dev Preview https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/schema/manifest-schema-dev-preview.md
The version of the manifest schema this manifest is using.
**Required** &ndash; String
-The version of the specific app. If you update something in your manifest, the version must be incremented as well. This way, when the new manifest is installed, it will overwrite the existing one and the user will get the new functionality. If this app was submitted to the store, the new manifest will have to be re-submitted and re-validated. Then, users of this app will get the new updated manifest automatically in a few hours, after it's approved.
+The version of the specific app. If you update something in your manifest, the version must be incremented as well. This way, when the new manifest is installed, it will overwrite the existing one and the user will get the new functionality. If this app was submitted to the store, the new manifest will have to be resubmitted and revalidated. Then, users of this app will get the new updated manifest automatically in a few hours, after it's approved.
If the app requested permissions change, users will be prompted to upgrade and re-consent to the app.
Each command item is an object with the following structure:
|`messageHandlers`|Array of Objects|5||A list of handlers that allow apps to be invoked when certain conditions are met. Domains must also be listed in `validDomains`.| |`messageHandlers.type`|String|||The type of message handler. Must be `"link"`.| |`messageHandlers.value.domains`|Array of Strings|||Array of domains that the link message handler can register for.|
+|`messageHandlers.supportsAnonymizedPayloads`|Boolean|||A boolean value that indicates whether the app's link message handler supports anonymous invoke flow. The default value is `false`. To enable zero install for link unfurling, the value needs to be set to `true`. <br/> **Note**: The property `supportAnonymousAccess` is superseded by `supportsAnonymizedPayloads`.|
|`parameters`|Array of object|5|✔️|The list of parameters the command takes. Minimum: 1; maximum: 5| |`parameter.name`|String|64 characters|✔️|The name of the parameter as it appears in the client. This is included in the user request.| |`parameter.title`|String|32 characters|✔️|User-friendly title for the parameter.|
Specify your Microsoft Azure Active Directory (Azure AD) App ID and Graph inform
**Optional**ΓÇöobject
-Specify the app's Graph connector configuration. If this is present then [webApplicationInfo.id](#webapplicationinfo) must also be specified.
+Specify the app's Graph connector configuration. If this is present, then [webApplicationInfo.id](#webapplicationinfo) must also be specified.
|Name| Type| Maximum size | Required | Description| ||||||
platform Manifest Schema https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/schema/manifest-schema.md
ms.localizationpriority: high
# App manifest schema for Teams
-The Microsoft Teams app manifest describes how your app integrates into the Microsoft Teams product. Your app manifest must conform to the schema hosted at [`https://developer.microsoft.com/json-schemas/teams/v1.14/MicrosoftTeams.schema.json`]( https://developer.microsoft.com/json-schemas/teams/v1.14/MicrosoftTeams.schema.json). Previous versions 1.0, 1.1,...,1.13, and the current version is 1.14 are each supported (using "v1.x" in the URL).
+The Microsoft Teams app manifest describes how your app integrates into the Microsoft Teams product. Your app manifest must conform to the schema hosted at [`https://developer.microsoft.com/json-schemas/teams/v1.15/MicrosoftTeams.schema.json`]( https://developer.microsoft.com/json-schemas/teams/v1.15/MicrosoftTeams.schema.json). Previous versions 1.0, 1.1,...,1.14, and the current version is 1.15 are each supported (using "v1.x" in the URL).
For more information on the changes made in each version, see [manifest change log](https://github.com/OfficeDev/microsoft-teams-app-schema/releases). The following table lists TeamsJS version and app manifest versions as per different app scenarios:
The following schema sample shows all extensibility options:
```json {
- "$schema": "https://developer.microsoft.com/json-schemas/teams/v1.14/MicrosoftTeams.schema.json",
- "manifestVersion": "1.14",
+ "$schema": "https://developer.microsoft.com/json-schemas/teams/v1.15/MicrosoftTeams.schema.json",
+ "manifestVersion": "1.15",
"version": "1.0.0", "id": "%MICROSOFT-APP-ID%", "localizationInfo": {
The following schema sample shows all extensibility options:
"domains": [ "mysite.someplace.com", "othersite.someplace.com"
- ]
+ ],
+ "supportsAnonymizedPayloads": false
} } ]
Icons used within the Teams app. The icon files must be included as part of the
**Required**ΓÇöHTML Hex color code
-A color to use and as a background for your outline icons.
+A color to use and as a background for your color icons.
The value must be a valid HTML color code starting with '#', for example `#4464ee`.
The item is an array (maximum of one element) with all elements of type `object`
|`messageHandlers`|array of Objects|5||A list of handlers that allow apps to be invoked when certain conditions are met.| |`messageHandlers.type`|string|||The type of message handler. Must be `"link"`.| |`messageHandlers.value.domains`|array of Strings|||Array of domains that the link message handler can register for.|
+|`messageHandlers.value.supportsAnonymizedPayloads`|Boolean||| A boolean value that indicates whether the app's link message handler supports anonymous invoke flow. Default is false.|
### composeExtensions.commands
platform App With Collaboration Controls https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/samples/app-with-collaboration-controls.md
Now youΓÇÖve successfully added the Collaboration controls to your application.
You can define settings for Collaboration controls for the business entity such as the table created in [new model-driven app](#create-a-new-model-driven-app-with-collaboration-controls-for-teams).
+> [!NOTE]
+> For information on how to configure Collaboration Manager for Loans product, see [Collaboration Manager for Loans](/industry/financial-services/collaboration-manager/configure).
+ The settings that you can apply are as follows: |Settings|Used by|
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.
**2022 November**
+* ***November 18, 2022***: [Zero install for link unfurling](messaging-extensions/how-to/link-unfurling.md#zero-install-for-link-unfurling).
+
+* ***November 17, 2022***: [Manifest schema v1.5](resources/schem).
+ * ***November 16, 2022***: [Adaptive Cards overflow menu](task-modules-and-cards/cards/cards-format.md#adaptive-cards-overflow-menu). * ***November 14, 2022***: [Introducing single sign-on for Visual Studio](toolkit/add-single-sign-on.md).
Developer preview is a public program that provides early access to unreleased T
**2022 November** ***November 11, 2022***: [Enable bots to receive all chat messages without being @mentioned](bots/how-to/conversations/channel-messages-with-rsc.md).- :::column-end::: :::row-end::: | **Date** | **Update** | **Find here** | | -- | | |
-| 10/11/2022 | Generate a deep link to share content to stage in meetings. | Build apps for Teams meetings and calls > Enable and configure apps for Teams meetings > [Generate a deep link to share content to stage in meetings.](apps-in-teams-meetings/build-apps-for-teams-meeting-stage.md#generate-a-deep-link-to-share-content-to-stage-in-meetings) |
+|10/11/2022|Generate a deep link to share content to stage in meetings.|Build apps for Teams meetings and calls > Enable and configure apps for meetings > [Generate a deep link to share content to stage in meetings.](apps-in-teams-meetings/build-apps-for-teams-meeting-stage.md#generate-a-deep-link-to-share-content-to-stage-in-meetings)|
| 09/23/2022 | Introduced meeting app support for Scheduled Channel Meetings. | Build apps for Teams meetings and calls > [Apps for Teams meetings and calls](apps-in-teams-meetings/teams-apps-in-meetings.md) | | 08/23/2022 | Share apps to the Teams meeting stage in mobile | Build apps for Teams meetings and calls > [Enable and configure apps for meetings](/microsoftteams/platform/apps-in-teams-meetings/enable-and-configure-your-app-for-teams-meetings) | | 08/10/2022 | Apps for scheduled public channel meetings | Build apps for Teams meetings and calls > [Overview](apps-in-teams-meetings/teams-apps-in-meetings.md) |