LIFF v2 で追加されたAPIを試してみる

先日、LINE アプリ上でWeb アプリケーションを動かせるLIFF (LINE Front-end Framework) のv2 がリリースされました。

v2 では、LINE アプリ以外のブラウザでもLIFF SDK だけでLINE Login でき、LIFF API も一部使用できる **外部ブラウザ対応** が追加され、LINE アプリ外でもLIFF アプリとして動かすことができるようになったことで、ますます色んな場面でLIFF アプリが利用できるようになりました。
また、LIFF API としても、LIFF アプリからQR コードリーダーを呼び出してスキャンできたり、ユーザーのメールアドレスを取得できたり、LINE アプリ内か外部ブラウザ化を判別できたりと、大幅に機能アップしています。
LIFF v2 の詳細は、[こちら](https://engineering.linecorp.com/ja/blog/liff-v2/)をご覧ください。

今回は、LIFF v2 で利用できる機能を試すために簡単なLIFF アプリを作ってみました。

# デモ動画

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">LIFF v2 のAPI を動かしてみた<br>LINE アプリ内ブラウザであれば、QRコードのスキャンやメッセージを送信できるし、外部ブラウザも対応しているのでコードを共通化できてなかなか良い感じ😇<a href="https://twitter.com/hashtag/LINE_API?src=hash&amp;ref_src=twsrc%5Etfw">#LINE_API</a> <a href="https://t.co/FL3yKiqBwS">pic.twitter.com/FL3yKiqBwS</a></p>&mdash; sumihiro3 (@sumihiro3) <a href="https://twitter.com/sumihiro3/status/1185910258289393666?ref_src=twsrc%5Etfw">October 20, 2019</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

なお、下のボタンを押してLINE で友だち登録していただければ、実際に試していただけます。

<a href="http://nav.cx/AMNjaQp"><img src="https://scdn.line-apps.com/n/line_add_friends/btn/ja.png" alt="友だち追加" height="36" border="0"></a>

また、外部ブラウザからは、[こちら](https://liff-v2-sample.netlify.com/) にアクセスして試していただけます。
なお、外部ブラウザではLIFF の仕様で以下の機能は使えません。以下の機能を試したい方はLINE で友だち登録してお試しください。

* QR コードスキャン
* LINE アプリへのメッセージ送信

下の画像が外部ブラウザでサンプルアプリにアクセスした際のものです。

![LIFFV2Sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154381/ece0f384-1738-02a5-dbf4-d6a9612439b2.png)

外部ブラウザで動いているかどうかを判別できますので、上記の外部ブラウザでは使用で出来ない機能のボタンを押せないように制御することも簡単です。


# LIFF アプリの構成
今回作ったLIFF アプリは以下を利用して開発しています。
すべてJavaScript でコーディングできます。

* LIFF SDK 
    * v2.1
    * LIFF アプリ開発用のSDK
* node.js 
    * v10.16.0
* npm 
    * v6.9.0
* Vue.js 
    * v2.6.10
    * Web アプリケーションのUI フレームワーク
* Vuetify.js 
    * v2.1.5
    * Vue.js 用のマテリアルデザインコンポーネントフレームワーク

## 実行環境
ローカル開発環境ではトンネリングツールの [ngrok](https://ngrok.com/) を利用しましたが、運用では[Netlify](https://www.netlify.com/) を利用しています。

Netlify は静的Web サイトのホスティングなどができるサービスです。
Github やBitbucket などのリポジトリにPush したVue.js などのソースコードをビルドしてSPA として展開してくれる機能もあります。
今回は、[Github のリポジトリ](https://github.com/sumihiro3/liff-v2-sample) にVue.js のソースコードをローカルリポジトリからPush し、そのタイミングでNetlify にてビルドが実行され、ビルドされたモジュールがデプロイされ、運用環境として公開されるように設定しました。

## ソースコード
今回作ったサンプルアプリのソースコードは、[Github のリポジトリ](https://github.com/sumihiro3/liff-v2-sample) で公開しています。

### サンプルアプリの解説

サンプルアプリ本体は[App.vue](https://github.com/sumihiro3/liff-v2-sample/blob/master/src/App.vue) です。

```html:App.vue（23行目付近）
        <!-- Component -->
          <LiffV2Login v-if="loggedIn === false" />
          <LiffV2Function v-else />
```

また、ユーザーがLINE アプリのブラウザでアクセスしている場合は、自動でLINE Login に認証されるため「SIGN OUT」ボタンは非表示にしています。
このように、ユーザーのアクセスがLINE アプリのブラウザからか、外部ブラウザからかを簡単に判別できるので、LINE アプリ用、外部ブラウザ用で分けて開発する必要がないのもありがたいですね。

```html:App.vue（9行目付近）
      <v-btn large color="error" @click="doLogout" v-show="loggedIn === true && inClient === false">Sign out</v-btn>
```
#### ユーザーログイン状態に応じて表示するコンポーネントを切り替える
ユーザーのログイン状態に応じて、2つあるコンポーネントを切り替えています。
未ログインの場合はログインをボタンを配置したコンポーネントを、ログイン状態時にはLIFF 機能を実行するボタンを配置したコンポーネントを表示します。

* [LiffV2Login コンポーネント](https://github.com/sumihiro3/liff-v2-sample/blob/master/src/components/LiffV2Login.vue)
    * LINE Login を実行するボタンを配置したコンポーネント
* [LiffV2Function コンポーネント](https://github.com/sumihiro3/liff-v2-sample/blob/master/src/components/LiffV2Function.vue)
    * LIFF v2 の機能を実行するボタンを配置したコンポーネント

##### LiffV2Login コンポーネント
ログインボタンを配置しているだけのコンポーネントです。
LINE Login への認証も ```liff.login()``` だけで、とても簡単に認証を利用できます。

```javascript:LiffV2Login.vue（24行目付近）
  methods: {
    doLogin: function () {
      liff.login()
    }
  }
```

##### LiffV2Function コンポーネント
LIFF v2 の機能を試すボタンを配置したコンポーネントです。

ログイン状態で利用できる機能のボタンはログイン状態だけを確認しています。

```html:LiffV2Function.vue（20行目付近）
        <!-- getAccessToekn -->
        <div class="ma-4">
          <v-btn
            rounded
            class="custom-transform-class text-none"
            color="primary"
            @click="getAccessToken"
            :disabled="loggedIn === false"
          >getAccessToekn</v-btn>
        </div>
```

ログイン状態かつ、LINE アプリ無いブラウザで利用できる機能のボタンは両方の状態を確認してボタンを有効にするかどうかを判別しています。

```html:LiffV2Function.vue（72行目付近）
        <!-- sendMessages -->
        <div class="ma-4">
          <v-btn
            rounded 
            class="custom-transform-class text-none"
            color="success"
            @click="sendMessages"
            :disabled="loggedIn === false || inClient === false"
          >sendMessage</v-btn>
        </div>
```

LIFF API を実行するコードもとてもシンプルで、簡単にLIFF 機能を利用できます。

```javascript:LiffV2Function.vue（138行目付近）
    getAccessToken: function() {
      this.accessToken = liff.getAccessToken()
      const text = `Your Access Token is [${this.accessToken}]`
      console.log(text)
      this.showSnackbar(text)
    },
```

```javascript:LiffV2Function.vue（162行目付近）
    sendMessages: function() {
      const text = `I am ${this.name} !!`
      const msg = `Message is [${text}]`
      console.log(msg)
      this.showSnackbar(msg)
      liff
        .sendMessages([
          {
            type: "text",
            text: text
          }
        ])
        .then(() => {
          console.log("message sent")
        })
        .catch(err => {
          console.log("error", err)
        })
    },
```

## LIFF ID の作成
LIFF アプリを利用するには、LIFF ID を取得する必要があります。
LIFF ID 取得や設定方法については、@h-takauma さんの[記事「LIFF v2でLINEログインを試してみた」](https://qiita.com/h-takauma/items/f954a6c2a8ad9ee4396b) に詳しく書いてありますので、そちらを参考にしてください。

## いろいろ試してみたい方へ
自分でいろいろと試してみたい、という方には、@n0bisuke さんが、[LIFF v2 のハンズオン資料](https://qiita.com/n0bisuke/items/e367bb2d96e9b0cbc4ba) を公開されていますので、こちらも参考にしてください。

# 最後に
LIFF はv2 になって新機能の追加はもちろんですが、外部ブラウザでも使えるようになったことがとても大きいですね。
外部ブラウザに対応したことで、LINE アプリ外とLINE アプリを連携させる、という概念ができたことで、利用する場面が大きく広がりました。
LINE でアプリ開発 = チャットボット開発、というイメージの方も多いと思いますが、LIFF v2 のリリースでそんな垣根は取っ払われたと思います。
**多くの方が普段から使っているLINE** という特性を活用したWeb アプリを開発できますので、これまで触れていなかった方々も、これを機会に開発してみてください。

また、開発コンテンストの[ヒーローズ・リーグ 2019 （Mashup Awards から名称変更）](https://hl2019.we-are-ma.jp/) では、[LINE リーグ](https://hl2019.we-are-ma.jp/outline/#line) も開催されます。
LIFF を活用した作品を開発し、こちらに応募して賞獲得を目指してみてはいかがでしょうか。