บทเรียน

คู่มือพัฒนา LIFF App: สร้างแอป LINE Front-end Framework

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

LineBot.pro Team16 นาทีอ่าน
คู่มือพัฒนา LIFF App: สร้างแอป LINE Front-end Framework

#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

  1. ไปที่ LINE Developers Console
  2. เลือก provider และ channel ของคุณ
  3. ไปที่แท็บ LIFF
  4. คลิก "Add LIFF app"
  5. กำหนดค่า:
    • LIFF app name: ชื่อแอปของคุณ
    • Size: Full, Tall หรือ Compact
    • Endpoint URL: URL แอปของคุณ (ต้องเป็น HTTPS)
    • Scopes: profile, openid, chat_message.write

#ขั้นตอนที่ 2: ตั้งค่าโปรเจกต์ React/Next.js

bash
npx create-next-app@latest my-liff-app --typescript
cd my-liff-app
npm install @line/liff

#ขั้นตอนที่ 3: Initialize LIFF SDK

สร้างไฟล์ LIFF utility:

typescript
// 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

tsx
// 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

typescript
// ส่งข้อความไปยังแชทปัจจุบัน
async function sendMessage(text: string) {
  if (!liff.isInClient()) {
    alert('ฟีเจอร์นี้ใช้งานได้เฉพาะภายใน LINE');
    return;
  }

  await liff.sendMessages([
    {
      type: 'text',
      text: text
    }
  ]);
}

#Share Target Picker

ให้ผู้ใช้แชร์เนื้อหาไปยังเพื่อนหรือกลุ่ม:

typescript
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 ได้ จัดการอย่างเหมาะสม:

typescript
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

css
/* 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 ที่แชร์ได้ที่เปิดหน้าเฉพาะ:

typescript
// รูปแบบ LIFF URL: https://liff.line.me/{liffId}/{path}
const productUrl = `https://liff.line.me/${LIFF_ID}/product/${productId}`;

#Deployment

#Deploy ไปยัง Vercel

bash
# ติดตั้ง Vercel CLI
npm install -g vercel

# Deploy
vercel --prod

#Environment Variables

ตั้งค่าใน Vercel dashboard หรือ .env.local:

env
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

แหล่งข้อมูลที่เกี่ยวข้อง:

บริการที่เกี่ยวข้อง

LineBot.pro

พร้อม Automate ธุรกิจ LINE ของคุณหรือยัง?

เริ่มทำให้การสื่อสาร LINE ของคุณเป็นอัตโนมัติกับ LineBot.pro วันนี้