Microsoft Teamsのアプリを作りたい①:　タブで一つのウェブサイトを表示するだけの基本アプリ

本記事では、Microsoft Teams用のアプリを作る流れを簡単に紹介します！

# Microsoft Teamsとは
Microsoftによって開発されたコミュニケーションツールです。
https://products.office.com/ja-jp/microsoft-teams/group-chat-software

Microsoftのコミュニケーションツールというと、Skype for Businessが挙げられますが、TeamsはSkype for Businessに比べて、様々な機能が追加されています。チームを作ったり、チーム内にチャネルを作って会話したり。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/209818/dc682365-7d3b-8362-3e2c-4b71d9f18c5b.png)

そのようなTeamsの機能の一つとして、ほかに、好みのアプリをTeamsのチーム(チャネル)に追加できる機能があります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/209818/e565eade-e207-b4f0-3891-d828a3ca7f5f.png)


例えば、PowerPointをチームに追加した例が下記になります。PowerPointを先ほどのアプリリストから選ぶと設定画面が出ます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/209818/a2ec182d-587d-8dff-95fd-b72ef29dc8c6.png)


ここで表示したいPowerPointファイルを選ぶと、新たなタブとして、PowerPointが追加されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/209818/f9958fd0-5cf2-3ee9-7d0b-77c9359a7a2d.png)

このようにすることで、チームで会話をしながら、様々なアプリを利用することができます。

PowerPointをはじめとして、すでに多くのアプリがリリースされています。今回、このようなTeams用のアプリを作ってみたいと思います。その第一ステップとして、まずはタブで一つのウェブサイトを表示するだけのアプリを作ってみます！

# Teams用のアプリの基本となるパッケージ
Teams用のアプリを作るとき、基本となるのが、以下の二つから構成されるパッケージ(Zipファイル)です。
参考：https://msdn.microsoft.com/en-us/microsoft-teams/createpackage

- <b>アイコン画像</b>
- <b>Manifestファイル</b>

<b>アイコン画像</b>は、アプリ一覧などで表示される、そのアプリのアイコンです。「白/透過の20x20PNG画像」と「フルカラーの96x96PNG画像」の二枚の画像を用意します。
<b>Manifestファイル</b>は、アプリの設定を記載するファイルです。ここにアプリの名前、アプリの説明、アプリのコンテンツ情報などを記載します。

下記に、上述のサイトに掲載されている<a href="https://github.com/OfficeDev/Microsoft-teams-docs/blob/master/teams/FullAppPackage.zip">サンプル</a>のパッケージの中身を掲載します。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/209818/4ee1e833-fb75-aaf0-38f1-fe5f4a8a83de.png)

# ① Manifestファイルの基本部分を書いてみる
さて、今回の記事では、ウェブサイトを表示するだけのアプリを作ります。Teamsが本領発揮するのは、Botと連携してこそ、かもしれませんが、最初のステップとして…

先述のように、 Teams用のアプリでは、アイコン画像とManifestファイルから構成されるパッケージファイルが基本となります。なので、まずは、これらのうちManifestファイルの基本部分を書いてみましょう。なお、Manifestファイルの内容について、要点を<a href="https://qiita.com/KenN3/items/f128dce53f7f871346a4">別ページ</a>にまとめましたので、こちらを参考にして頂ければ幸いです。試しにManifestファイルの基本部分を書いた例を下記に示します。

```json
{
    "$schema": "https://statics.teams.microsoft.com/sdk/v1.0/manifest/MicrosoftTeams.schema.json",
    "manifestVersion": "1.0",
    "version": "1.0.0",
    "id": "%Microsoft App ID%",
    "packageName": "kenn3.samples.sampleapp1",
    "developer": {
        "name": "kenn3",
        "websiteUrl": "https://qiita.com/KenN3",
        "privacyUrl": "https://qiita.com/KenN3",
        "termsOfUseUrl": "https://qiita.com/KenN3"      
    },
    "name": {
        "short": "サンプルアプリ",
        "full": "ウェブサイトを表示するだけのサンプルアプリ"
    },
    "description": {
        "short": "アプリの解説です。",
        "full": "アプリの解説のロングバージョンです。"
    },
    "icons": {
        "outline": "icon20x20.png",
        "color": "icon96x96.png"
    },
    "accentColor": "#60A18E",
    "configurableTabs": [
        {
            "configurationUrl": "%設定画面のURL%",
            "canUpdateConfiguration": true,
            "scopes": [
                "team"
            ]
        }
    ],   
    "validDomains": [
        "%設定画面とコンテンツのドメイン%"
    ]
}
```
先述の要点をまとめたページを見て頂ければ、大体の内容は理解して頂けると思います。URLや名前は適当です。"id"、"configurationUrl"、"validDomains"は後のステップで実際の値を入力するので、少々お待ちを。

今回、Teamsのチーム(チャネル)にタブとしてアプリを追加しようと思うので、"configurableTabs"を使っています。もう一つのタブである"staticTabs"は現段階では、チームにタブとして追加することができないので。

これらを記載したファイルを、「manifest.json」として保存しておきましょう。

# ② 用意するウェブサイトについて考える
当たり前ですが、アプリで表示したいウェブサイトを用意する必要があります。さすがに勝手に人のページを表示するのもアレなので…

今回、"configurableTabs"を使っています。これは、アプリをチームに追加したときに、「設定画面」を表示し、その後、その設定に応じたURLの「タブ表示用のウェブサイト」をタブ内に表示するものです。このとき、「設定画面」は、実は、HTMLで記載されたウェブサイトなのです。

つまり、さきほどのPowerPointの場合も、実は、まずは「設定画面のウェブサイト」が表示されてから、選択したPowerPointを表示するように設定されたURLの「タブ表示用のウェブサイト」が表示されていたのです。いずれの画面も、基本的には、ウェブサイトだったのですね。さて、これらからわかるように、二種類のウェブサイトを最低限用意する必要があります。

* <b>設定画面のウェブサイト</b>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/209818/1163b4d9-dd91-3b68-9705-4340be02ca01.png)


* <b>タブ表示用のウェブサイト</b>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/209818/947347d6-d1bd-d21f-23e3-4cb3200cdc93.png)


の二種類ですね。これを簡単に作ってみます。

# ③ タブ表示用のウェブサイトを作ってみる
まず、タブ表示用のウェブサイトを用意してみます。順番が前後しますが、こちらの方が簡単なので。

せっかくなので自前で用意してみました。さらにせっかくなので、Teamsと同じく、MicrosoftのサービスであるAzureを使ってウェブサイトを作ってみました。下記のサイト様が大変参考になります。

<b>Azure App Serviceを使ってWebサイトを公開する<b>
https://qiita.com/seigo/items/ca2f3590d99eb0a0ed42

作ってみたウェブサイトが下記になります。とてもシンプル。ただ文字を表示するだけ。
https://teamssampleweb.azurewebsites.net/index.html
![image.png](https://qiita-image-store.s3.amazonaws.com/0/209818/7688883b-0f5d-0e7a-9a16-2f2463de77c9.png)


需要は全くないと思いますが、一応htmlソース貼っておきます。需要は全くないと思いますが。

```html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
こちらはタブ表示用のウェブサイトです。
</body>
</html>
```

このウェブサイトが最終的にはTeamsのタブ内に表示されるわけですね！

# ④ 設定画面のウェブサイトを作ってみる
さて、次に設定画面のウェブサイトを作ってみましょう。今回は、上述のウェブサイトへ繋げるだけなので、特にユーザに設定してもらいたい内容があるわけでもないですが。これを作るにあたり、以下のサイトが参考になります。

<b>Create the configuration page for your Microsoft Teams configurable tab</b>
https://msdn.microsoft.com/en-us/microsoft-teams/createconfigpage

以下に、実際の今回の設定画面のウェブサイトのHTMLを記載します。上記のサイトを参考にさせて頂きながら、簡略化しました。



```html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<script src='https://statics.teams.microsoft.com/sdk/v1.0/js/MicrosoftTeams.min.js'></script>

<script type="text/javascript">  

microsoftTeams.initialize();

microsoftTeams.settings.setSettings({
    entityId: "kennSampleApp1",
    suggestedDisplayName: "Sample App1",
    contentUrl: "https://teamssampleweb.azurewebsites.net/index.html",
    websiteUrl: "https://teamssampleweb.azurewebsites.net/index.html"
});

microsoftTeams.settings.setValidityState(true);

</script>

こちらは設定画面のウェブサイトです。
</body>
</html>
```

ここで最も重要なのがJavaScriptの部分です。設定画面のウェブサイトでは、JavaScriptを使い、ユーザをタブ表示用のウェブサイトへと繋げます。具体的には、JavaScriptを通して、タブ内に表示するウェブサイトのURLを設定しています。上から見ていきましょう。

```html
<script src='https://statics.teams.microsoft.com/sdk/v1.0/js/MicrosoftTeams.min.js'></script>
```
最も重要なコードです。このコードにより、Microsoft Teams JavaScript Libraryを読み込み、Teams向けの機能を読み込みます。

```html
microsoftTeams.initialize();
```
次に、上述のコードを呼ぶことで、初期化を行います。

```html
microsoftTeams.settings.setSettings({
    entityId: "kennSampleApp1",
    suggestedDisplayName: "Sample App1",
    contentUrl: "https://teamssampleweb.azurewebsites.net/index.html",
    websiteUrl: "https://teamssampleweb.azurewebsites.net/index.html"
});
```
上述のコードが、タブ表示用のウェブサイトの具体的な設定を行っている部分です。各パラメータは名前の通りの役割です。"contentUrl"に、前のステップで設定したタブ表示用のウェブサイトを記載します。"websiteUrl"も同じで良いでしょう。<b>Httpsにする必要があるので気を付けてください。</b>このURLを、ユーザの入力に応じて変えるようにすることで、ユーザがタブ内に表示したいものをカスタマイズできるようにするのです。今回は一つのウェブサイトを表示するだけなので、直接URLを書いてしまっていますが。

```html
microsoftTeams.settings.setValidityState(true);
```

最後に、上述のコードにより、設定画面の「保存」ボタンを有効化して、ユーザがボタンを押せるようにします。↓コレです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/209818/a9827e96-f203-e9b5-3eff-2a0d95ff6839.png)


さて、この設定画面のウェブサイトを下記のようにアップロードしました。Teams内で見ないと、特に意味はないウェブサイトですね。

https://teamssampleweb.azurewebsites.net/config.html
![image.png](https://qiita-image-store.s3.amazonaws.com/0/209818/20938435-6d34-ccd5-8c63-1f394461c49e.png)

これでウェブサイトの準備は完了です！

# ⑤ Manifestファイルの残りを書く
続いてManifestファイルに戻りましょう。まだ、"id"、"configurationUrl"、"validDomains"が書きかけでしたね。

<b>"id"</b>に書くべきは、Microsoft App IDです。Microsoft App IDを持っていない場合、Microsoft Application Registration Portal(<a href="https://apps.dev.microsoft.com/">こちら</a>)で「アプリの追加」を行えば、新しくMicrosoft App IDを作ることができます。私も新しく作りました。

<b>"configurationUrl"</b>に書くべきは、設定画面のウェブサイトのURLです。今回は"https\://teamssampleweb.azurewebsites.net/config.html"ですね。引き続き<b>Httpsにすることに注意してください！</b>

<b>"validDomains"</b>に書くべきは、上記のURLのドメインです。今回は"teamssampleweb.azurewebsites.net"で。

上記の変更を「manifest.json」に行い、上書き保存しておきましょう。

# ⑥ アイコン画像とManifestファイルでパッケージを作る
さて、これでManifestファイルが完成しました！このManifestファイルとアイコンファイル二種類をZipでまとめて、Teams用のアプリのパッケージ完成です！このとき、アイコン画像のファイル名がManifestファイルに記載した通りになっていること、Zipの中にフォルダが作られないよう気を付けること(Zip直下にすべてのファイルを置くこと)に気を付けましょう。

私もアイコン画像を作成しました。アイコン画像を用意するのが面倒だったら、ローカルでテストするだけでしたら、先述の<a href="https://github.com/OfficeDev/Microsoft-teams-docs/blob/master/teams/FullAppPackage.zip">サンプル</a>のパッケージの中にあるアイコン画像を流用してしまってもいいかもしれませんね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/209818/0dca591b-eb69-4e2e-148f-7a75ac245be6.png)
こんな感じにファイルを用意して…

![image.png](https://qiita-image-store.s3.amazonaws.com/0/209818/d877fb0b-54c3-3137-668d-e46902f924d0.png)

Zip圧縮で完了です！

# ⑦ パッケージをTeamsのチームに追加する
さて、それでは完成したパッケージをTeamsのチームに追加してみましょう。今回は、サイドロードにより、パッケージをTeamsのチームに追加します。これにより、Officeストアを経由せずに、直接アプリをテストできます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/209818/9a56810f-5cc6-7036-b0d2-04181e3f0ed5.png)

「チームを管理」を選んで…

![image.png](https://qiita-image-store.s3.amazonaws.com/0/209818/2163f04a-7eb8-df5a-73ed-2b69c401c797.png)

「アプリ」タブから「アプリをサイドロードする」を選び、作成したZipファイルのパッケージを選びましょう。そうすると…

![image.png](https://qiita-image-store.s3.amazonaws.com/0/209818/e28eb26a-3d58-4f3d-f80c-d8d2330f906e.png)

追加されました！
ちなみに、アプリのサイドロードができない場合、管理者にアプリのサイドロードを無効化されている可能性があります。以下のサイトを参考にしてみてください。

<b>Microsoft Teams でのアプリの管理設定</b>
https://docs.microsoft.com/ja-jp/microsoftteams/admin-settings


# ちゃんと動くかテストしてみる

さて、このアプリはちゃんと動くのでしょうか…チェックしてみましょう。チームのチャネルでタブの追加画面に行くと…

![image.png](https://qiita-image-store.s3.amazonaws.com/0/209818/b3bf0643-ad27-a892-0b0b-9ed613f320dd.png)

作成したアプリがあることが確認できます。アイコンが恥ずかしい。
ここで作成したアプリを選択すると…

![image.png](https://qiita-image-store.s3.amazonaws.com/0/209818/007a9aa6-16ca-f0d3-2b72-daa9f90d8c63.png)

ちゃんと設定画面が表示されていますね！「保存」ボタンも有効化されています。「保存」ボタンをクリックしましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/209818/f7c613ff-8b0d-5d24-8bc4-118fe5392d30.png)

無事タブが追加されました！内容も設定した通りですね。これで一つのウェブサイトを表示するだけの基本アプリの完成です！

# ちなみに…
今回は単純なウェブサイトを表示するだけだったので、質素なタブとなりましたが、ここでリッチなウェブアプリを表示するように設定すれば、それだけでリッチなタブになります。Teamsのアプリは、基本はウェブアプリになるのですね。UnityのWebGLとかも動きます。

また、設定画面の詳細については<a href="https://qiita.com/KenN3/items/13b1f3eb770b5aa05364">次の記事</a>をご参照ください。

なお、別に開発をしたいわけではなく、本当にウェブサイトを一つ表示するタブを作りたいだけだったら、↓を選ぶだけで良かったりします笑

![image.png](https://qiita-image-store.s3.amazonaws.com/0/209818/3c2b0497-4aca-a187-73af-8da2886599c9.png)