#ASO ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™” ๋„๊ตฌ

๋กœ์ปฌ ์บ์‹œ์™€ ์Šคํ† ์–ด ๊ฐ„ ASO(App Store Optimization) ๋ฐ์ดํ„ฐ๋ฅผ ๋™๊ธฐํ™”ํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

#aso-pull

App Store/Google Play์—์„œ ASO ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ๋กœ์ปฌ ์บ์‹œ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

#ํŒŒ๋ผ๋ฏธํ„ฐ

ํŒŒ๋ผ๋ฏธํ„ฐํƒ€์ž…ํ•„์ˆ˜๊ธฐ๋ณธ๊ฐ’์„ค๋ช…
appstring์กฐ๊ฑด๋ถ€-๋“ฑ๋ก๋œ ์•ฑ slug
bundleIdstring์กฐ๊ฑด๋ถ€-App Store ๋ฒˆ๋“ค ID
packageNamestring์กฐ๊ฑด๋ถ€-Google Play ํŒจํ‚ค์ง€๋ช…
store"appStore" | "googlePlay" | "both"์•„๋‹ˆ์˜ค"both"๋Œ€์ƒ ์Šคํ† ์–ด
dryRunboolean์•„๋‹ˆ์˜คfalsetrue์ด๋ฉด ์ €์žฅ ์—†์ด ๊ฒฐ๊ณผ๋งŒ ์ถœ๋ ฅ

์ฐธ๊ณ : 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์— ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.

#ํŒŒ๋ผ๋ฏธํ„ฐ

ํŒŒ๋ผ๋ฏธํ„ฐํƒ€์ž…ํ•„์ˆ˜๊ธฐ๋ณธ๊ฐ’์„ค๋ช…
appstring์กฐ๊ฑด๋ถ€-๋“ฑ๋ก๋œ ์•ฑ slug
bundleIdstring์กฐ๊ฑด๋ถ€-App Store ๋ฒˆ๋“ค ID
packageNamestring์กฐ๊ฑด๋ถ€-Google Play ํŒจํ‚ค์ง€๋ช…
store"appStore" | "googlePlay" | "both"์•„๋‹ˆ์˜ค"both"๋Œ€์ƒ ์Šคํ† ์–ด
uploadImagesboolean์•„๋‹ˆ์˜คfalse์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ์—ฌ๋ถ€
dryRunboolean์•„๋‹ˆ์˜คfalsetrue์ด๋ฉด ๋ฐ˜์˜ ์—†์ด ๊ฒฐ๊ณผ๋งŒ ์ถœ๋ ฅ

#์‚ฌ์šฉ ์˜ˆ์‹œ

// ๋ชจ๋“  ์Šคํ† ์–ด์— ๋ฐ˜์˜
{ "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"]
      }
    }
  }
}

#์›Œํฌํ”Œ๋กœ์šฐ ์˜ˆ์‹œ

  1. ํ˜„์žฌ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ:

    { "app": "myapp" }
    
  2. ๋กœ์ปฌ์—์„œ ๋ฐ์ดํ„ฐ ํŽธ์ง‘ ({dataDir}/.aso/push/{slug}/)

  3. ๋ณ€๊ฒฝ์‚ฌํ•ญ ๋ฏธ๋ฆฌ๋ณด๊ธฐ:

    { "app": "myapp", "dryRun": true }
    
  4. ์—…๋ฐ์ดํŠธ ๋ฐ˜์˜:

    { "app": "myapp" }
    

#์ฐธ๊ณ 

  • apps-add - ASO ๋„๊ตฌ ์‚ฌ์šฉ ์ „ ์•ฑ ๋“ฑ๋ก
  • release-update-notes - ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ๋งŒ ๋ณ„๋„ ์—…๋ฐ์ดํŠธ