PageSourceSearch

https://hcooch2ch3.github.io/post/ios-spotlight-korean-app-name-english-search

html hcooch2ch3.github.io collected 2026-10-03 09:17:05 UTC 30,258 bytes, 427 lines download raw bytes

1<!DOCTYPE html>
2<html lang="ko">
3
4
5
6
7
8<head>
9  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
10  <meta http-equiv="X-UA-Compatible" content="IE=edge" />
11  <meta name="description" content="내 앱 한국음력달력의 홈 화면 이름이 “KoreanLunarCalendarApp”으로 나오고 있었다. 프로젝트 이름이 그대로 노출된 셈이다. 표시 이름을 “한국음력달력”으로 바꾸는 건 한 줄이면 끝난다. 그런데 바꾸고 나니 Spotlight에서 “lunar”로 검색이 안 됐다. 카..." />
12  <link rel="canonical" href="https://hcooch2ch3.github.io/post/ios-spotlight-korean-app-name-english-search" />
13  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
14  <link rel="stylesheet" href="/assets/main.css"/>
15  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.8.2/css/all.min.css">
16  <link rel="alternate" type="application/rss+xml" title="임성민 - 개발자 Blog" href="/feed.xml" /><meta property="og:site_name" content="임성민 - 개발자 Blog" />
17  <meta property="og:locale" content="ko_KR" />
18  <meta property="og:type" content="article" />
19  <meta property="og:title" content="iOS 26에서 한글 앱 이름을 Spotlight 영어 검색에도 잡히게 하기" />
20  <meta property="og:description" content="내 앱 한국음력달력의 홈 화면 이름이 “KoreanLunarCalendarApp”으로 나오고 있었다. 프로젝트 이름이 그대로 노출된 셈이다. 표시 이름을 “한국음력달력”으로 바꾸는 건 한 줄이면 끝난다. 그런데 바꾸고 나니 Spotlight에서 “lunar”로 검색이 안 됐다. 카..." />
21  <meta property="og:url" content="https://hcooch2ch3.github.io/post/ios-spotlight-korean-app-name-english-search" />
22  
23  <meta property="og:image" content="https://hcooch2ch3.github.io/assets/images/spotlight-alias/spotlight-app-name-sources.png" />
24  <meta name="twitter:card" content="summary_large_image" />
25  
26  <title>iOS 26에서 한글 앱 이름을 Spotlight 영어 검색에도 잡히게 하기 &middot; 임성민 - 개발자 Blog</title>
27  
28    
28<script type="application/ld+json">
29      {
30        "@context": "https://schema.org",
31        "@type": "BlogPosting",
32        "author": "",
33        "datePublished": "2026-09-23T00:00:00+00:00",
34        "headline": "iOS 26에서 한글 앱 이름을 Spotlight 영어 검색에도 잡히게 하기",
35        "url": "https://hcooch2ch3.github.io/post/ios-spotlight-korean-app-name-english-search",
36        "inLanguage": "ko-KR",
37        "isFamilyFriendly": "true",
38        "keywords": "ios, spotlight, appintents, localization",
39        "image": "https://hcooch2ch3.github.io/favicon.ico",
40        "mainEntityOfPage": {
41          "@type": "WebPage",
42          "@id": "https://hcooch2ch3.github.io/post/ios-spotlight-korean-app-name-english-search"
43       }
44      }
45    </script>
45
46  
47  
47<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-7484994114793984"
48     crossorigin="anonymous"></script>
48
49</head>
50
51<body>
52<div class="container">
53  <nav class="top-nav">
54  <a class="nav-item" href='/'>Home</a>
55  | <a class="nav-item" href='/about'>About</a>
56  | <a class="nav-item" href='/tools/'>Tools</a>
57  | <a class="nav-item dark-light-switch" href="#"></a>
58</nav>
59
60  <hr class="stylish"/>
61  <div class="_progress-wrapper">
62  <div id="_progress"></div>
63</div>
64
65<header>
66  <h1>iOS 26에서 한글 앱 이름을 Spotlight 영어 검색에도 잡히게 하기</h1>
67  <header class="title-tags">
68    <time datetime="2026-09-23T00:00:00+00:00">23 September, 2026. It was a Wednesday.</time>
69    <div class="tags-container">
70      Posted under <span>
71          
72            <a class="tags" href="/tags#ios">ios</a>
73          
74            <a class="tags" href="/tags#spotlight">spotlight</a>
75          
76            <a class="tags" href="/tags#appintents">appintents</a>
77          
78            <a class="tags" href="/tags#localization">localization</a>
79          
80        </span>
81      &nbsp;
82    </div>
83  </header>
84</header>
85
86<hr class="stylish" />
87
88<main role="main">
89
90  <article>
91
92    <section>
93      
93<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-7484994114793984"
94     crossorigin="anonymous"></script>
94
95      <!-- horizontal -->
96      <ins class="adsbygoogle"
97          style="display:block"
98          data-ad-client="ca-pub-7484994114793984"
99          data-ad-slot="5007321030"
100          data-ad-format="auto"
101          data-full-width-responsive="true"></ins>
102      
102<script>
103        (adsbygoogle = window.adsbygoogle || []).push({});
104      </script>
104
105    </section>
106
107    <section class="content">
108      <p>내 앱 <a href="https://apps.apple.com/kr/app/id6751783601">한국음력달력</a>의 홈 화면 이름이 “KoreanLunarCalendarApp”으로 나오고 있었다.
109프로젝트 이름이 그대로 노출된 셈이다. 표시 이름을 “한국음력달력”으로 바꾸는 건 한 줄이면 끝난다.
110그런데 바꾸고 나니 Spotlight에서 “lunar”로 검색이 안 됐다. 카카오톡은 “kakaotalk”으로 쳐도 잡히는데
111내 앱은 왜 검색이 안 될까. 이를 가능하게 하기 위해 이것저것 시도를 해보았다.</p>
112
113<h2 id="일단-홈-화면-이름은-왜-영어였나">일단 홈 화면 이름은 왜 영어였나</h2>
114
115<p>Tuist로 만든 프로젝트라 <code class="language-plaintext highlighter-rouge">Info.plist</code>에 <code class="language-plaintext highlighter-rouge">CFBundleDisplayName</code>이 없었다. 이 키가 없으면 iOS는
116<code class="language-plaintext highlighter-rouge">CFBundleName</code>, 즉 프로덕트 이름을 그대로 보여준다. 그래서 “KoreanLunarCalendarApp”이었다.</p>
117
118<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Project.swift</span>
119<span class="nv">infoPlist</span><span class="p">:</span> <span class="o">.</span><span class="nf">extendingDefault</span><span class="p">(</span><span class="nv">with</span><span class="p">:</span> <span class="p">[</span>
120    <span class="s">"CFBundleDisplayName"</span><span class="p">:</span> <span class="s">"한국음력달력"</span><span class="p">,</span>
121    <span class="c1">// ...</span>
122<span class="p">]),</span>
123</code></pre></div></div>
124
125<p>이걸로 홈 화면은 해결됐다. 문제는 그 다음이다.</p>
126
127<h2 id="apple-엔지니어가-알려준-방법-kmditemkeywords">Apple 엔지니어가 알려준 방법: kMDItemKeywords</h2>
128
129<p>Apple 개발자 포럼에 비슷한 질문이 있었다. “데스크톱에서 Twitter를 검색하면 X가 나오는 것처럼 하려면?”
130Apple DTS 엔지니어의 답(2024년 8월)은 <code class="language-plaintext highlighter-rouge">Info.plist</code>에 키워드를 넣으라는 것이었다. iOS는 <code class="language-plaintext highlighter-rouge">kMDItemKeywords</code>,
131macOS는 <code class="language-plaintext highlighter-rouge">MDItemKeywords</code> 키를 쓴다.</p>
132
133<p>이 키는 원래 macOS Spotlight의 파일 메타데이터다. PDF의 키워드나 사진의 IPTC 태그 같은 것을 담는 자리인데
134앱 번들도 파일이라 같은 색인을 탄다. Apple도 자기 앱에 쓴다. macOS 캘린더 앱을 <code class="language-plaintext highlighter-rouge">mdls</code>로 보면 이렇다.</p>
135
136<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ mdls -name kMDItemDisplayName -name kMDItemKeywords /System/Applications/Calendar.app
137kMDItemDisplayName = "캘린더"
138kMDItemKeywords    = "iCal,ᄏᄅᄃ,ᄃᄅ"
139</code></pre></div></div>
140
141<p>“iCal”을 쳐도 캘린더가 나오는 이유다. 초성 “ㅋㄹㄷ”까지 들어 있다. 번들의 <code class="language-plaintext highlighter-rouge">Info.plist</code>에는 <code class="language-plaintext highlighter-rouge">MDItemKeywords</code> 키에
142“iCal”이 영어로 들어 있고, 언어별 <code class="language-plaintext highlighter-rouge">InfoPlist</code> 문자열로 로컬라이즈돼서 한국어 시스템에서는 연락처가 “주소록”,
143시스템 설정이 “시스템 환경설정”으로 색인된다.
144iOS 18.1 실기기와 시뮬레이터에서 동작을 확인했다는 글도 있었다(스토어 배포본은 미검증이라는 단서가 붙어 있다).
145그래서 시도해 보았다.</p>
146
147<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s">"kMDItemKeywords"</span><span class="p">:</span> <span class="s">"Korean Lunar Calendar,lunar calendar,lunar,음력,음력달력,한국음력달력"</span><span class="p">,</span>
148</code></pre></div></div>
149
150<p><strong>안 된다.</strong> 시뮬레이터에서 안 되길래 문자열 대신 배열로도 넣어 봤다. 앱을 지웠다가 다시 깔고, 시뮬레이터를
151재부팅하고, TestFlight로 iOS 26 실기기에도 올려 봤다. 전부 무반응이었다.</p>
152
153<h2 id="두-번째-힌트-cfbundlename을-별칭으로">두 번째 힌트: CFBundleName을 별칭으로</h2>
154
155<p>비슷한 질문(“앱 이름을 바꿨는데 옛 이름으로도 찾히게 하려면?”)이 올라온 다른 스레드에는 다른 DTS 엔지니어의
156답(2024년 11월)이 있었다. iOS는 <code class="language-plaintext highlighter-rouge">CFBundleDisplayName</code>을 화면에 보여주지만 <code class="language-plaintext highlighter-rouge">CFBundleName</code>도 색인하니, 표시 이름은
157새 이름으로 두고 번들 이름에 옛 이름을 남기면 둘 다로 찾을 수 있을 거라는 답이었다. 단, 번들 이름은 <code class="language-plaintext highlighter-rouge">.app</code> 파일
158이름과 같아야 한다는 조건이 붙어 있었다.</p>
159
160<p>이건 시뮬레이터에서 묘한 결과가 나왔다. 앱을 새로 설치한 직후에는 Spotlight가 앱을 번들 이름
161“KoreanLunarCalendarApp”으로 색인해서 “lunar”에 잡혔다. 카멜케이스를 단어로 쪼개서 매칭한 것 같다. 부분 문자열 매칭일 수도 있다.
162그런데 재부팅하고 나면 색인이 표시 이름 “한국음력달력”으로 바뀌면서 “lunar”는 안 잡히고 “음력”만 잡혔다.</p>
163
164<p><img src="/assets/images/spotlight-alias/sim-eumryeok-tophit.png" alt="시뮬레이터: 재부팅 후 &quot;음력&quot;은 Top Hit로 잡힌다" /></p>
165
166<p><img src="/assets/images/spotlight-alias/sim-lunar-runner-only.png" alt="시뮬레이터: &quot;lunar&quot;에는 내 앱 대신 UI 테스트 러너만 잡힌다" /></p>
167
168<p>“lunar”에 UI 테스트 러너(“KoreanLunarCalendarAppUITests-Runner”)가 잡힌 건 그 번들 이름에 “Lunar”가 들어 있어서다.
169번들 이름 문자열 매칭 자체는 살아 있다는 뜻이다.</p>
170
171<p><strong>시뮬레이터에서는 한 번에 한 이름만 매칭됐다.</strong> 번들 이름을 “Korean Lunar Calendar”로 바꿔 봐도(<code class="language-plaintext highlighter-rouge">.app</code> 파일 이름은
172그대로 뒀다) 표시 이름으로 색인된 상태에서는 영어 검색이 되지 않고, 롤백했다. 실기기에서는 따로 시험하지 않았다.</p>
173
174<h2 id="알고-보니-ios-1718부터-키워드-계열은-버그-보고가-쌓여-있었다">알고 보니 iOS 17~18부터 키워드 계열은 버그 보고가 쌓여 있었다</h2>
175
176<p>여기서 다시 조사했다. “키워드”라는 이름이 붙은 API마다 iOS 17~18 이후 안 된다는 글이 포럼에 여럿 올라와 있었다.</p>
177
178<table>
179  <thead>
180    <tr>
181      <th>방법</th>
182      <th>보고된 상태</th>
183      <th>
183근거</th>
184    </tr>
185  </thead>
186  <tbody>
187    <tr>
188      <td><code class="language-plaintext highlighter-rouge">kMDItemKeywords</code></td>
189      <td>iOS 18.1에서는 됐다는 보고. 내 iOS 26 환경(시뮬레이터, TestFlight 실기기)에서는 무반응</td>
190      <td>Zenn 글, 직접 실측. 공개된 버그 리포트는 못 찾음</td>
191    </tr>
192    <tr>
193      <td><code class="language-plaintext highlighter-rouge">NSUserActivity.keywords</code></td>
194      <td>iOS 18+ 미동작</td>
195      <td>FB17023996. 이전 버전에선 됐음</td>
196    </tr>
197    <tr>
198      <td><code class="language-plaintext highlighter-rouge">CSSearchableItem</code> keywords (앱 내부 콘텐츠용)</td>
199      <td>iOS 17+ 미동작, displayName만 매칭</td>
200      <td>FB17330079, FB17408320 “조사 중”</td>
201    </tr>
202    <tr>
203      <td><code class="language-plaintext highlighter-rouge">CFBundleName</code> 별칭</td>
204      <td>시뮬레이터에서 효과 없음</td>
205      <td>직접 실측</td>
206    </tr>
207  </tbody>
208</table>
209
210<p>재미있는 건 <code class="language-plaintext highlighter-rouge">NSUserActivity</code> 키워드가 안 된다고 접수된 스레드에서 DTS가 대안으로 권장한 게 바로 <code class="language-plaintext highlighter-rouge">kMDItemKeywords</code>였다는
211점이다. 그런데 내 환경에서는 그것도 안 됐다.</p>
212
213<h2 id="그럼-가능한-방법은">그럼 가능한 방법은?</h2>
214
215<p>두 가지 방법이 가능했다.</p>
216
217<p><strong>첫째, 언어별 표시 이름.</strong> 카카오톡은 한국어 기기에서 “카카오톡”, 영어 기기에서 “KakaoTalk”으로 보이는데
218한국어 기기에서 “kakaotalk”을 쳐도 잡힌다. 물론 카카오톡은 번들 이름이나 스토어 이름 때문일 수도 있어서 이것만으로
219단정할 수는 없다. 다른 근거를 찾아보면 2026년 2월 Michael Tsai 블로그 댓글에 시스템 언어가 독일어인 사용자가
220“iOS에서는 ‘Ca’와 ‘Ka’ 둘 다 Kalender를 찾는다”고 쓴 댓글이 있다(Apple 기본 앱 사례). 같은 댓글에서 macOS 26은
221이게 깨졌지만 iOS 26에서는 살아 있다고 했다. iOS Spotlight가 앱의 다른 언어 이름까지 대조하는 것으로 보인다.</p>
222
223<p><code class="language-plaintext highlighter-rouge">ko.lproj</code>와 <code class="language-plaintext highlighter-rouge">en.lproj</code>에 <code class="language-plaintext highlighter-rouge">InfoPlist.strings</code>를 하나씩 둔다.</p>
224
225<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>// ko.lproj/InfoPlist.strings
226"CFBundleDisplayName" = "한국음력달력";
227
228// en.lproj/InfoPlist.strings
229"CFBundleDisplayName" = "Korean Lunar Calendar";
230</code></pre></div></div>
231
232<p>Tuist라면 <code class="language-plaintext highlighter-rouge">Project.swift</code>의 <code class="language-plaintext highlighter-rouge">resources</code>에 <code class="language-plaintext highlighter-rouge">"KoreanLunarCalendar/Resources/**"</code>처럼 <code class="language-plaintext highlighter-rouge">.lproj</code> 경로를 추가해야 번들에
233들어간다. <code class="language-plaintext highlighter-rouge">Info.plist</code>의 <code class="language-plaintext highlighter-rouge">CFBundleDisplayName</code>은 strings가 없는 언어에서 쓰이는 기본값으로 그대로 둔다.</p>
234
235<p><strong>둘째, App Shortcut.</strong> WWDC23 “Spotlight your app with App Shortcuts” 세션에 명시된 동작이다.
236App Shortcut은 앱 이름으로 검색할 때뿐 아니라 <strong>바로가기의 제목 자체로도 검색된다.</strong> 그러니 <code class="language-plaintext highlighter-rouge">shortTitle</code>이
237“Korean Lunar Calendar”인 바로가기를 하나 등록하면 제목의 앞 단어부터 맞는 검색어(“korean”)에 바로가기 타일이 뜬다.
238탭하면 앱이 열린다.</p>
239
240<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">import</span> <span class="kt">AppIntents</span>
241
242<span class="kd">struct</span> <span class="kt">OpenKoreanLunarCalendarIntent</span><span class="p">:</span> <span class="kt">AppIntent</span> <span class="p">{</span>
243    <span class="kd">static</span> <span class="k">let</span> <span class="nv">title</span><span class="p">:</span> <span class="kt">LocalizedStringResource</span> <span class="o">=</span> <span class="s">"Open Korean Lunar Calendar"</span>
244    <span class="kd">static</span> <span class="k">let</span> <span class="nv">openAppWhenRun</span><span class="p">:</span> <span class="kt">
244Bool</span> <span class="o">=</span> <span class="kc">true</span>
245
246    <span class="kd">@MainActor</span>
247    <span class="kd">func</span> <span class="nf">perform</span><span class="p">()</span> <span class="k">async</span> <span class="k">throws</span> <span class="o">-&gt;</span> <span class="kd">some</span> <span class="kt">IntentResult</span> <span class="p">{</span> <span class="o">.</span><span class="nf">result</span><span class="p">()</span> <span class="p">}</span>
248<span class="p">}</span>
249
250<span class="kd">struct</span> <span class="kt">KoreanLunarCalendarShortcuts</span><span class="p">:</span> <span class="kt">AppShortcutsProvider</span> <span class="p">{</span>
251    <span class="kd">static</span> <span class="k">var</span> <span class="nv">appShortcuts</span><span class="p">:</span> <span class="p">[</span><span class="kt">AppShortcut</span><span class="p">]</span> <span class="p">{</span>
252        <span class="kt">AppShortcut</span><span class="p">(</span>
253            <span class="nv">intent</span><span class="p">:</span> <span class="kt">OpenKoreanLunarCalendarIntent</span><span class="p">(),</span>
254            <span class="nv">phrases</span><span class="p">:</span> <span class="p">[</span><span class="s">"Open </span><span class="se">\(</span><span class="o">.</span><span class="n">applicationName</span><span class="se">)</span><span class="s">"</span><span class="p">,</span> <span class="s">"</span><span class="se">\(</span><span class="o">.</span><span class="n">applicationName</span><span class="se">)</span><span class="s"> 열어줘"</span><span class="p">],</span>
255            <span class="nv">shortTitle</span><span class="p">:</span> <span class="s">"Korean Lunar Calendar"</span><span class="p">,</span>
256            <span class="nv">systemImageName</span><span class="p">:</span> <span class="s">"calendar"</span>
257        <span class="p">)</span>
258    <span class="p">}</span>
259<span class="p">}</span>
260</code></pre></div></div>
261
262<p>두 개를 같이 넣고 TestFlight로 올렸다. iOS 26 실기기에서 “lunar”를 치니 앱이 떴다. “앱” 섹션에 “한국음력달력”이 뜨고
263그 아래 회색으로 “Korean Lunar Calendar”의 “Lunar”가 강조돼 있다. 맨 위 “가장 연관성 높은 항목”에는 설정 배지가
264붙은 “KoreanLunarCalendarApp”이 떴다. 옛 번들 이름이 어딘가에는 아직 색인돼 있다는 뜻인데, 정확히 어떤 항목인지는
265확인하지 못했다.</p>
266
267<p><img src="/assets/images/spotlight-alias/device-lunar-result.png" alt="실기기: &quot;lunar&quot; 검색 결과" /></p>
268
269<p>다만 이 화면만으로는 “Lunar”가 영어 표시 이름에 걸린 건지 바로가기 제목에 걸린 건지 알 수 없다. 두 문자열이 같아서다.
270그래서 시뮬레이터에서 영어 표시 이름을 “Korean Lunar Calendar Zebra”로, 바로가기 제목을 “Quokka Calendar”로 바꾼
271빌드를 따로 만들어 각 경로에만 있는 단어로 검색해 봤다. “zebra”를 치면 “앱” 섹션에 앱이 뜨고, “quokka”를 치면 바로가기
272타일이 떴다. 둘 다 각자 동작한다.</p>
273
274<p><img src="/assets/images/spotlight-alias/sim-token-zebra.png" alt="시뮬레이터: &quot;zebra&quot;는 영어 표시 이름에 걸려 &quot;앱&quot; 섹션에 뜬다" /></p>
275
276<p><img src="/assets/images/spotlight-alias/sim-token-quokka.png" alt="시뮬레이터: &quot;quokka&quot;는 바로가기 제목에 걸려 타일로 뜬다" /></p>
277
278<p>조건이 하나 있다. 표시 이름은 “zebra”처럼 뒤쪽 단어로도 잡히지만, 바로가기 제목은 <strong>앞 단어부터</strong> 맞아야 했다.
279제목을 “Lunar Calendar Quokka”로 뒀을 때는 “quokka”에 아무것도 안 떴고, “Quokka Calendar”로 바꾸자 떴다.
280실제 빌드의 제목이 “Korean Lunar Calendar”라서 위 실기기 화면에서 “lunar”에 타일이 안 보인 이유다.</p>
281
282<p>2.3.0이 App Store에 출시된 뒤, 앱스토어 레코드 이름도 Spotlight에 영향을 주는지 확인해보고 싶었다. DTS 답변에 iOS가 App Store 레코드의 이름도
283색인한다는 말이 있었어서다. “lunar”라는 키워드는 앱스토어 레코드에도, 앱 번들에도 포함되기 때문에 이 키워드로는
284영향을 주는지 아닌지 확인이 안 된다. 그래서 앱 번들에는 없고
285스토어 메타데이터(부제, 설명, 키워드)에만 있는 단어 “워치 페이스”로 검색했다. <strong>“앱” 섹션에 설치된 앱이 떴다.</strong>
286스토어 레코드는 번들에 들어 있지 않으니, DTS 답변대로 스토어에서 받은 레코드가 로컬 앱 검색 ê²°ê
286³¼ì— 반영되는
287것으로 보인다. 부제, 설명, 키워드 중 어느 필드가 걸린 건지는 가르지 못했다. 스토어 이름에도
288“Korean Lunar Calendar”가 들어가 있으니 이것도 영어 검색 경로가 될 것으로 기대한다.</p>
289
290<h2 id="정리">정리</h2>
291
292<p><img src="/assets/images/spotlight-alias/spotlight-app-name-sources.png" alt="Spotlight가 앱을 찾을 때 보는 것들" /></p>
293
294<table>
295  <thead>
296    <tr>
297      <th>방법</th>
298      <th>iOS 26 ê²°ê³¼</th>
299      <th>비고</th>
300    </tr>
301  </thead>
302  <tbody>
303    <tr>
304      <td><code class="language-plaintext highlighter-rouge">CFBundleDisplayName</code> 로컬라이즈 (ko/en)</td>
305      <td>된다</td>
306      <td>“앱” 섹션에 뜸. 이름 어느 단어로든 잡힘. 영어 이름에만 있는 단어(“zebra”)로 단독 확인. 영어 기기에서는 영어 이름이 보임</td>
307    </tr>
308    <tr>
309      <td>App Shortcut 제목</td>
310      <td>된다, 단 제목 앞 단어부터</td>
311      <td>바로가기 타일로 뜸. 제목에만 있는 단어(“quokka”)로 단독 확인. 제목이 “Korean Lunar Calendar”면 “korean”에는 뜨고 “lunar”에는 안 뜸</td>
312    </tr>
313    <tr>
314      <td><code class="language-plaintext highlighter-rouge">kMDItemKeywords</code></td>
315      <td>안 된다 (내 환경)</td>
316      <td>DTS 권장 방법. iOS 18.1 동작 보고는 있으나 iOS 26 시뮬레이터와 실기기에서 무반응</td>
317    </tr>
318    <tr>
319      <td><code class="language-plaintext highlighter-rouge">CFBundleName</code> 별칭</td>
320      <td>시뮬레이터에서 안 된다</td>
321      <td>실기기에서는 옛 번들 이름 항목이 따로 뜸(원인 미확인)</td>
322    </tr>
323    <tr>
324      <td>App Store 메타데이터</td>
325      <td>된다</td>
326      <td>출시 후 실기기에서 확인. 번들에 없는 스토어 단어 “워치 페이스”로 검색하니 “앱” 섹션에 뜸. 어느 필드인지는 미분리</td>
327    </tr>
328  </tbody>
329</table>
330
331<p>요약하면, 키워드를 심는 방식은 iOS 26에서 전부 헛수고였다. 되는 건 언어별 표시 이름과 App Shortcut 제목, 그리고
332스토어 이름이다. 셋 다 “앱 이름을 하나 더 갖게 하는” 방법이라는 공통점이 있다.</p>
333
334<p>이번에 배운 건 Apple 엔지니어가 답변한 내용이더라도 OS 버전에 따라 달라질 수 있다는 점이다.
335앞으론 답변 날짜와 버그 리포트 번호도 잘 확인해야겠다.</p>
336
337<h2 id="ps-claude한테-테스트-시킬-수-있는-것과-없는-것">PS. Claude한테 테스트 시킬 수 있는 것과 없는 것</h2>
338
339<p>이 글의 시뮬레이터 실험은 대부분 Claude Code가 했다. 나는 “시뮬레이터로 다시 실행해서 확인해”라고 했을 뿐이다.
340검색어 세 개(“lunar”, “korean lunar”, “음력”)를 넣고, 앱을 지웠다 깔고, 재부팅하고, 그때마다 스크린샷을 찍어 보여주는 일을 Claude가 반복했다.</p>
341
342<p>처음에는 <code class="language-plaintext highlighter-rouge">cliclick</code>으로 시뮬레이터 창을 직접 클릭하려 했다. 그런데 클릭이 뒤에 있던 VS Code 창으로 새어 들어갔다.
343창 좌표 보정이 틀렸기 때문이다. 내가 다른 창에서 작업 중이라 마우스를 계속 건드리게 두면 위험했고, Claude도
344그 시점에서 방법을 바꿨다.</p>
345
346<p>바꾼 방법은 XCUITest로 SpringBoard를 직접 조작하는 것이다. 임시 테스트 파일 하나를 만들어 Spotlight를 열고
347검색어를 치고 결과를 확인하게 했다. 홈 화면 하단 검색 알약은 <code class="language-plaintext highlighter-rouge">spotlight-pill</code>이라는 접근성 식별자가 붙어 있는데
348같은 식별자가 두 개라서 <code class="language-plaintext highlighter-rouge">firstMatch</code>가 필요하다. 시뮬레이터 기본 키보드가 한글이라 영어를 치기 전에 지구본 키로
349전환해야 했다. 이런 건 Claude가 실패 로그를 보고 스스로 찾아냈다.</p>
350
351<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">let</span> <span class="nv">springboard</span> <span class="o">=</span> <span class="kt">XCUIApplication</span><span class="p">(</span><span class="nv">bundleIdentifier</span><span class="p">:</span> <span class="s">"com.apple.springboard"</span><span class="p">)</span>
352<span class="kt">XCUIDevice</span><span class="o">.</span><span class="n">shared</span><span class="o">.</span><span class="nf">press</span><span class="p">(</span><span class="o">.</span><span class="n">home</span><span class="p">)</span>
353<span class="n">springboard</span><span class="o">.</span><span class="n">otherElements</span><span class="p">[</span><span class="s">
353"spotlight-pill"</span><span class="p">]</span><span class="o">.</span><span class="n">firstMatch</span><span class="o">.</span><span class="nf">tap</span><span class="p">()</span>
354<span class="n">springboard</span><span class="o">.</span><span class="n">keyboards</span><span class="o">.</span><span class="n">buttons</span><span class="p">[</span><span class="s">"다음 키보드"</span><span class="p">]</span><span class="o">.</span><span class="nf">tap</span><span class="p">()</span>   <span class="c1">// 한글 → 영어</span>
355<span class="n">springboard</span><span class="o">.</span><span class="nf">typeText</span><span class="p">(</span><span class="s">"lunar"</span><span class="p">)</span>
356<span class="k">let</span> <span class="nv">found</span> <span class="o">=</span> <span class="n">springboard</span><span class="o">.</span><span class="n">staticTexts</span><span class="p">[</span><span class="s">"한국음력달력"</span><span class="p">]</span><span class="o">.</span><span class="nf">waitForExistence</span><span class="p">(</span><span class="nv">timeout</span><span class="p">:</span> <span class="mi">5</span><span class="p">)</span>
357</code></pre></div></div>
358
359<p>지구본 키 레이블 “다음 키보드”는 시스템 언어가 한국어일 때 기준이다. 환경이 다르면 레이블도 다르다.</p>
360
361<p>스크린샷은 <code class="language-plaintext highlighter-rouge">XCUIScreen.main.screenshot().pngRepresentation</code>을 호스트 경로에 바로 써서 Claude가 읽고 판단했다.
362나는 결과 캡처만 확인하였다. 사람이 했으면 검색어 세 개를 삭제, 재설치, 재부팅 조합마다 손으로 쳤을 일이다.</p>
363
364<p>다만 Claude한테 시킬 수 없는 것도 있었다. App Store 레코드 색인은 시뮬레이터에서
365시험이 불가능하고(스토어 레코드는 앱스토어 출시 이후에 앱에 붙으므로), 출시 후 스토어 부제에 포함되고 앱 번들에는 미포함인 “워치 페이스”라는 키워드로 검색하여 확인할 수 있었다.</p>
366
367<h3 id="참고">참고</h3>
368
369<ul>
370  <li><a href="https://developer.apple.com/forums/thread/761535">Apple Forums: I want to add keywords to the system search App name</a></li>
371  <li><a href="https://developer.apple.com/forums/thread/768054">Apple Forums: How to find renamed app using old name in Spotlight?</a></li>
372  <li><a href="https://developer.apple.com/forums/thread/778102">Apple Forums: Spotlight search by keywords in NSUserActivity doesn’t work (iOS 18)</a></li>
373  <li><a href="https://developer.apple.com/forums/thread/781872">Apple Forums: Core Spotlight keyword matching broken iOS 17/18</a></li>
374  <li><a href="https://mjtsai.com/blog/2026/02/18/searching-for-apps-with-spotlight/">Michael Tsai: Searching for Apps With Spotlight</a></li>
375  <li><a href="https://developer.apple.com/videos/play/wwdc2023/10102/">WWDC23: Spotlight your app with App Shortcuts</a></li>
376  <li><a href="https://zenn.dev/usagimaru/articles/3fa6fad1c43fa8">Zenn: Spotlight検索で自分のiOSアプリが引っかかるキーワードを増やす</a></li>
377</ul>
378
379    </section>
380
381    <hr class="stylish"/>
382    
383    <section class="coupang-ad" style="text-align: center; margin-bottom: 1rem;">
384      <p style="font-size: 1.1rem; font-weight: bold; margin-bottom: 0.5rem; padding: 0.5rem 0;">이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.</p>
385      
385<script src="https://ads-partners.coupang.com/g.js"></script>
385
386      
386<script>
387        new PartnersCoupang.G({"id":970805,"template":"carousel","trackingCode":"AF1423441","width":"600","height":"100","tsource":""});
388      </script>
388
389    </section>
390
391    <hr class="stylish"/>
392    
393    <section id="comment">
394    </section>
395    
396    <hr class="stylish"/>
397
398    <section class="pagination">
399      
400      <a class="prev" href="/post/readme-youtube-thumbnail">&laquo; GitHub README에 유튜브 영상 넣기</a>
401      
402      
403    </section>
404
405  </article>
406
407</main>
408
409</div>
410<footer>
411  <hr class="stylish"/>
412  <nav class="top-nav">
413  <a class="nav-item" href='/'>Home</a>
414  | <a class="nav-item" href='/about'>About</a>
415  | <a class="nav-item" href='/tools/'>Tools</a>
416  | <a class="nav-item dark-light-switch" href="#"></a>
417</nav>
418
419  <div>
420    <a>임성민 - 개발자 Blog</a> &copy; 2026
421  </div>
422</footer>
423
424  
424<script src="/assets/main.js"></script>
424
425
426</body>
427</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.