💡

LINEミニアプリ / LIFFでliffId is necessary for liff.init()エラーが出たときの対処法

2021/06/21に公開

どうもー、BULB加藤です。ZennでLINE開発の情報をお届けしています。

LINEミニアプリの開発中に陥ったエラーと対処法をメモしておきます

liff.isLoggedIn()で UIDを取得したいのにエラーになる

ReactでLIFFを組んでいまして、UID取得のためにliff.isLoggedIn()でtrueならUIDをsetStateで保存するというのをやろうとしていました。

  React.useEffect(() => {
      if (liff.isLoggedIn()) {
        const context = liff.getContext()
        const liffToken = liff.getAccessToken()
        setUid(context.userId)
        setAccessToken(liffToken)
      } 
  }, [])

しかしこれがうまく行かず。Error: liffId is necessary for liff.init()というエラーになります

ログインしているかどうかの判定をしたいのであってLiffIDは求めていないのだが、、?と困っていろいろいじってみたのですがわからず。

useEffectの引数でLiffの初期化を待ってから実行するようにしないとだめなのか?などと考えたものの、これはこれで大変そう。

LIFFが初期化できているかを判定する関数があった

こんなありがたい記事があり助かりました。
https://qiita.com/leokey/items/29d750562e4a849281e1#問題1liffinitのタイミング失敗

liff.init()がされる前にisLoggedin()が実行されてしまっているのはわかっており、それによるエラーということも把握してはいたのですが

liff.init()が実行されたかどうかの判定する方法がわからず困っていたわけですね。

こういうときは「liff.ready」プロパティを使えば良いようです。

  React.useEffect(() => {
    liff.ready.then(() => {
      if (liff.isLoggedIn()) {
        const context = liff.getContext()
        const liffToken = liff.getAccessToken()
        setUid(context.userId)
        setAccessToken(liffToken)
      } 
    })
  }, [])

これでLIFFが初期化された時にUIDやトークンの取得処理をすることができました〜!エラーが一瞬意味不明で戸惑いましたが、少し調べるとそれ用のLIFFのAPIや解決法が用意されていますね。

CoLife Developers

Discussion