#ASO ๋ฐ์ดํฐ ๋๊ธฐํ ๋๊ตฌ
๋ก์ปฌ ์บ์์ ์คํ ์ด ๊ฐ ASO(App Store Optimization) ๋ฐ์ดํฐ๋ฅผ ๋๊ธฐํํ๋ ๋๊ตฌ์ ๋๋ค.
#aso-pull
App Store/Google Play์์ ASO ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ๋ก์ปฌ ์บ์์ ์ ์ฅํฉ๋๋ค.
#ํ๋ผ๋ฏธํฐ
| ํ๋ผ๋ฏธํฐ | ํ์ | ํ์ | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช |
|---|---|---|---|---|
app | string | ์กฐ๊ฑด๋ถ | - | ๋ฑ๋ก๋ ์ฑ slug |
bundleId | string | ์กฐ๊ฑด๋ถ | - | App Store ๋ฒ๋ค ID |
packageName | string | ์กฐ๊ฑด๋ถ | - | Google Play ํจํค์ง๋ช |
store | "appStore" | "googlePlay" | "both" | ์๋์ค | "both" | ๋์ ์คํ ์ด |
dryRun | boolean | ์๋์ค | false | true์ด๋ฉด ์ ์ฅ ์์ด ๊ฒฐ๊ณผ๋ง ์ถ๋ ฅ |
์ฐธ๊ณ :
app(๊ถ์ฅ) ๋๋bundleId/packageName์ ์ง์ ์ ๊ณตํ์ธ์.
#์ฌ์ฉ ์์
// ๋ฑ๋ก๋ ์ฑ์ผ๋ก ๋ชจ๋ ์คํ ์ด์์ ๊ฐ์ ธ์ค๊ธฐ
{ "app": "myapp" }
// App Store๋ง ๊ฐ์ ธ์ค๊ธฐ
{ "app": "myapp", "store": "appStore" }
// ์ง์ ์๋ณ์ ์ฌ์ฉ
{ "bundleId": "com.example.app", "packageName": "com.example.app" }
// ๋ฐ์ดํฐ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
{ "app": "myapp", "dryRun": true }
#๊ฐ์ ธ์ค๋ ๋ฐ์ดํฐ
App Store:
- ์ฑ ์ด๋ฆ, ๋ถ์ ๋ชฉ, ์ค๋ช
- ํค์๋, ํ๋ก๋ชจ์ ํ ์คํธ
- ์คํฌ๋ฆฐ์ท (iPhone 6.5", iPhone 6.1", iPad Pro 12.9")
- ๋ชจ๋ ์ง์ ์ธ์ด
Google Play:
- ์ ๋ชฉ, ์งง์ ์ค๋ช , ์ ์ฒด ์ค๋ช
- ์คํฌ๋ฆฐ์ท (ํด๋ํฐ, ํ๋ธ๋ฆฟ)
- ๋ํ ์ด๋ฏธ์ง
- ๋ชจ๋ ์ง์ ์ธ์ด
#๋ฐ์ดํฐ ์ ์ฅ ์์น
์ค์ ์ dataDir์ ์ง์ ๋ ๊ฒฝ๋ก์ ์ ์ฅ๋ฉ๋๋ค:
{dataDir}/.aso/pull/{slug}/
โโโ app-store/
โ โโโ data.json
โ โโโ screenshots/{locale}/
โ โโโ iphone65-1.png
โ โโโ iphone65-2.png
โ โโโ ...
โโโ google-play/
โโโ data.json
โโโ screenshots/{language}/
โโโ phone-1.png
โโโ phone-2.png
โโโ feature-graphic.png
#์๋ต
โ
ASO data pulled
Google Play: โ
App Store: โ
#aso-push
๋ก์ปฌ ์บ์์ ASO ๋ฐ์ดํฐ๋ฅผ App Store/Google Play์ ๋ฐ์ํฉ๋๋ค.
#ํ๋ผ๋ฏธํฐ
| ํ๋ผ๋ฏธํฐ | ํ์ | ํ์ | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช |
|---|---|---|---|---|
app | string | ์กฐ๊ฑด๋ถ | - | ๋ฑ๋ก๋ ์ฑ slug |
bundleId | string | ์กฐ๊ฑด๋ถ | - | App Store ๋ฒ๋ค ID |
packageName | string | ์กฐ๊ฑด๋ถ | - | Google Play ํจํค์ง๋ช |
store | "appStore" | "googlePlay" | "both" | ์๋์ค | "both" | ๋์ ์คํ ์ด |
uploadImages | boolean | ์๋์ค | false | ์ด๋ฏธ์ง ์ ๋ก๋ ์ฌ๋ถ |
dryRun | boolean | ์๋์ค | false | true์ด๋ฉด ๋ฐ์ ์์ด ๊ฒฐ๊ณผ๋ง ์ถ๋ ฅ |
#์ฌ์ฉ ์์
// ๋ชจ๋ ์คํ ์ด์ ๋ฐ์
{ "app": "myapp" }
// Google Play๋ง ๋ฐ์
{ "app": "myapp", "store": "googlePlay" }
// ์ด๋ฏธ์ง์ ํจ๊ป ๋ฐ์
{ "app": "myapp", "uploadImages": true }
// ๋ฏธ๋ฆฌ๋ณด๊ธฐ
{ "app": "myapp", "dryRun": true }
#๋ฐ์ดํฐ ์์ค
push ๋๋ ํ ๋ฆฌ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค:
{dataDir}/.aso/push/{slug}/
โโโ app-store/
โ โโโ data.json
โโโ google-play/
โโโ data.json
#์๋ต
๐ค ASO Push Results:
โ
Google Play: Updated 3 locales (en-US, ko, ja)
โ
App Store: Updated 3 locales (en-US, ko, ja)
์๋ฌ:
๐ค ASO Push Results:
โ Google Play: Push failed: Permission denied
โญ๏ธ Skipping App Store (not registered for App Store)
#๋ฐ์ดํฐ ํ์
#App Store ๋ฐ์ดํฐ (data.json)
{
"defaultLocale": "en-US",
"locales": {
"en-US": {
"name": "My App",
"subtitle": "Your productivity companion",
"description": "Full app description...",
"keywords": "productivity,task,todo",
"promotionalText": "Now with new features!",
"screenshots": {
"iphone65": ["url1", "url2"],
"iphone61": ["url1", "url2"],
"ipadPro129": ["url1"]
}
},
"ko": {
"name": "๋ง์ด ์ฑ",
"subtitle": "์์ฐ์ฑ ๋์ฐ๋ฏธ",
"description": "์ ์ฒด ์ฑ ์ค๋ช
...",
"keywords": "์์ฐ์ฑ,์์
,ํ ์ผ",
"promotionalText": "์๋ก์ด ๊ธฐ๋ฅ ์ถ๊ฐ!",
"screenshots": {
"iphone65": ["url1", "url2"]
}
}
}
}
#Google Play ๋ฐ์ดํฐ (data.json)
{
"defaultLocale": "en-US",
"locales": {
"en-US": {
"title": "My App",
"shortDescription": "Your productivity companion",
"fullDescription": "Full app description...",
"screenshots": {
"phone": ["url1", "url2"],
"tablet": ["url1"]
},
"featureGraphic": "feature-url"
},
"ko": {
"title": "๋ง์ด ์ฑ",
"shortDescription": "์์ฐ์ฑ ๋์ฐ๋ฏธ",
"fullDescription": "์ ์ฒด ์ฑ ์ค๋ช
...",
"screenshots": {
"phone": ["url1", "url2"]
}
}
}
}
#์ํฌํ๋ก์ฐ ์์
-
ํ์ฌ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ:
{ "app": "myapp" } -
๋ก์ปฌ์์ ๋ฐ์ดํฐ ํธ์ง (
{dataDir}/.aso/push/{slug}/) -
๋ณ๊ฒฝ์ฌํญ ๋ฏธ๋ฆฌ๋ณด๊ธฐ:
{ "app": "myapp", "dryRun": true } -
์ ๋ฐ์ดํธ ๋ฐ์:
{ "app": "myapp" }
#์ฐธ๊ณ
- apps-add - ASO ๋๊ตฌ ์ฌ์ฉ ์ ์ฑ ๋ฑ๋ก
- release-update-notes - ๋ฆด๋ฆฌ์ค ๋ ธํธ๋ง ๋ณ๋ ์ ๋ฐ์ดํธ