# カスタムアクションボタンを実装する
LINEミニアプリでは、現在開いているページを友だちと共有できるアクションボタンが、(A)ヘッダーに用意されています。このアクションボタンはLINEによって実装されていてデフォルトで表示されますが、ボタンの動作やメッセージの内容は、カスタマイズできません。
一方、(B)ボディにカスタムアクションボタンを実装すると、メッセージの内容をカスタマイズしてLINEミニアプリをシェアできます。
# ガイドライン
カスタムアクションボタンを実装してカスタムシェアメッセージを送信する場合は、ユーザーがメッセージの内容を早くかつ正確に把握できるように、以下のガイドラインに従ってください。
提供するサービスの特性上、このドキュメントのガイドラインのとおりにカスタムシェアメッセージを実装できない場合は、mini_request@linecorp.comまでご連絡ください。
# シェアターゲットピッカーの利用
ボディにカスタムアクションボタンを配置し、ボタンがタップされたときに、ターゲットピッカー(グループまたは友だちを選択する画面)を表示するように実装してください。ターゲットピッカーでユーザーが送信相手を選択すると、Flex Messageなど、開発者が作成したメッセージを送信できます。
シェアターゲットピッカーを利用する方法について詳しくは、「ユーザーの友だちにメッセージを送信する(シェアターゲットピッカー)」を参照してください。
# カスタムシェアメッセージのフォーマット
カスタムシェアメッセージは、Flex Messageのバブルコンテナを使用して作成します。 Flex Messageのカルーセルコンテナは使用しないでください。
また、カスタムシェアメッセージには、標準タイプと画像リストタイプがあり、それぞれ以下のA~Fのセクションに分かれています。
ラベル | セクション | 必須 | 説明 |
---|---|---|---|
A | 画像 | 任意 | 全体をスクロールせずに表示できる大きさの画像を設定してください。 |
B | タイトル | 必須 | メッセージの内容を要約してください。 |
C | サブタイトル | ※ | メッセージの副題です。 |
D | 詳細 | ※ | ラベルと説明を含めた項目を挿入してください。標準タイプと画像リストタイプで挿入できる項目の最大数が異なります。
|
E | ボタン | 必須 |
|
F | フッター | 必須 | LINEミニアプリのアイコン、LINEミニアプリの名前、および画像( ![]() https://liff.line.me/{your-liff-ID}/ )を表示するようにURIアクションを指定してください。 |
※サブタイトル(C)または詳細(D)のいずれか一方を挿入する必要があります。両方を挿入することもできます。
# 標準タイプのガイドライン
標準タイプのFlex Messageは、以下のガイドラインに従ってください。
JSONファイルの例は、「ガイドラインに従ったJSONファイルの例」を参照してください。
- アクションは、ボタン(E)およびフッター(F)の指定されたコンポーネントにのみ設定できます。
- ここで説明されていないプロパティは変更してはいけません。
# 標準タイプ - 画像(A)
画像(A)は、ヒーローブロックに入れてください。
ラベル | セクション | 要素 | 説明 |
---|---|---|---|
A | 画像 | ヒーローブロック > 画像 |
|
{
"type": "bubble",
"hero": { // ヒーローブロック
// 画像(A)
"type": "image",
"url": "https://example.com/hero-image.png",
"size": "full",
"aspectRatio": "20:13",
"aspectMode": "cover"
},
"body": {...}
}
# 標準タイプ - ボディ
タイトル(B)、サブタイトル(C)、詳細(D)、ボタン(E)を入れるボディブロックは、以下のように指定してください。
ラベル | セクション | 要素 | 説明 |
---|---|---|---|
- | - | ボディブロック > ボックス |
|
{
"type": "bubble",
"hero": { ... },
"body": { // ボディブロック
// ボックス
"type": "box",
"layout": "vertical",
"contents": [ ... ],
"spacing": "md"
}
}
# 標準タイプ - タイトル(B)
ラベル | セクション | 要素 | 説明 |
---|---|---|---|
B | タイトル | ボックス |
|
B | タイトル | テキスト |
|
{
"type": "bubble",
"hero": { ... },
"body": {
"type": "box",
"layout": "vertical",
"contents": [
{ // タイトル(B) - ボックス
"type": "box",
"layout": "vertical",
"contents": [
{ // テキスト
"type": "text",
"text": "Main title",
"size": "lg",
"color": "#000000",
"weight": "bold",
"wrap": true
}
],
"spacing": "none"
}
],
"spacing": "md"
}
}
# 標準タイプ - サブタイトル(C)
ラベル | セクション | 要素 | 説明 |
---|---|---|---|
C | サブタイトル | ボックス |
|
C | サブタイトル | テキスト |
|
{
"type": "bubble",
"hero": { ... },
"body": {
"type": "box",
"layout": "vertical",
"contents": [
{ // タイトル(B) - ボックス
...
},
{ // サブタイトル(C) - ボックス
"type": "box",
"layout": "vertical",
"contents": [
{ // テキスト
"type": "text",
"text": "Sub-title",
"size": "sm",
"color": "#999999",
"wrap": true
}
],
"spacing": "none"
}
],
"spacing": "md"
}
}
# 標準タイプ - 詳細(D)
ラベル | セクション | 要素 | 説明 |
---|---|---|---|
D | 詳細 | ボックス |
|
D | 詳細 - アイテム | ボックス | D-1~D-2を1組だけ入れるボックスです。
|
D-1 | 詳細 - ラベル | テキスト |
|
D-2 | 詳細 - 説明 | テキスト |
|
{
"type": "bubble",
"hero": { ... },
"body": {
"type": "box",
"layout": "vertical",
"contents": [
{ // タイトル(B) - ボックス
...
},
{ // サブタイトル(C) - ボックス
...
},
{ // 詳細(D) - ボックス
"type": "box",
"layout": "vertical",
"contents": [
{ // ラベル(D-1) - ボックス
"type": "box",
"layout": "horizontal",
"contents": [
{ // テキスト
"type": "text",
"text": "Label 1",
"size": "sm",
"color": "#555555",
"wrap": false,
"flex": 20
},
{ // 説明
"type": "text",
"text": "Description 1",
"size": "sm",
"color": "#111111",
"wrap": false,
"flex": 55
}
],
"flex": 1,
"spacing": "sm"
},
{ // 説明(D-2) - ボックス
"type": "box",
"layout": "horizontal",
"contents": [
{ // テキスト
"type": "text",
"text": "Label 2",
"size": "sm",
"color": "#555555",
"wrap": false,
"flex": 20
},
{ // テキスト
"type": "text",
"text": "Description 2",
"size": "sm",
"color": "#111111",
"wrap": false,
"flex": 55
}
],
"flex": 1,
"spacing": "sm"
}
],
"spacing": "sm",
"margin": "lg",
"flex": 1
}
],
"spacing": "md"
}
}
# 標準タイプ - ボタン (E)
ラベル | セクション | 要素 | 説明 |
---|---|---|---|
E | ボタン | ボックス | E-1~E-2を入れるボックスです。
|
E-1 | ボタン (linkスタイルのみを使用する場合) | ボタン |
|
E-2 | ボタン (primaryスタイルを使用する場合) | ボタン |
|
primaryスタイルを使用する場合:
{
"type": "bubble",
"hero": { ... }
},
"body": {
"type": "box",
"layout": "vertical",
"contents": [
{ // タイトル(B) - ボックス
...
},
{ // サブタイトル(C) - ボックス
...
},
{ // 詳細(D) - ボックス
...
},
{ // ボタン(E) - ボックス
"type": "box",
"layout": "vertical",
"contents": [
{ // ボタン(primary)
"type": "button",
"action": {
"type": "uri",
"label": "View details",
"uri": "https://liff.line.me/123456-abcedfg/"
},
"style": "primary",
"height": "md",
"color": "#17c950"
},
{ // ボタン(link)
"type": "button",
"action": {
"type": "uri",
"label": "Share",
"uri": "https://liff.line.me/123456-abcedfg/share"
},
"style": "link",
"height": "md",
"color": "#469fd6"
}
],
"spacing": "xs",
"margin": "lg"
}
],
"spacing": "md"
}
}
# 標準タイプ - フッター(F)
フッター(F)は、フッターブロックに入れてください。
ラベル | セクション | 要素 | 説明 |
---|---|---|---|
- | - | フッターブロック > ボックス |
|
- | - | セパレータ |
|
F | フッター | ボックス | F-1~F-3を入れるボックスです。
|
F-1 | LINEミニアプリのアイコン | 画像 |
|
F-2 | LINEミニアプリの名前 | テキスト |
|
F-3 | ![]() | 画像 |
|
{
"type": "bubble",
"hero": { ... },
"body": { ... },
"footer": { // フッターブロック
// ボックス
"type": "box",
"layout": "vertical",
"contents": [
{ // セパレータ
"type": "separator",
"color": "#f0f0f0"
},
{ // フッター(F) - ボックス
"type": "box",
"layout": "horizontal",
"contents": [
{ // LINEミニアプリのアイコン(F-1)
"type": "image",
"url": "https://example.com/line-mini-app-icon.png",
"flex": 1,
"gravity": "center"
},
{ // LINEミニアプリの名前(F-2)
"type": "text",
"text": "Service name",
"flex": 19,
"size": "xs",
"color": "#999999",
"weight": "bold",
"gravity": "center",
"wrap": false
},
{ // >(F-3)
"type": "image",
"url": "https://vos.line-scdn.net/service-notifier/footer_go_btn.png",
"flex": 1,
"gravity": "center",
"size": "xxs",
"action": {
"type": "uri",
"label": "action",
"uri": "https://liff.line.me/123456-abcedfg/"
}
}
],
"flex": 1,
"spacing": "md",
"margin": "md"
}
]
}
}
# 画像リストタイプのガイドライン
画像リストタイプのFlex Messageは、以下のガイドラインに従ってください。
JSONファイルの例は、「ガイドラインに従ったJSONファイルの例」を参照してください。
- アクションは、ボタン(E)およびフッター(F)の指定されたコンポーネントにのみ設定できます。
- ここで説明されていないプロパティは変更してはいけません。
# 画像リストタイプ - 画像(A)
画像(A)は、ヒーローブロックに入れてください。
ラベル | セクション | 要素 | 説明 |
---|---|---|---|
A | 画像 | ヒーローブロック > 画像 |
|
{
"type": "bubble",
"hero": { // ヒーローブロック
// 画像(A)
"type": "image",
"url": "https://example.com/hero-image.png",
"size": "full",
"aspectRatio": "20:13",
"aspectMode": "cover"
},
"body": {...}
}
# 画像リストタイプ - ボディ
タイトル(B)、サブタイトル(C)、詳細(D)、ボタン(E)を入れるボディブロックは以下のように指定してください。
ラベル | セクション | 要素 | 説明 |
---|---|---|---|
- | - | ボディブロック > ボックス |
|
{
"type": "bubble",
"hero": { ... },
"body": { // ボディブロック
// ボックス
"type": "box",
"layout": "vertical",
"contents": [ ... ],
"spacing": "md"
}
}
# 画像リストタイプ - タイトル(B)
ラベル | セクション | 要素 | 説明 |
---|---|---|---|
B | タイトル | ボックス |
|
B | タイトル | テキスト |
|
{
"type": "bubble",
"hero": { ... },
"body": {
"type": "box",
"layout": "vertical",
"contents": [
{ // タイトル(B) - ボックス
"type": "box",
"layout": "vertical",
"contents": [
{ // テキスト
"type": "text",
"text": "Main title",
"size": "lg",
"color": "#000000",
"weight": "bold",
"wrap": true
}
],
"spacing": "none"
}
],
"spacing": "md"
}
}
# 画像リストタイプ - サブタイトル(C)
ラベル | セクション | 要素 | 説明 |
---|---|---|---|
C | サブタイトル | ボックス |
|
C | サブタイトル | テキスト |
|
{
"type": "bubble",
"hero": { ... },
"body": {
"type": "box",
"layout": "vertical",
"contents": [
{ // タイトル(B) - ボックス
...
},
{ // サブタイトル(C) - ボックス
"type": "box",
"layout": "vertical",
"contents": [
{ // テキスト
"type": "text",
"text": "Sub-title",
"size": "sm",
"color": "#999999",
"wrap": true
}
],
"spacing": "none"
}
],
"spacing": "md"
}
}
# 画像リストタイプ - 詳細(D)
ラベル | セクション | 要素 | 説明 |
---|---|---|---|
D | 詳細 | ボックス |
|
- | 詳細 - アイテム | ボックス | D-1~D-4を1組だけ入れるボックスです。
|
D-1 | 詳細 - 画像 | 画像 |
|
- | 詳細 - テキストエリア | ボックス | D-2~D-4を入れるボックスです。
|
D-2 | 詳細 - 標準テキスト | テキスト |
|
D-3 | 詳細 - 強調テキスト | テキスト |
|
D-4 | 詳細 - 画像+テキスト | ボックス | D-4の画像とテキストを入れるボックス:
|
{
"type": "bubble",
"hero": { ... },
"body": {
"type": "box",
"layout": "vertical",
"contents": [
{ // タイトル(B) - ボックス
...
},
{ // サブタイトル(C) - ボックス
...
},
{ // 詳細(D) - ボックス
"type": "box",
"layout": "vertical",
"contents": [
{ // アイテム
"type": "box",
"layout": "horizontal",
"contents": [
{ // 画像
"type": "image",
"url": "https://example.com/item-image01.png",
"flex": 3,
"size": "sm",
"aspectRatio": "1:1",
"aspectMode": "cover"
},
{ // テキストエリア
"type": "box",
"layout": "vertical",
"contents": [
{ // 標準テキスト(D-2)
"type": "text",
"text": "General text",
"size": "md",
"color": "#111111"
},
{ // 強調テキスト(D-3)
"type": "text",
"text": "Text to emphasize",
"size": "md",
"color": "#111111"
},
{ // 画像+テキスト(D-4)
"type": "box",
"layout": "horizontal",
"contents": [
{ // 画像
"type": "image",
"url": "https://example.com/item-image02.png",
"flex": 8,
"gravity": "center",
"size": "xxs",
"aspectRatio": "1:1"
},
{ // テキスト
"type": "text",
"text": "Image + text",
"flex": 85,
"gravity": "center",
"size": "sm",
"color": "#17c950",
"margin": "xs"
}
],
"flex": 1
}
],
"flex": 8,
"spacing": "xs",
"margin": "md"
}
],
"flex": 1
}
],
"spacing": "xl",
"margin": "lg"
}
],
"spacing": "md"
}
}
# 画像リストタイプ - ボタン (E)
ラベル | セクション | 要素 | 説明 |
---|---|---|---|
E | ボタン | ボックス | E-1~E-2を入れるボックスです。
|
E-1 | ボタン (linkのみを使用する場合) | ボタン |
|
E-2 | ボタン (primaryを使用する場合) | ボタン |
|
primaryを使用する場合:
{
"type": "bubble",
"hero": { ... }
},
"body": {
"type": "box",
"layout": "vertical",
"contents": [
{ // タイトル(B) - ボックス
...
},
{ // サブタイトル(C) - ボックス
...
},
{ // 詳細(D) - ボックス
...
},
{ // ボタン(E) - ボックス
"type": "box",
"layout": "vertical",
"contents": [
{ // ボタン(primary)
"type": "button",
"action": {
"type": "uri",
"label": "View details",
"uri": "https://liff.line.me/123456-abcedfg/"
},
"style": "primary",
"height": "md",
"color": "#17c950"
},
{ // ボタン(link)
"type": "button",
"action": {
"type": "uri",
"label": "Share",
"uri": "https://liff.line.me/123456-abcedfg/share"
},
"style": "link",
"height": "md",
"color": "#469fd6"
}
],
"spacing": "xs"
}
],
"spacing": "md"
}
}
# 画像リストタイプ - フッター(F)
ラベル | セクション | 要素 | 説明 |
---|---|---|---|
- | - | フッターブロック > ボックス |
|
- | - | セパレータ |
|
F | フッター | ボックス | F-1~F-3を入れるボックスです。
|
F-1 | LINEミニアプリのアイコン | 画像 |
|
F-2 | LINEミニアプリの名前 | テキスト |
|
F-3 | ![]() | 画像 |
|
{
"type": "bubble",
"hero": { ... },
"body": { ... },
"footer": { // フッターブロック
// ボックス
"type": "box",
"layout": "vertical",
"contents": [
{ // セパレータ
"type": "separator",
"color": "#f0f0f0"
},
{ // フッター(F) - ボックス
"type": "box",
"layout": "horizontal",
"contents": [
{ // LINEミニアプリのアイコン(F-1)
"type": "image",
"url": "https://example.com/line-mini-app-icon.png",
"flex": 1,
"gravity": "center"
},
{ // LINEミニアプリの名前(F-2)
"type": "text",
"text": "Service name",
"flex": 19,
"size": "xs",
"color": "#999999",
"weight": "bold",
"gravity": "center",
"wrap": false
},
{ // >(F-3)
"type": "image",
"url": "https://vos.line-scdn.net/service-notifier/footer_go_btn.png",
"flex": 1,
"gravity": "center",
"size": "xxs",
"action": {
"type": "uri",
"label": "action",
"uri": "https://liff.line.me/123456-abcedfg/"
}
}
],
"flex": 1,
"spacing": "md",
"margin": "md"
}
]
}
}