PageSourceSearch

https://ethanhuang13.plus/taiwan-top-app-store-market/

html ethanhuang13.plus collected 2026-09-25 21:07:22 UTC 30,198 bytes, 623 lines download raw bytes

1<!DOCTYPE html>
2<html lang="zh-Hant" data-theme="light">
3<head>
4    <title>🇹🇼冷知識:台灣是 iOS App Store 第四大市場</title>
5    <meta charset="utf-8" />
6    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
7    <meta name="HandheldFriendly" content="True" />
8    <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
9    <meta name="color-scheme" content="light dark" />
10    <link rel="preconnect" href="https://fonts.googleapis.com">
11    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
12    <link href="https://fonts.googleapis.com/css2?family=Instrument+Sans:ital,wght@0,400..700;1,400..700&family=JetBrains+Mono:wght@500;700&family=Noto+Sans+TC:wght@400;500;700;900&display=swap" rel="stylesheet">
13    <link rel="preload" as="style" href="https://ethanhuang13.plus/assets/built/screen.css?v=fRHHoHqaLmSPvNgA" />
14    <link rel="preload" as="script" href="https://ethanhuang13.plus/assets/built/codex.js?v=4MTsvgvmq4bGV7be" />
15    <link rel="preload" as="script" href="https://ethanhuang13.plus/assets/built/telemetry.js?v=wBaWtf3t3Fo9xR7j" />
16    <link rel="stylesheet" type="text/css" href="https://ethanhuang13.plus/assets/built/screen.css?v=fRHHoHqaLmSPvNgA" />
17    <link rel="stylesheet" href="https://ethanhuang13.plus/assets/built/prism-xcode.css?v=-CCR3xH7YhcSHKzg">
18    
18<script>
19        if (matchMedia('(prefers-color-scheme:dark)').matches)
20            document.documentElement.dataset.theme = 'dark';
21    </script>
21
22    <meta name="description" content="前陣子為了準備 iOS AI Summer Camp(為期三天、在台灣大學舉辦的免費學生開發者夏令營),去查了一下 App Store 的市場排名,才發現,台灣的軟體市場的規模名列前茅,而且我發現很多人並不知道這個事實。">
23    <link rel="icon" href="https://storage.ghost.io/c/b5/ef/b5ef3a60-300e-4c93-99a1-ce3ec3f3c437/content/images/size/w256h256/2026/07/Profile-2026-1.jpeg" type="image/jpeg">
24    <link rel="canonical" href="https://ethanhuang13.plus/taiwan-top-app-store-market/">
25    <link rel="alternate" type="text/markdown" href="https://ethanhuang13.plus/taiwan-top-app-store-market.md">
26    <meta name="referrer" content="no-referrer-when-downgrade">
27    
28    <meta property="og:site_name" content="13å ± ">
29    <meta property="og:type" content="article">
30    <meta property="og:title" content="🇹🇼冷知識:台灣是 iOS App Store 第四大市場">
31    <meta property="og:description" content="前陣子為了準備 iOS AI Summer Camp(為期三天、在台灣大學舉辦的免費學生開發者夏令營),去查了一下 App Store 的市場排名,才發現,台灣的軟體市場的規模名列前茅,而且我發現很多人並不知道這個事實。">
32    <meta property="og:url" content="https://ethanhuang13.plus/taiwan-top-app-store-market/">
33    <meta property="article:published_time" content="2026-07-22T22:00:15.000Z">
34    <meta property="article:modified_time" content="2026-07-22T22:00:14.000Z">
35    <meta property="article:tag" content="💫 產品經營">
36    
37    <meta name="twitter:card" content="summary">
38    <meta name="twitter:title" content="🇹🇼冷知識:台灣是 iOS App Store 第四大市場">
39    <meta name="twitter:description" content="前陣子為了準備 iOS AI Summer Camp(為期三天、在台灣大學舉辦的免費學生開發者夏令營),去查了一下 App Store 的市場排名,才發現,台灣的軟體市場的規模名列前茅,而且我發現很多人並不知道這個事實。">
40    <meta name="twitter:url" content="https://ethanhuang13.plus/taiwan-top-app-store-market/">
41    <meta name="twitter:label1" content="Written by">
42    <meta name="twitter:data1" content="13">
43    <meta name="twitter:label2" content="Filed under">
44    <meta name="twitter:data2" content="💫 產品經營">
45    <meta name="twitter:site" content="@ethanhuang13">
46    <meta name="twitter:creator" content="@ethanhuang13">
47    
48    
48<script type="application/ld+json">
49{
50    "@context": "https://schema.org",
51    "@type": "Article",
52    "publisher": {
53        "@type": "Organization",
54        "name": "13å ± ",
55        "url": "https://ethanhuang13.plus/",
56        "logo": {
57            "@type": "ImageObject",
58            "url": "https://storage.ghost.io/c/b5/ef/b5ef3a60-300e-4c93-99a1-ce3ec3f3c437/content/images/size/w256h256/2026/07/Profile-2026-1.jpeg",
59            "width": 60,
60            "height": 60
61        }
62    },
63    "author": {
64        "@type": "Person",
65        "name": "13",
66        "image": {
67            "@type": "ImageObject",
68            "url": "https://storage.ghost.io/c/b5/ef/b5ef3a60-300e-4c93-99a1-ce3ec3f3c437/content/images/size/w1200/2026/07/Profile-2026.jpeg",
69            "width": 1200,
70            "height": 1200
71        },
72        "url": "https://ethanhuang13.plus/author/13/",
73        "sameAs": [
74            "https://ethanhuang13.com",
75            "https://x.com/ethanhuang13"
76        ]
77    },
78    "headline": "🇹🇼冷知識:台灣是 iOS App Store 第四大市場",
79    "url": "https://ethanhuang13.plus/taiwan-top-app-store-market/",
80    "datePublished": "2026-07-22T22:00:15.000Z",
81    "dateModified": "2026-07-22T22:00:14.000Z",
82    "keywords": "💫 產品經營",
83    "description": "前陣子為了準備 iOS AI Summer Camp(為期三天、在台灣大學舉辦的免費學生開發者夏令營),去查了一下 App Store 的市場排名,才發現,台灣的軟體市場的規模名列前茅,而且我發現很多人並不知道這個事實。",
84    "mainEntityOfPage": "https://ethanhuang13.plus/taiwan-top-app-store-market/"
85}
86    </script>
86
87
88    <meta name="generator" content="Ghost 6.65">
89    <link rel="alternate" type="application/rss+xml" title="13å ± " href="https://ethanhuang13.plus/rss/">
90    
90<script defer src="https://cdn.jsdelivr.net/ghost/portal@~2.71/umd/portal.min.js" data-i18n="true" data-ghost="https://ethanhuang13.plus/" data-key="c34269a432c8f4c71005502c83" data-api="https://ethanhuang13.ghost.io/ghost/api/content/" data-locale="zh-Hant" crossorigin="anonymous"></script>
90<style id="gh-members-styles">.gh-post-upgrade-cta-content,
91.gh-post-upgrade-cta {
92    display: flex;
93    flex-direction: column;
94    align-items: center;
95    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
96    text-align: center;
97    width: 100%;
98    color: #ffffff;
99    font-size: 16px;
100}
101
102.gh-post-upgrade-cta-content {
103    border-radius: 8px;
104    padding: 40px 4vw;
105}
106
107.gh-post-upgrade-cta h2 {
108    color: #ffffff;
109    font-size: 28px;
110    letter-spacing: -0.2px;
111    margin: 0;
112    padding: 0;
113}
114
115.gh-post-upgrade-cta p {
116    margin: 20px 0 0;
117    padding: 0;
118}
119
120.gh-post-upgrade-cta small {
121    font-size: 16px;
122    letter-spacing: -0.2px;
123}
124
125.gh-post-upgrade-cta a {
126    color: #ffffff;
127    cursor: pointer;
128    font-weight: 500;
129    box-shadow: none;
130    text-decoration: underline;
131}
132
133.gh-post-upgrade-cta a:hover {
134    color: #ffffff;
135    opacity: 0.8;
136    box-shadow: none;
137    text-decoration: underline;
138}
139
140.gh-post-upgrade-cta a.gh-btn {
141    display: block;
142    background: #ffffff;
143    text-decoration: none;
144    margin: 28px 0 0;
145    padding: 8px 18px;
146    border-radius: 4px;
147    font-size: 16px;
148    font-weight: 600;
149}
150
151.gh-post-upgrade-cta a.gh-btn:hover {
152    opacity: 0.92;
153}</style>
154    
154<script defer src="https://cdn.jsdelivr.net/ghost/sodo-search@~1.8/umd/sodo-search.min.js" data-key="c34269a432c8f4c71005502c83" data-styles="https://cdn.jsdelivr.net/ghost/sodo-search@~1.8/umd/main.css" data-sodo-search="https://ethanhuang13.ghost.io/" data-locale="zh-Hant" crossorigin="anonymous"></script>
154
155    
156    <link href="https://ethanhuang13.plus/webmentions/receive/" rel="webmention">
157    
157<script defer src="/public/member-attribution.min.js?v=AKG4hWena9j3yX3I"></script>
157
158    
158<script defer src="/public/ghost-stats.min.js?v=vFcCUf6ZQ0Hyhc8h" data-stringify-payload="false" data-datasource="analytics_events" data-storage="localStorage" data-host="https://ethanhuang13.plus/.ghost/analytics/api/v1/page_hit"  tb_site_uuid="b5ef3a60-300e-4c93-99a1-ce3ec3f3c437" tb_post_uuid="badda029-3d4a-4218-8a27-4a7f5d044101" tb_post_type="post" tb_member_uuid="undefined" tb_member_status="undefined" tb_gift_link=""></script>
158<style>:root {--ghost-accent-color: #0F4C81;}</style>
159    <!-- 
159<script src="https://cdn.jsdelivr.net/npm/prismjs/prism.min.js" defer></script>
vendor: 1 bytes, line 159
159
160<script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/autoloader/prism-autoloader.min.js" defer></script>
160-->
161<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism.min.css">
162
163<style>
164  /* Prism.js Toolbar Positioning */
165  .code-toolbar {
166    position: relative;
167  }
168  .toolbar {
169    position: absolute;
170    top: 14px;
171    right: 0;
172    font-size: 14px;
173    color: green;
174  }
175  .toolbar-item {
176    display: inline-block;
177    margin-right: 5px;
178  }
179  .copy-to-clipboard-button, .toolbar-item > button {
180    color: green;
181  }
182</style>
183
184<!-- Prism Core -->
185<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.28.0/components/prism-core.min.js" integrity="sha512-9khQRAUBYEJDCDVP2yw3LRUQvjJ0Pjx0EShmaQjcHa6AXiOv6qHQu9lCAIR8O+/D8FtaCoJ2c0Tf9Xo7hYH01Q==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
185
186
187<!-- Autoloader Plugin -->
188<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.28.0/plugins/autoloader/prism-autoloader.min.js" integrity="sha512-fTl/qcO1VgvKtOMApX2PdZzkziyr2stM65GYPLGuYMnuMm1z2JLJG6XVU7C/mR+E7xBUqCivykuhlzfqxXBXbg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
188
189
190<!-- Toolbar Plugin -->
191<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.28.0/plugins/toolbar/prism-toolbar.min.js"></script>
191
192
193<!-- Copy-to-Clipboard Plugin -->
194<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.28.0/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js"></script>
194
195
196
197<!-- Google tag (gtag.js) -->
vendor: 64 bytes, lines 197-198
197
198<script async src="https://www.googletagmanager.com/gtag/js?id=
198G-ECLEY320MR
vendor: 12 bytes, line 198
198"></script>
199<script>
200  
vendor: 134 bytes, lines 200-204
200window.dataLayer = window.dataLayer || [];
201  function gtag(){dataLayer.push(arguments);}
202  gtag('js', new Date());
203
204  gtag('config', '
204G-ECLEY320MR
vendor: 4 bytes, line 204
204');
205</script>
205
206</head>
207<body class="site-body post-template tag-product-building is-visitor" data-member-state="visitor">
208    <a class="skip-link" href="#site-main">跳到內容</a>
209    <div class="site-shell">
210        <header class="site-header">
211    <div class="site-header__inner">
212        <a class="site-brand" href="https://ethanhuang13.plus">
213            <span class="site-brand__mark">13å ±</span>
214        </a>
215
216        <nav class="site-nav site-nav--desktop" aria-label="主要導覽">
217            <a href="https://ethanhuang13.plus/tag/news/">開發者週報</a>
218            <a href="https://ethanhuang13.plus/index/">所有文章</a>
219            <a href="https://ethanhuang13.plus/tag/lightning-talk/">短篇抒發</a>
220            <a href="https://ethanhuang13.plus/#topics">主題分類</a>
221            <a class="utility-link desktop-only" href="https://ethanhuang13.plus/about/">關於</a>
222            <button type="button" data-ghost-search data-nav-close>搜尋</button>
223        </nav>
224
225        <div class="site-header__actions">
226                <a class="button-link button-link--strong desktop-only" href="https://patreon.com/ethanhuang13/membership" target="_blank" rel="noreferrer">查看方案</a>
227            <button type="button" class="utility-link site-menu-trigger mobile-only" data-nav-toggle aria-expanded="false" aria-controls="site-drawer">
228                <span>選單</span>
229            </button>
230        </div>
231    </div>
232</header>
233
234<nav id="site-drawer" class="site-drawer" aria-label="行動導覽" aria-hidden="true" inert data-nav-panel>
235    <div class="site-drawer__inner">
236        <div class="site-drawer__top">
237            <p>13å ±</p>
238            <button type="button" class="utility-link" data-nav-close aria-label="關閉導覽">
239                <span>關閉</span>
240            </button>
241        </div>
242        <div class="site-drawer__links">
243            <a href="https://ethanhuang13.plus/tag/news/">開發者週報</a>
244            <a href="https://ethanhuang13.plus/index/">所有文章</a>
245            <a href="https://ethanhuang13.plus/tag/lightning-talk/">短篇抒發</a>
246            <a href="https://ethanhuang13.plus/#topics">主題分類</a>
247            <a href="https://ethanhuang13.plus/about/">關於</a>
248            <button type="button" data-ghost-search data-nav-close>搜尋</button>
249        </div>
250        <div class="site-drawer__actions">
251                <a class="button-link button-link--strong" href="https://patreon.com/ethanhuang13/membership" target="_blank" rel="noreferrer">查看方案</a>
252                <a class="button-link" href="#/portal/signin" data-portal="signin">登入</a>
253        </div>
254    </div>
255</nav>
256        <main id="site-main" class="site-main" tabindex="-1">
257            
258<article class="article-shell post tag-product-building no-image">
259    <header class="article-header">
260        <div class="article-header__inner">
261            <div class="article-header__eyebrow">
262                        <span>專欄 / 研究筆記</span>
263                        <a href="https://ethanhuang13.plus/tag/product-building/">💫 產品經營</a>
264            </div>
265            <h1 data-article-title>🇹🇼冷知識:台灣是 iOS App Store 第四大市場</h1>
266
267            <div class="article-header__lower">
268                    <p class="article-header__deck">
269                            前陣子為了準備 iOS AI Summer Camp(為期三天、在台灣大學舉辦的免費學生開發者夏令營),去查了一下 App Store 的市場排名,才發現,台灣的軟體市場的規模名列前茅,而且我發現很多人並不知道這個事實。
270                    </p>
271
272                <aside class="article-aside">
273                        <div class="article-aside__block article-aside__block--tags">
274                            <p class="article-aside__label">標籤</p>
275                            <div class="article-aside__tags">
276                            </div>
277                        </div>
278                    <div class="article-aside__block article-aside__block--status">
279                        <p class="article-aside__label">狀態</p>
280                        <p>    <span class="access-badge access-badge--public">公開</span>
281</p>
282                    </div>
283                    <div class="article-aside__block article-aside__block--date">
284                        <p class="article-aside__label">日期</p>
285                        <p>2026-07-23</p>
286                    </div>
287                    <div class="article-aside__block article-aside__block--author">
288                        <p class="article-aside__label">作者</p>
289                        <p><a href="/author/13/">13</a></p>
290                    </div>
291                </aside>
292            </div>
293        </div>
294    </header>
295
296    <div class="article-layout">
297        <div class="article-main">
298
299            <section class="gh-content">
300                <p>根據 Sensor Tower(data.ai)的<a href="https://sensortower.com/report/forecast-report/download?ref=ethanhuang13.plus">
300公開報告(Mobile App Market Forecast 2030)</a>,2023 å¹´ iOS App Store 的消費者支出排名,分別是:</p><ol><li>美國 $30.8B</li><li>中國 $15.7B</li><li>日本 $12.3B</li><li>台灣 $2.9B</li><li>英國 $2.6B</li></ol><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://storage.ghost.io/c/b5/ef/b5ef3a60-300e-4c93-99a1-ce3ec3f3c437/content/images/2026/07/[email protected]" class="kg-image" alt="" loading="lazy" width="2000" height="1098" srcset="https://storage.ghost.io/c/b5/ef/b5ef3a60-300e-4c93-99a1-ce3ec3f3c437/content/images/size/w600/2026/07/[email protected] 600w, https://storage.ghost.io/c/b5/ef/b5ef3a60-300e-4c93-99a1-ce3ec3f3c437/content/images/size/w1000/2026/07/[email protected] 1000w, https://storage.ghost.io/c/b5/ef/b5ef3a60-300e-4c93-99a1-ce3ec3f3c437/content/images/size/w1600/2026/07/[email protected] 1600w, https://storage.ghost.io/c/b5/ef/b5ef3a60-300e-4c93-99a1-ce3ec3f3c437/content/images/2026/07/[email protected] 2000w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">來自 Sensor Tower 的 </span><a href="https://sensortower.com/report/forecast-report/download?ref=ethanhuang13.plus"><span style="white-space: pre-wrap;">Mobile App Market Forecast 2030</span></a></figcaption></figure><p>雖然這份報告的時間在 vibe coding 時代之前(暫時找不到更新的公開數據)、也不是 Apple 官方的數據,但 Sensor Tower 算是很大的數據機構,可信度高。</p><p>該報告預測,到了 2030 年,台灣的市場規模會從 29 億美金成長到 <strong>49 億美金</strong>。預測認為,台灣市場年複合成長率(CAGR)會是 8.1%,但低於英國的 10.6%,所以排名會被後者超越。</p><p>需要注意的是,前三名的市場規模與四、五名有很大的差距。第三名的日本是台灣的 ~4 倍,更不用說中國的 ~5 倍、美國的 ~10 倍。</p><p>但不論如何,我想說的是,從 App Store 來看,在消費級軟體或遊戲方面,<strong>台灣人相對於全球來說,願意出錢、也出得起</strong>。</p><p>台灣很明確是 AI 硬體供應鏈的要角。相對的,軟體方面給人的印象總是還有很大的進步空間。</p><p>然而,從消費者支出的角度來看,人們願意花錢購買軟體,提升生活品質與工作效率。這其實是台灣發展軟體的好消息。</p><p>你覺得台灣人會樂於支持本土的開發者嗎?我認為台灣的開發者很有機會。這也是為什麼我把工作辭掉以後,一直在<a href="https://www.threads.com/@ethanhuang13/post/Da9nWTOlG25?ref=ethanhuang13.plus">做栽培下一代開發者的事情</a>。</p><p>如果你是來自台灣的開發者,會如何經營台灣的軟體市場呢?歡迎跟我分享你的看法。</p>
301            </section>
302
303                    </div>
304    </div>
305
306    <section class="article-more">
307                        <div class="directory-block">
308                            <div class="section-heading">
309                                <h2>延伸閱讀</h2>
310                            </div>
311                            <div class="essay-list">
312                                    <article class="post-item post tag-product-building tag-todayos">
313    <a class="post-item__link" href="/app-launch-preparation-part-3-site/">
314        <div class="post-item__meta">
315            <span>2026-07-22</span>
316                    <span>💫 產品經營</span>
317                    <span class="access-badge access-badge--locked">付費</span>
318        </div>
319        <h3 class="post-item__title">🚧架設官網是基本──上架 App 前究竟有多少準備工作?(三)</h3>
320        <p class="post-item__excerpt">
321                官方網站不是 nice to have,而是建立品牌信任的起點。
322        </p>
323    </a>
324</article>
325                                    <article class="post-item post tag-software-development-thinking tag-product-building tag-todayos">
326    <a class="post-item__link" href="/app-launch-preparation-part-2-onboarding/">
327        <div class="post-item__meta">
328            <span>2026-07-06</span>
329                    <span>🧠 軟體開發思維</span>
330                    <span class="access-badge access-badge--locked">付費</span>
331        </div>
332        <h3 class="post-item__title">🚧新手教學一定要做──上架 App 前究竟有多少準備工作?(二)</h3>
333        <p class="post-item__excerpt">
334                我覺得新手教學是最麻煩,但也是最必須認真面對的工作。如果你的 app 已經上架,但還沒有做新手教學,那麼你接下來的工作,就該是思考並做出新手教學。
335        </p>
336    </a>
337</article>
338                                    <article class="post-item post tag-software-development-thinking tag-product-building tag-todayos tag-codex">
339    <a class="post-item__link" href="/todayos-meta-operation/">
340        <div class="post-item__meta">
341            <span>2026-07-02</span>
342                    <span>🧠 軟體開發思維</span>
343                    <span class="access-badge access-badge--locked">付費</span>
344        </div>
345        <h3 class="post-item__title">🗓️用 todayOS 的設計哲學來經營 todayOS</h3>
346        <p class="post-item__excerpt">
347                獨立開發者要如何掌握工作節奏?我把 app 的設計哲學套用在每一天的工作內容,做了簡單的介面提醒自己。
348        </p>
349    </a>
350</article>
351                            </div>
352                        </div>
353
354        <div class="directory-block">
355            <div class="section-heading">
356                <h2>最近更新</h2>
357            </div>
358            <div class="essay-list">
359                            <article class="post-item post tag-news tag-iphone-duo no-image">
360    <a class="post-item__link" href="/dev-news-268-iphone-duo/">
361        <div class="post-item__meta">
362            <span>2026-09-24</span>
363                    <span>📰 開發者新知與評論</span>
364                    <span class="access-badge access-badge--locked">付費</span>
365        </div>
366        <h3 class="post-item__title">📰Apple 開發者週報 #269 iPhone Duo 特輯</h3>
367        <p class="post-item__excerpt">
368                ⟪13報+⟫滿兩週年。年費優惠方案到 9/30 截止。
369        </p>
370    </a>
371</article>
372                            <article class="post-item post tag-announcement no-image">
373    <a class="post-item__link" href="/13-plus-two-year-love-you/">
374        <div class="post-item__meta">
375            <span>2026-09-14</span>
376                    <span>🪧 公告</span>
377                <span class="access-badge access-badge--public">公開</span>
378        </div>
379        <h3 class="post-item__title">🎂感謝讀者,⟪13報+⟫要滿兩週年了!</h3>
380        <p class="post-item__excerpt">
381                也請留意重要消息與年費訂閱扣款提醒。
382        </p>
383    </a>
384</article>
385                            <article class="post-item post tag-news tag-likit tag-local-ai no-image">
386    <a class="post-item__link" href="/dev-news-268/">
387        <div class="post-item__meta">
388            <span>2026-09-09</span>
389                    <span>📰 開發者新知與評論</span>
390                    <span class="access-badge access-badge--locked">付費</span>
391        </div>
392        <h3 class="post-item__title">📰Apple 開發者週報 #268 LIKit</h3>
393        <p class="post-item__excerpt">
394                Do you like it?
395        </p>
396    </a>
397</article>
398            </div>
399        </div>
400    </section>
401
402</article>
403
404        </main>
405        <footer class="site-footer">
406    <div class="site-footer__lead">
407        <p class="site-footer__brand">13å ±</p>
408        <p>寫給 Apple 開發者的週報與專欄。</p>
409    </div>
410    <div class="site-footer__meta">
411        <div class="site-footer__actions">
412                <a href="https://patreon.com/ethanhuang13/membership" target="_blank" rel="noreferrer">成為會員</a>
413                <a href="#/portal/signin" data-portal="signin">登入(使用 Patreon 電子郵件)</a>
414        </div>
415    </div>
416    <p class="site-footer__note">&copy; 2026 Ethan Huang (13)</p>
417</footer>
418    </div>
419    
419<script src="https://ethanhuang13.plus/assets/built/codex.js?v=4MTsvgvmq4bGV7be"></script>
419
420    
420<script src="https://ethanhuang13.plus/assets/built/telemetry.js?v=wBaWtf3t3Fo9xR7j"></script>
420
421    <style>
422  code[class*="language-"],
423  pre[class*="language-"] {
424    text-shadow: none;
425  }
426  .token.operator {
427    background: none;
428  }
429  </style>
430  
431  
431<script>
432    document.addEventListener("DOMContentLoaded", function () {
433      const links = document.querySelectorAll('a[href$="#/portal/signup"], a[href$="#/portal"]');
434      links.forEach(link => {
435        link.href = "https://patreon.com/ethanhuang13";
436        link.target = "_blank";
437        link.rel = "noopener noreferrer";
438  
439        const newLink = link.cloneNode(true);
440        link.parentNode.replaceChild(newLink, link);
441      });
442    });
443  </script>
443
444  
445  
445<script>
446  document.addEventListener("DOMContentLoaded", function () {
447    const title = document.querySelector(".gh-post-upgrade-cta h2");
448    const subscribeBtn = document.querySelector(".gh-post-upgrade-cta a[data-portal='signup']");
449    const signInText = document.querySelector(".gh-post-upgrade-cta p");
450  
451    if (title) title.textContent = "加入會員以解鎖本篇文章";
452    if (subscribeBtn) subscribeBtn.textContent = "立即註冊(Patreon)";
453    if (signInText) signInText.innerHTML = '已經有帳號了嗎?<a data-portal="signin" href="#/portal/signin" class="gh-portal-close">登入</a>';
454  });
455  </script>
455
456  
457  <!-- Embedded YouTube Playback Control-->
458  
458<script>
459  (function() {
460    'use strict';
461    
462    var players = {};
463    var playersReady = {};
464    
465    if (!window.YT) {
466      var tag = document.createElement('script');
467      tag.src = "https://www.youtube.com/iframe_api";
468      var firstScriptTag = document.getElementsByTagName('script')[0];
469      firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
470    }
471    
472    window.onYouTubeIframeAPIReady = function() {
473      console.log('✓ YouTube API loaded');
474      initializePlayers();
475    };
476    
477    function initializePlayers() {
478      var iframes = document.querySelectorAll('iframe[src*="youtube.com/embed"]');
479      console.log('Found ' + iframes.length + ' YouTube iframes');
480      
481      iframes.forEach(function(iframe, index) {
482        var match = iframe.src.match(/embed\/([^?]+)/);
483        if (match) {
484          var videoId = match[1];
485          console.log('Processing iframe for video:', videoId);
486          
487          // 如果沒有 ID,自動添加
488          if (!iframe.id) {
489            iframe.id = 'youtube-player-' + videoId;
490            console.log('Added ID:', iframe.id);
491          }
492          
493          // 如果 src 沒有 enablejsapi=1,添加它
494          if (!iframe.src.includes('enablejsapi=1')) {
495            var separator = iframe.src.includes('?') ? '&' : '?';
496            iframe.src = iframe.src + separator + 'enablejsapi=1';
497            console.log('Added enablejsapi=1 to src');
498          }
499          
500          // 初始化播放器
501          players[videoId] = new YT.Player(iframe.id, {
502            events: {
503              'onReady': function() {
504                console.log('✓ Player ready:', videoId);
505                playersReady[videoId] = true;
506                modifyLinks();
507              }
508            }
509          });
510        }
511      });
512    }
513    
514    function parseYouTubeUrl(url) {
515      var videoId = null;
516      var timestamp = null;
517
518      var match = url.match(/[?&]v=([^&]+)/);
519      if (match) videoId = match[1];
520
521      if (!videoId) {
522        match = url.match(/youtu\.be\/([^?&]+)/);
523        if (match) videoId = match[1];
524      }
525
526      match = url.match(/[?&]t=(\d+)/);
527      if (match) {
528        timestamp = parseInt(match[1]);
529      } else if (videoId) {
530        // 如果有 videoId 但沒有 t 參數,設定為 0(影片開頭)
531        timestamp = 0;
532      }
533
534      return { videoId: videoId, timestamp: timestamp };
535    }
536    
537    var linksModified = false;
538    
539    function modifyLinks() {
540      if (linksModified) return;
541      
542      var links = document.querySelectorAll('a[href*="youtube.com"], a[href*="youtu.be"]');
543      console.log('Found ' + links.length + ' YouTube links');
544      
545      var modifiedCount = 0;
546      
547      links.forEach(function(link) {
548        var parsed = parseYouTubeUrl(link.href);
549        
550        if (parsed.videoId && parsed.timestamp !== null && players[parsed.videoId] && playersReady[parsed.videoId]) {
551          console.log('📝 Modifying link:', link.textContent.trim(), '(t=' + parsed.timestamp + ')');
552          
553          link.setAttribute('data-original-href', link.href);
554          link.setAttribute('data-yt-videoid', parsed.videoId);
555          link.setAttribute('data-yt-timestamp', parsed.timestamp);
556          
557          link.href = 'javascript:void(0)';
558          link.removeAttribute('target');
559          link.removeAttribute('rel');
560          
561          modifiedCount++;
562        }
563      });
564      
565      if (modifiedCount > 0) {
566        linksModified = true;
567        console.log('✅ Modified ' + modifiedCount + ' links');
568      }
569    }
570    
571    function handleYouTubeLinkInteraction(e) {
572      var target = e.target;
573
574      while (target && target.tagName !== 'A') {
575        target = target.parentElement;
576      }
577
578      if (!target) return;
579
580      var videoId = target.getAttribute('data-yt-videoid');
581      var timestamp = target.getAttribute('data-yt-timestamp');
582
583      if (videoId && timestamp !== null) {
584        console.log('🚀 Link clicked! Video:', videoId, 'Time:', timestamp);
585        e.preventDefault();
586        e.stopPropagation();
587
588        var player = players[videoId];
589        if (player) {
590          player.seekTo(parseInt(timestamp), true);
591          player.playVideo();
592
593          var iframe = document.getElementById('youtube-player-' + videoId);
594          if (iframe) {
595            iframe.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
596          }
597        }
598
599        return false;
600      }
601    }
602
603    // 支援桌面和行動裝置
604    document.addEventListener('click', handleYouTubeLinkInteraction, true);
605    document.addEventListener('touchstart', handleYouTubeLinkInteraction, true);
606    
607    if (document.readyState === 'loading') {
608      document.addEventListener('DOMContentLoaded', function() {
609        if (window.YT && window.YT.Player) {
610          initializePlayers();
611        }
612      });
613    } else {
614      if (window.YT && window.YT.Player) {
615        initializePlayers();
616      }
617    }
618    
619    window.ghostYTPlayers = players;
620  })();
621  </script>
621
622</body>
623</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.