คู่มือพัฒนา LIFF App: สร้างแอป LINE Front-end Framework
คู่มือฉบับสมบูรณ์สำหรับสร้าง LIFF (LINE Front-end Framework) apps สร้างเว็บแอปพลิเคชันที่ทำงานได้อย่างราบรื่นภายใน LINE พร้อม authentication, การเข้าถึงโปรไฟล์ และความสามารถในการส่งข้อความ

#LIFF คืออะไร?
LIFF (LINE Front-end Framework) คือแพลตฟอร์มสำหรับสร้างเว็บแอปพลิเคชันที่ทำงานภายในแอป LINE แอป LIFF ให้ประสบการณ์คล้ายแอป native ในขณะที่ใช้เทคโนโลยีเว็บมาตรฐาน
#ฟีเจอร์หลัก
- Seamless Authentication: เข้าถึงโปรไฟล์ LINE ของผู้ใช้โดยไม่ต้องฟอร์มล็อกอิน
- Message Sending: ส่งข้อความไปยังแชทโดยตรงจากแอปของคุณ
- Share Target Picker: ให้ผู้ใช้แชร์เนื้อหาไปยังเพื่อนและกลุ่ม
- QR Code Scanner: ความสามารถสแกน barcode/QR ในตัว
- Native Feel: ประสบการณ์เต็มหน้าจอภายใน LINE
#Use Cases
| Use Case | ตัวอย่าง | ประโยชน์ |
|---|---|---|
| E-commerce | แคตตาล็อกสินค้า, checkout | ไม่ต้องดาวน์โหลดแอป |
| Reservations | จองร้านอาหาร, นัดหมาย | เข้าถึงเร็วผ่าน LINE |
| Membership | บัตรสมาชิก, ระบบคะแนน | Auto-authenticated |
| Forms | แบบสำรวจ, ลงทะเบียน | Rich UX, ข้อมูลเติมล่วงหน้า |
| Games | เกมมินิ, คำถาม | ฟีเจอร์แชร์ viral |
เรียนรู้เพิ่มเติมเกี่ยวกับ บริการพัฒนาแอป LINE
#ตั้งค่าโปรเจกต์
#ขั้นตอนที่ 1: สร้าง LIFF App ใน LINE Console
- ไปที่ LINE Developers Console
- เลือก provider และ channel ของคุณ
- ไปที่แท็บ LIFF
- คลิก "Add LIFF app"
- กำหนดค่า:
- LIFF app name: ชื่อแอปของคุณ
- Size: Full, Tall หรือ Compact
- Endpoint URL: URL แอปของคุณ (ต้องเป็น HTTPS)
- Scopes: profile, openid, chat_message.write
#ขั้นตอนที่ 2: ตั้งค่าโปรเจกต์ React/Next.js
npx create-next-app@latest my-liff-app --typescript
cd my-liff-app
npm install @line/liff
#ขั้นตอนที่ 3: Initialize LIFF SDK
สร้างไฟล์ LIFF utility:
// lib/liff.ts
import liff from '@line/liff';
const LIFF_ID = process.env.NEXT_PUBLIC_LIFF_ID!;
export async function initLiff() {
try {
await liff.init({ liffId: LIFF_ID });
console.log('LIFF initialized successfully');
return true;
} catch (error) {
console.error('LIFF initialization failed:', error);
return false;
}
}
export function isLoggedIn() {
return liff.isLoggedIn();
}
export function login() {
liff.login();
}
export function logout() {
liff.logout();
}
export async function getProfile() {
if (!liff.isLoggedIn()) return null;
return liff.getProfile();
}
export { liff };
#User Authentication
#Getting User Profile
// components/UserProfile.tsx
'use client';
import { useLiff } from './LiffProvider';
import Image from 'next/image';
export function UserProfile() {
const { isReady, isLoggedIn, profile, login, logout } = useLiff();
if (!isReady) {
return <div>กำลังโหลด...</div>;
}
if (!isLoggedIn) {
return (
<button onClick={login} className="btn-primary">
เข้าสู่ระบบด้วย LINE
</button>
);
}
return (
<div className="flex items-center gap-4">
{profile?.pictureUrl && (
<Image
src={profile.pictureUrl}
alt={profile.displayName}
width={48}
height={48}
className="rounded-full"
/>
)}
<div>
<p className="font-semibold">{profile?.displayName}</p>
<button onClick={logout} className="text-sm text-gray-500">
ออกจากระบบ
</button>
</div>
</div>
);
}
#Messaging Integration
#Sending Messages
// ส่งข้อความไปยังแชทปัจจุบัน
async function sendMessage(text: string) {
if (!liff.isInClient()) {
alert('ฟีเจอร์นี้ใช้งานได้เฉพาะภายใน LINE');
return;
}
await liff.sendMessages([
{
type: 'text',
text: text
}
]);
}
#Share Target Picker
ให้ผู้ใช้แชร์เนื้อหาไปยังเพื่อนหรือกลุ่ม:
async function shareToFriends() {
if (!liff.isApiAvailable('shareTargetPicker')) {
alert('ฟีเจอร์แชร์ไม่พร้อมใช้งาน');
return;
}
const result = await liff.shareTargetPicker([
{
type: 'flex',
altText: 'ดูสินค้านี้สิ!',
contents: {
type: 'bubble',
hero: {
type: 'image',
url: 'https://example.com/product.jpg',
size: 'full',
aspectRatio: '20:13'
},
body: {
type: 'box',
layout: 'vertical',
contents: [
{ type: 'text', text: 'สินค้าสุดเจ๋ง', weight: 'bold' },
{ type: 'text', text: '฿999', color: '#06C755' }
]
}
}
}
]);
if (result) {
console.log('แชร์สำเร็จ');
}
}
#Best Practices
#1. Handle External Browser
แอป LIFF สามารถเปิดใน external browsers ได้ จัดการอย่างเหมาะสม:
function App() {
const { isReady, isInClient, isLoggedIn, login } = useLiff();
if (!isReady) return <LoadingScreen />;
// ถ้าไม่ได้อยู่ใน LINE และไม่ได้ล็อกอิน แสดงปุ่มล็อกอิน
if (!isInClient && !isLoggedIn) {
return (
<div className="text-center p-8">
<h1>ยินดีต้อนรับ!</h1>
<p>เข้าสู่ระบบด้วย LINE เพื่อดำเนินการต่อ</p>
<button onClick={login} className="btn-primary">
เข้าสู่ระบบด้วย LINE
</button>
</div>
);
}
return <MainApp />;
}
#2. Responsive Design สำหรับ LIFF Sizes
/* Compact: ~50% ของความสูงหน้าจอ */
/* Tall: ~75% ของความสูงหน้าจอ */
/* Full: 100% ของหน้าจอ */
.liff-container {
min-height: 100vh;
min-height: 100dvh; /* Dynamic viewport height */
}
/* Safe area สำหรับอุปกรณ์ที่มี notch */
.liff-content {
padding-bottom: env(safe-area-inset-bottom);
}
#3. Deep Linking
สร้าง URL ที่แชร์ได้ที่เปิดหน้าเฉพาะ:
// รูปแบบ LIFF URL: https://liff.line.me/{liffId}/{path}
const productUrl = `https://liff.line.me/${LIFF_ID}/product/${productId}`;
#Deployment
#Deploy ไปยัง Vercel
# ติดตั้ง Vercel CLI
npm install -g vercel
# Deploy
vercel --prod
#Environment Variables
ตั้งค่าใน Vercel dashboard หรือ .env.local:
NEXT_PUBLIC_LIFF_ID=your-liff-id
#Testing Checklist
- ทดสอบในแอป LINE (iOS และ Android)
- ทดสอบใน external browser
- ทดสอบ login/logout flow
- ทดสอบการส่งข้อความ (ถ้ามี)
- ทดสอบ share target picker (ถ้ามี)
- ทดสอบบนหน้าจอขนาดต่างๆ
#สรุป
LIFF เปิดโอกาสให้รวมเว็บแอปของคุณกับ LINE ได้อย่างทรงพลัง ประเด็นสำคัญ:
- Initialize LIFF ตั้งแต่เริ่มต้น app lifecycle
- จัดการทั้ง in-client และ external browser scenarios
- ใช้ Share Target Picker สำหรับฟีเจอร์ viral
- ยืนยัน access tokens บน backend เสมอ
- ทดสอบอย่างละเอียดบนอุปกรณ์จริง
พร้อมสร้าง LIFF app ของคุณหรือยัง?
ลอง LineBot.pro สำหรับการพัฒนา LIFF อย่างรวดเร็วด้วย templates และ tools ของเรา สร้าง LINE mini-apps เร็วขึ้นด้วย pre-built components
แหล่งข้อมูลที่เกี่ยวข้อง:
บริการที่เกี่ยวข้อง
พร้อม Automate ธุรกิจ LINE ของคุณหรือยัง?
เริ่มทำให้การสื่อสาร LINE ของคุณเป็นอัตโนมัติกับ LineBot.pro วันนี้