<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Line Front-End Framework on Wayne's blog | 偉恩的部落格 | 技術博客</title><link>https://blog.wayne-project.com/tags/line-front-end-framework/</link><description>Recent content in Line Front-End Framework on Wayne's blog | 偉恩的部落格 | 技術博客</description><generator>Hugo -- gohugo.io</generator><language>zh-tw</language><lastBuildDate>Wed, 01 Feb 2023 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.wayne-project.com/tags/line-front-end-framework/index.xml" rel="self" type="application/rss+xml"/><item><title>【LIFF】認識 LINE Front-end Framework (LIFF) 前端框架 (LIFF v2)</title><link>https://blog.wayne-project.com/2023-02-01/line-front-end-framework-v2/</link><pubDate>Wed, 01 Feb 2023 00:00:00 +0000</pubDate><guid>https://blog.wayne-project.com/2023-02-01/line-front-end-framework-v2/</guid><description>&lt;img src="https://live.staticflickr.com/65535/52662373535_00afc03eca_o.jpg" alt="Featured image of post 【LIFF】認識 LINE Front-end Framework (LIFF) 前端框架 (LIFF v2)" /&gt;&lt;style&gt;
.article-content p code {
background-color: #f5f5f5;
color: #ff3860;
}
.focus {
background: #f1e2e2;
color: #d62c2c;
padding: 0 5px;
}
&lt;/style&gt;
&lt;p&gt;&lt;a class="link" href="https://taichunmin.idv.tw/blog/2020-09-18-line-three-size-liff.html" target="_blank" rel="noopener"
&gt;參考網站&lt;/a&gt;&lt;br&gt;
&lt;a class="link" href="https://oakmega.com/blog/basic-knowledge-in-line-business" target="_blank" rel="noopener"
&gt;參考網站&lt;/a&gt;&lt;br&gt;
&lt;a class="link" href="https://www.ezpretty.com.tw/blog/inner?id=43" target="_blank" rel="noopener"
&gt;參考網站&lt;/a&gt;&lt;br&gt;
&lt;a class="link" href="https://tw.linebiz.com/manual/line-official-account/line-porvider-and-channel-intro/" target="_blank" rel="noopener"
&gt;參考網站&lt;/a&gt;&lt;br&gt;
&lt;a class="link" href="https://blog.miniasp.com/post/2023/01/29/The-LINE-Front-end-Framework-LIFF-v2" target="_blank" rel="noopener"
&gt;參考網站&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;我最早接觸 &lt;a class="link" href="https://developers.line.biz/en/docs/liff/" target="_blank" rel="noopener"
&gt;LIFF&lt;/a&gt; 的時候已經是 2019 的時候了，當時的 LIFF v1 與現在的 LIFF v2 已經有了蠻大的差異，我想透過這篇文章梳理一下 LIFF v2 新版本的特性，好讓我們可以更方便的在網站上透過 LIFF 提供 LINE 用戶一些好用功能。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="正確理解-liff-的用途"&gt;正確理解 LIFF 的用途&lt;/h2&gt;
&lt;p&gt;雖然說 &lt;a class="link" href="https://developers.line.biz/en/docs/liff/" target="_blank" rel="noopener"
&gt;LINE Front-end Framework&lt;/a&gt; (&lt;code&gt;LIFF&lt;/code&gt;) 從名字上看起來是一套由 LINE 推出的前端框架，但事實上他的用途比較像是一個&lt;strong&gt;函式庫&lt;/strong&gt;(Library)，讓你可以在 LINE 平台(LINE Platform) 順利的開發網頁應用程式(Web Application)，幫助開發人員可以輕鬆的透過 &lt;code&gt;LIFF&lt;/code&gt; 提供的 API 跟 LINE 用戶進行互動。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;任何從 LINE 平台開啟的網頁，而網頁使用到 &lt;strong&gt;LIFF&lt;/strong&gt; 提供的 JavaScript SDK，都可以稱為是一個 &lt;strong&gt;LIFF Apps&lt;/strong&gt;！&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;所以在 LINE 平台上開發網頁，是一個什麼樣的情境與感受呢？什麼又是 LINE 平台呢？事實上，LINE 這家公司不但有龐大的用戶基礎，它們提供的各項服務也是琳瑯滿目，所有服務的加總，就是 LINE 平台，大家都可以在這個平台上開發 Web 應用程式。以下我用一個最淺顯易懂的使用情境來說明：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;假設某甲經營著一個團購生意，客戶都是透過 &lt;strong&gt;LINE 官方帳戶&lt;/strong&gt;(Official Account) (簡稱 &lt;strong&gt;LINE OA&lt;/strong&gt; 帳戶) 進行聯繫，當某甲想提供他的客戶一個團購的表單時，最簡單的方式就是直接傳送一個連結給他的客戶，而這個連結就是一個「&lt;strong&gt;網頁&lt;/strong&gt;」並擁有一個「&lt;strong&gt;網址&lt;/strong&gt;」對吧！如果你是 Web 開發人員，就可以在這份「&lt;strong&gt;網頁&lt;/strong&gt;」中加入 &lt;strong&gt;LIFF SDK&lt;/strong&gt;，並使用 &lt;strong&gt;LIFF SDK&lt;/strong&gt; 提供的 API 來取得客戶基本資料，或是設計一些便利的 Web UI 介面幫助客戶在 LINE 聊天室中下單。這就是一個 &lt;strong&gt;LIFF App&lt;/strong&gt; 的經典使用情境！👍&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;要認識 LIFF 最快的方式，就是直接開啟 &lt;a class="link" href="https://liff-playground.netlify.app/" target="_blank" rel="noopener"
&gt;LIFF Playground&lt;/a&gt; 網頁，快速預覽所有 LIFF SDK 提供的各項功能，讓你很清楚的知道 LIFF 可以做哪些事！以下我列出幾個 &lt;a class="link" href="https://liff-playground.netlify.app/" target="_blank" rel="noopener"
&gt;LIFF Playground&lt;/a&gt; 的亮點：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;幫助 LINE 用戶登入/登出：&lt;br&gt;
事實上，這些使用到 LIFF SDK 的 LIFF Apps 並不一定要跑在 LINE App 之中，也就是說，他不一定要直接從 LINE App 開啟這份網頁。這個 LIFF Apps 其實也可以是一個獨立網頁，在任何一台電腦或手機開啟網頁也行。只是在 LINE App 之中開啟網頁可以省去「登入」的程序，使用者的操作門檻會更低一些！&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;取得 LINE 用戶的裝置資訊：&lt;br&gt;
你可以透過 LIFF SDK 提供的 API 取得使用者的作業系統(OS)、使用的語言(Language)、目前 LIFF SDK 使用的版本、目前 LINE App 的版本、判斷網頁是否開在 &lt;a class="link" href="https://developers.line.biz/en/docs/liff/overview/#liff-browser" target="_blank" rel="noopener"
&gt;LIFF Browser&lt;/a&gt; 之中、判斷用戶目前是否是登入狀態、判斷用戶目前環境可以使用哪些 LIFF API。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;取得 LINE 用戶基本資料：&lt;br&gt;
取得用戶的 Access Token、取得用戶的 ID Token、取得 ID Token 解開後的內容、取得 Context 資訊、取得基本資料(只有使用者唯一值、顯示名稱與大頭照)、取得與 &lt;code&gt;LINE OA&lt;/code&gt; 之間的好友狀態。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;強化 UI 互動的小功能：&lt;br&gt;
你可以在 LIFF 永久連結上加入額外參數、可以幫 LINE 用戶直接送出訊息到 OA 帳戶的聊天室中、從 LIFF Browser 開啟連結到新視窗、從 LIFF Browser 關閉視窗、分享資訊給好友、取得 QRCode 掃描結果。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;當你已經瞭解 LIFF 用途之後，開發人員就可以直接看 &lt;a class="link" href="https://developers.line.biz/en/reference/liff/" target="_blank" rel="noopener"
&gt;LIFF v2 API reference&lt;/a&gt; 參考文件，這裡有更多 LIFF SDK 與 API 的技術細節。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="正確理解-liff-browser-的用途"&gt;正確理解 LIFF Browser 的用途&lt;/h2&gt;
&lt;p&gt;在 LINE 平台中可以使用以下 4 種瀏覽器類型，很多人搞不清楚其中的差別，我特別重點說明一下：&lt;/p&gt;
&lt;h3 id="line-in-app-browser"&gt;LINE In-App Browser&lt;/h3&gt;
&lt;p&gt;&lt;a class="link" href="https://developers.line.biz/en/glossary/#line-iab" target="_blank" rel="noopener"
&gt;LINE In-App Browser&lt;/a&gt;：&lt;/p&gt;
&lt;p&gt;在 LINE App 任意位置開啟的連結，預設都會開啟一個&lt;strong&gt;內嵌&lt;/strong&gt;在 LINE App 中的瀏覽器，這種瀏覽器幾乎與一般瀏覽器無異，但其實在使用上有諸多限制，建議開發人員&lt;strong&gt;不要&lt;/strong&gt;把他當成「正常」的瀏覽器來使用，當成「&lt;strong&gt;閱讀網頁內容&lt;/strong&gt;」的工具會比較好一些，不要做太多需要登入才能用的功能在上面。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;LINE In-App Browser 雖然支援 &lt;strong&gt;Cookies&lt;/strong&gt; 與 &lt;strong&gt;localStorage&lt;/strong&gt; 操作，但沒人保證可以儲存多久，可能 App 升級一下資料就清除了，對使用者來說其實很不好用。&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id="line-liff-browser"&gt;LINE LIFF Browser&lt;/h3&gt;
&lt;p&gt;&lt;a class="link" href="https://developers.line.biz/en/glossary/#liff-browser" target="_blank" rel="noopener"
&gt;LINE LIFF Browser&lt;/a&gt;：&lt;/p&gt;
&lt;p&gt;這是一個相當特殊的瀏覽器類型，他只有透過 &lt;code&gt;LIFF App&lt;/code&gt; 的&lt;strong&gt;專用網址&lt;/strong&gt;才能開啟，網址結構如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;https://liff.line.me/&lt;span class="o"&gt;{&lt;/span&gt;LIFF_ID&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這個 &lt;code&gt;LIFF App&lt;/code&gt; 專用網址必須跟 &lt;a class="link" href="https://developers.line.biz/zh-hant/" target="_blank" rel="noopener"
&gt;LINE Developers&lt;/a&gt; 之中的 &lt;code&gt;LINE Login&lt;/code&gt; 或 &lt;code&gt;LINE MINI App&lt;/code&gt; 頻道(Channel)綁定，事先在「&lt;strong&gt;頻道&lt;/strong&gt;」中建立一組 &lt;code&gt;LIFF_ID&lt;/code&gt; 才能使用。在 LIFF SDK 中，有部分 API 只有在 &lt;strong&gt;LINE LIFF Browser&lt;/strong&gt; 之中才能使用！&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;使用 &lt;code&gt;LIFF App&lt;/code&gt; 專用網址開啟的網頁，不一定要使用 LIFF SDK 來實作，只是用了 LIFF SDK 就可以享受許多 LINE LIFF Browser 才有的功能，可以降低開發門檻。其他開啟 LIFF App 的說明文件可以參考 &lt;a class="link" href="https://developers.line.biz/en/docs/liff/opening-liff-app/" target="_blank" rel="noopener"
&gt;Opening a LIFF app&lt;/a&gt; 說明！&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;這個 LIFF Browser 也支援「&lt;strong&gt;最小化&lt;/strong&gt;」功能，把剛開啟的 LIFF App 最小化成一個 Icon，隨時可以點擊 Icon 恢復瀏覽器顯示，還蠻方便的。詳情請見 &lt;a class="link" href="https://developers.line.biz/en/docs/liff/minimizing-liff-browser/" target="_blank" rel="noopener"
&gt;Minimizing LIFF browser&lt;/a&gt; 說明！👍&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id="line-mini-app"&gt;LINE MINI App&lt;/h3&gt;
&lt;p&gt;&lt;a class="link" href="https://developers.line.biz/en/services/line-mini-app/" target="_blank" rel="noopener"
&gt;LINE MINI App&lt;/a&gt;：&lt;/p&gt;
&lt;p&gt;這也是一個相當特殊的瀏覽器類型，其用途跟 &lt;code&gt;LINE LIFF Browser&lt;/code&gt; 相當類似，都需要&lt;strong&gt;專用網址&lt;/strong&gt;才能打開，但是跟 &lt;code&gt;LINE LIFF Browser&lt;/code&gt; 不同的地方在於，&lt;code&gt;LINE MINI App&lt;/code&gt; 可以打包上架為一個 &lt;strong&gt;LINE 服務&lt;/strong&gt;，可以讓使用者在 LINE App 的「&lt;strong&gt;主頁&lt;/strong&gt;」搜尋到這個 &lt;code&gt;LINE MINI App&lt;/code&gt;，使用上會方便許多，通常只有知名品牌才會選用這種方式上架。目前 &lt;code&gt;LINE MINI App&lt;/code&gt; 只有指定的 &lt;strong&gt;LINE 技術合作夥伴&lt;/strong&gt;或&lt;strong&gt;特定主題或品牌&lt;/strong&gt;才能通過審核，在台灣尚未公開給大眾申請。&lt;/p&gt;
&lt;h3 id="external-browser"&gt;External Browser&lt;/h3&gt;
&lt;p&gt;&lt;a class="link" href="https://developers.line.biz/en/glossary/#external-browser" target="_blank" rel="noopener"
&gt;External Browser&lt;/a&gt;：&lt;/p&gt;
&lt;p&gt;你可以在 LINE App 之中已經開啟的瀏覽器，額外再開啟一個「&lt;strong&gt;外部瀏覽器&lt;/strong&gt;」(External Browser)，使用手機的&lt;strong&gt;預設瀏覽器&lt;/strong&gt;來開啟網頁，這種網頁在瀏覽的時候就可以用到完整的瀏覽器能力，雖然可以解決 LINE App 之中的其他瀏覽器類型所提到的一些限制，但卻會失去一些在 LINE 裡面開啟網頁的方便性，例如：&lt;strong&gt;自動登入&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;除此之外，你直接用桌機的任意瀏覽器開啟一個有使用 LIFF SDK 的網頁，對 LIFF SDK 來說，這個瀏覽器本身就是一個「&lt;strong&gt;外部瀏覽器&lt;/strong&gt;」(External Browser)，你可以透過 LIFF SDK 非常輕鬆的實現 LINE Login 機制，只要呼叫 &lt;code&gt;liff.login()&lt;/code&gt; 即可！👍&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="開始使用-liff-sdk-開發網頁"&gt;開始使用 LIFF SDK 開發網頁&lt;/h2&gt;
&lt;p&gt;在任何一個網頁上，只要加入 LIFF SDK 檔案，這是一個 JavaScript 檔，就可以立即開始使用，以下是在任意網頁加入 LIFF 的標準作業流程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;設定網頁標題 (Page Title)&lt;br&gt;
請在 HTML 的 &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; 區段中加入 &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; 標籤，理論上每一份 HTML 應該都有這個標籤定義才對！&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;The Will Will Web&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start="2"&gt;
&lt;li&gt;加入 LIFF SDK&lt;br&gt;
請將 LIFF SDK 加入到網頁 &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt; 最開頭的地方：&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;charset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://static.line-scdn.net/liff/edge/2/sdk.js&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果你的網站使用到任何其他前端框架，可能會想把 LIFF SDK 改用 &lt;code&gt;npm&lt;/code&gt; 的方式安裝載入：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install --save @line/liff
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# or&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# yarn add @line/liff&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;匯入 &lt;code&gt;liff&lt;/code&gt; 物件的方法：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;liff&lt;/span&gt; &lt;span class="nx"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;@line/liff&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start="3"&gt;
&lt;li&gt;初始化 LIFF SDK&lt;br&gt;
初始化 LIFF SDK 是一個&lt;strong&gt;非常必要&lt;/strong&gt;的操作，因為當你的網頁開在 &lt;strong&gt;LINE In-App Browser&lt;/strong&gt; 或 &lt;strong&gt;LINE LIFF Browser&lt;/strong&gt; 瀏覽器時，在 LIFF SDK 初始化過後才能呼叫某些 API 取得當前的環境資訊。這裡最重要的參數就是 &lt;code&gt;liffId&lt;/code&gt; 了，你要先到 &lt;a class="link" href="https://developers.line.biz/console/" target="_blank" rel="noopener"
&gt;LINE Developers&lt;/a&gt; 的 &lt;strong&gt;LINE Login&lt;/strong&gt; 或 &lt;strong&gt;LINE MINI App&lt;/strong&gt; 頻道的 LIFF 頁籤內先建立一組 &lt;code&gt;LIFF_ID&lt;/code&gt;，並將這個 &lt;code&gt;LIFF_ID&lt;/code&gt; 設定到 &lt;code&gt;liff.init()&lt;/code&gt; 的 &lt;code&gt;liffId&lt;/code&gt; 參數上。&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;liff&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;init&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;liffId&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;1566379427-xKvNdlJ9&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Start to use liff&amp;#39;s api
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;以下是取得環境資訊的程式碼範例，記得一定要&lt;strong&gt;初始化之後&lt;/strong&gt;才能執行這些 API 喔！&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;liff&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;init&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;liffId&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;1566379427-xKvNdlJ9&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;liff&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getLanguage&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// 取得用戶的主要語言
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;liff&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getVersion&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// 取得 LIFF SDK 的版本
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;liff&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isInClient&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// 判斷目前網頁是否跑在 LIFF Browser 底下
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;liff&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isLoggedIn&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// 判斷開啟此網頁的 LINE 使用者是否為登入狀態
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;liff&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getOS&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// 取得使用者目前使用的作業系統為何
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;liff&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getLineVersion&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// 取得使用者目前使用的 LINE App 版本
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;注意: 你只要是用 &lt;code&gt;LINE LIFF Browser&lt;/code&gt; 瀏覽器開啟 LIFF App 網頁，透過 &lt;code&gt;liff.init()&lt;/code&gt; 初始化之後，預設就會自動登入！👍&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;如果你希望在初始化 LIFF SDK 的時候，即便在「外部瀏覽器」的環境下也要啟用「&lt;strong&gt;自動登入&lt;/strong&gt;」功能，可以加入 &lt;code&gt;withLoginOnExternalBrowser: true&lt;/code&gt; 參數，他會在頁面初始化的時候自動進行 LINE Login 的 OAuth 2.0 授權流程！&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;liff&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;init&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;liffId&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;1566379427-xKvNdlJ9&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Use own liffId
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt; &lt;span class="nx"&gt;withLoginOnExternalBrowser&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Enable automatic login process
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Start to use liff&amp;#39;s api
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;這個 &lt;code&gt;withLoginOnExternalBrowser: true&lt;/code&gt; 選項建議只用在 LINE App 內才會開啟的網頁上使用。否則你能想像你開啟我的部落格後，第一時間轉向到 LINE Login 畫面是什麼感覺嗎？😅&lt;/p&gt;&lt;/blockquote&gt;
&lt;ol start="4"&gt;
&lt;li&gt;有些取得環境資訊的 API 在透過 &lt;code&gt;liff.init()&lt;/code&gt; 初始化之前也可以使用：&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;liff.ready&lt;/strong&gt;： 會回傳一個 Promise 並會在 &lt;code&gt;liff.init()&lt;/code&gt; 初始化完畢後執行，你可以在 &lt;code&gt;.then()&lt;/code&gt; callback 撰寫一些程式碼。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;liff.getOS()&lt;/strong&gt;： 取得用戶端的作業系統，可能的值只有 &lt;code&gt;ios&lt;/code&gt;、&lt;code&gt;android&lt;/code&gt; 與 &lt;code&gt;web&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;liff.getLanguage()&lt;/strong&gt;： 這等同於透過 &lt;code&gt;navigator.language&lt;/code&gt; 取得目前瀏覽器使用的語言。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;liff.getVersion()&lt;/strong&gt;： 取得目前 LIFF SDK 使用的版本。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;liff.getLineVersion()&lt;/strong&gt;： 取得使用者目前 LINE App 的版本。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;liff.isInClient()&lt;/strong&gt;： 判斷目前網頁是否跑在 LIFF Browser 底下，你可以藉此判斷是否要初始化 LIFF SDK 或透過 &lt;code&gt;liff.closeWindow()&lt;/code&gt; 關閉視窗！&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;liff.closeWindow()&lt;/strong&gt;： 你可以任意時間透過這個 API 關閉視窗，甚至於在 &lt;code&gt;liff.init()&lt;/code&gt; 初始化完成之前也可以關閉。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;liff.use()&lt;/strong&gt;： 啟用與初始化一個 &lt;a class="link" href="https://developers.line.biz/en/docs/liff/liff-plugin/" target="_blank" rel="noopener"
&gt;LIFF Plugin&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;liff.i18n.setLang()&lt;/strong&gt;： 設定 LIFF SDK 的顯示語言，任何 &lt;a class="link" href="https://datatracker.ietf.org/doc/html/rfc5646" target="_blank" rel="noopener"
&gt;RFC 5646 (BCP 47)&lt;/a&gt; 定義的語言都可以，&lt;strong&gt;繁體中文&lt;/strong&gt;可以是 &lt;code&gt;zh-Hant&lt;/code&gt; 或 &lt;code&gt;zh-Hant-TW&lt;/code&gt; 都可以。&lt;/p&gt;
&lt;p&gt;以上就是使用 LIFF SDK 開發網頁的起手式，理解了觀念與啟動方法，其他都不複雜了，剩下的 API 就是有用到的時候才去看 &lt;a class="link" href="https://developers.line.biz/en/reference/liff/" target="_blank" rel="noopener"
&gt;LIFF v2 API reference&lt;/a&gt; 說明文件。當然，別忘記 &lt;a class="link" href="https://liff-playground.netlify.app/" target="_blank" rel="noopener"
&gt;LIFF Playground&lt;/a&gt; 的存在，他可以很快速的幫助你快速瀏覽所有的 LIFF APIs！👍&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="總結"&gt;總結&lt;/h2&gt;
&lt;p&gt;我覺得 LIFF 並不難，難的地方在於初學者很容易搞不清楚 &lt;a class="link" href="https://developers.line.biz/en/docs/liff/overview/" target="_blank" rel="noopener"
&gt;&lt;strong&gt;LIFF 的用途&lt;/strong&gt;&lt;/a&gt;、&lt;a class="link" href="https://developers.line.biz/en/docs/liff/overview/#liff-browser" target="_blank" rel="noopener"
&gt;&lt;strong&gt;LIFF Browser 的存在&lt;/strong&gt;&lt;/a&gt; 與 &lt;a class="link" href="https://developers.line.biz/en/docs/liff/opening-liff-app/" target="_blank" rel="noopener"
&gt;&lt;strong&gt;LIFF App 的開啟方式&lt;/strong&gt;&lt;/a&gt;，搞懂這些地方，後續在開發上就不會有甚麼困難與障礙了！🚀&lt;/p&gt;
&lt;hr&gt;</description></item></channel></rss>