2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

お題は不問!Qiita Engineer Festa 2024で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

できるLIFFアプリ開発者になるための基本のシェアターゲットピッカー

Last updated at Posted at 2024-06-30

はじめに

LIFFアプリ開発について、基本的な実装方法は前回の記事で紹介しました。

今回は、LIFFの特徴的な機能の一つであるシェアターゲットピッカーについて紹介します。

シェアターゲットピッカーとは

シェアターゲットピッカーは、LIFFアプリからLINEの友だちやグループにメッセージを送信するための機能です。

事前準備

基本的な設定はすべて完了している想定ですすめます。
(詳細はこちらの記事を参照してください。)
そのうえで、シェアターゲットピッカーを利用するには、LINE Developers側で有効化する必要があります。
LINE Developersのプロバイダー→チャネル→LIFFタブから、以下の設定が確認できます。

現在シェアターゲットピッカーはOFFになっているので、トグルボタンをクリックします。

同意して有効化します。

以下のようにONの状態になれば準備完了です

基本的な実装

まずはシェアターゲットピッカーの機能を簡単に確認していきます。

import liff, { Liff } from "@line/liff";
import { useEffect, useState } from "react";

const App = () => {
  const [message, setMessage] = useState("");
  const [liffObject, setLiffObject] = useState<Liff>();

  useEffect(() => {
    initializeLiff();
  }, []);

  // liffの初期化
  const initializeLiff = async () => {
    try {
      await liff.init({
        liffId: import.meta.env.VITE_LIFF_ID,
        withLoginOnExternalBrowser: true,
      });
      setLiffObject(liff);
    } catch (error) {
      console.log(error);
    }
  };

  // シェアターゲットピッカーによるメッセージシェア
  const shareMessage = async () => {
    if (!liffObject) {
      console.log("LIFF is not initialized");
      return;
    }

    try {
      await liffObject.shareTargetPicker([
        {
          type: "text",
          text: message,
        },
      ]);
    } catch (error) {
      console.log(error);
    }
  };

  if (!liffObject) {
    return <div>Loading...</div>;
  }

  return (
    <div>
      <h1>シェアターゲットピッカー デモ</h1>
      <input
        type="text"
        value={message}
        onChange={(e) => setMessage(e.target.value)}
        placeholder="メッセージを入力"
      />
      <button onClick={shareMessage}>メッセージをシェアする</button>
    </div>
  );
};

export default App;

このコードでは、以下のような処理を行っています

  • LIFFの初期化の関数を定義
  • シェアターゲットピッカー用の関数を定義
  • シェア用メッセージ入力欄と、シェア用ボタンの用意

こちらを実装すると以下のようになります

適当なメッセージを入力して、「メッセージをシェアする」ボタンを押します。

メッセージをシェアする先を選択する画面が表示されます。
グループ、友達、トークの中から自由に送信先を選択できます。

今回はLINE公式アカウントを送信対象に選択しました。

送信ボタンを押すとそのままメッセージが送信されるので、送信対象は慎重に選んでください。

ボタンを押下すると、以下のようにメッセージが送信されていることがわかります。

シェアターゲットピッカーのオプション

オプションは現状以下の1つのみのようです。

isMultiple

送信先を複数選択か、単一選択かに絞ることができます。
デフォルトはtrueとなっています。
falseに設定することで、送信先に一つしか選べなくなります。

メッセージの種類

テキストメッセージ以外にも、画像、動画、位置情報など、様々な種類のメッセージを送信できます。以下は画像メッセージの例です:

await liffObject.shareTargetPicker([
  {
    type: 'image',
    originalContentUrl: 'https://example.com/image.jpg',
    previewImageUrl: 'https://example.com/image_preview.jpg',
  },
]);

また、送信するメッセージは最大5つまで設定することができます。

実践的な実装例

それでは、より実践的な実装例を見ていきましょう。この例では、テキストメッセージと画像メッセージを選択して送信できるようにします。

import { useState, useEffect } from "react";
import liff, { Liff } from "@line/liff";
import { SendMessagesParams } from "@liff/send-messages";

type MessageType = "text" | "image";

interface Message {
  type: MessageType;
  content: string;
}

function App() {
  const [messages, setMessages] = useState<Message[]>([]);
  const [currentMessage, setCurrentMessage] = useState("");
  const [currentType, setCurrentType] = useState<MessageType>("text");
  const [liffObject, setLiffObject] = useState<Liff>();
  const [liffError, setLiffError] = useState("");

  useEffect(() => {
    initializeLiff();
  }, []);

  // liffの初期化
  const initializeLiff = async () => {
    try {
      await liff.init({
        liffId: import.meta.env.VITE_LIFF_ID,
        withLoginOnExternalBrowser: true,
      });
      setLiffObject(liff);
    } catch (error) {
      setLiffError(error instanceof Error ? error.message : String(error));
    }
  };

  // メッセージ追加処理
  const addMessage = () => {
    if (currentMessage) {
      setMessages([
        ...messages,
        { type: currentType, content: currentMessage },
      ]);
      setCurrentMessage("");
    }
  };

  // シェアターゲットピッカーによるメッセージシェア
  const shareMessages = async () => {
    if (!liffObject) {
      alert("LIFF is not initialized");
      return;
    }

    try {
      const liffMessages: SendMessagesParams = messages.map((msg) => {
        if (msg.type === "text") {
          return { type: "text", text: msg.content };
        } else {
          return {
            type: "image",
            originalContentUrl: msg.content,
            previewImageUrl: msg.content,
          };
        }
      });

      await liffObject.shareTargetPicker(liffMessages, {
        isMultiple: true,
      });
    } catch (error) {
      alert("Failed to share: " + error);
    }
  };

  // エラー表示
  if (liffError) {
    return <div>Error: {liffError}</div>;
  }

  // 初期化待ち表示
  if (!liffObject) {
    return <div>Loading...</div>;
  }

  return (
    <div>
      <h1>シェアターゲットピッカー デモ</h1>
      <div>
        <select
          value={currentType}
          onChange={(e) => setCurrentType(e.target.value as MessageType)}
        >
          <option value="text">テキスト</option>
          <option value="image">画像</option>
        </select>
        <input
          type="text"
          value={currentMessage}
          onChange={(e) => setCurrentMessage(e.target.value)}
          placeholder={
            currentType === "text" ? "メッセージを入力" : "画像URLを入力"
          }
        />
        <button onClick={addMessage}>メッセージを追加</button>
      </div>
      <ul>
        {messages.map((msg, index) => (
          <li key={index}>
            {msg.type}: {msg.content}
          </li>
        ))}
      </ul>
      <button onClick={shareMessages}>メッセージをシェア</button>
    </div>
  );
}

export default App;

この実装例では、以下の機能を追加しています:

  • テキストメッセージと画像メッセージの選択
  • 追加したメッセージのリスト表示
  • メッセージの複数送信
    「メッセージをシェア」ボタンをクリックすると、追加したすべてのメッセージを共有できます。

今回は画像送信をしていませんが、設定したメッセージを複数送信することができました。

まとめ

LIFFのシェアターゲットピッカーを使うことで、ユーザーが簡単にLINEの友だちやグループにメッセージを送信できるようになりました。

この機能を使いこなすことで、アプリの拡散や情報共有がより効果的に行えるようになります。

LIFFアプリには他にもいろいろな機能があるので、また別の機会に紹介したいと思います。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?