Web App Manifest ãæ·±ãçè§£ããŠãProgressive Web App (PWA) ã®å¯èœæ§ãæå€§éã«åŒãåºããŸããããæé©ãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãšçºèŠæ§ãå®çŸããããã® PWA ã®èšå®æ¹æ³ãåŠã³ãŸãã
Web App Manifest: Progressive Web App èšå®ã¬ã€ã
Web App Manifest ã¯ãWeb ã¢ããªã±ãŒã·ã§ã³ã«é¢ããæ å ±ããã©ãŠã¶ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«æäŸãã JSON ãã¡ã€ã«ã§ãããã®æ å ±ã¯ãã¢ããªããŠãŒã¶ãŒã®ããã€ã¹ã«ã€ã³ã¹ããŒã«ãããéã«äœ¿çšãããProgressive Web App (PWA) ãšããŠã©ã®ããã«è¡šç€ºããã³åäœããã®ããå®çŸ©ããŸããWebãµã€ããã€ã³ã¹ããŒã«å¯èœãªã¢ããªã®ãããªãšã¯ã¹ããªãšã³ã¹ã«å€ããéåçãšèããŠãã ãããé©åã«èšå®ããããããã§ã¹ãã¯ããŠãŒã¶ãŒãšã³ã²ãŒãžã¡ã³ããšçºèŠæ§ã«ãšã£ãŠéåžžã«éèŠã§ãã
Progressive Web App (PWA) ãšã¯ïŒ
Web App Manifest ã«ã€ããŠè©³ãã説æããåã«ãPWA ãšã¯äœã§ããããããããããŸããããPWA ã¯ããŠãŒã¶ãŒã«ã¢ããªã®ãããªãšã¯ã¹ããªãšã³ã¹ãæäŸãã Web ã¢ããªã±ãŒã·ã§ã³ã§ããPWA ã¯ä»¥äžã®ç¹åŸŽãæã£ãŠããŸãã
- ä¿¡é Œæ§ïŒãµãŒãã¹ã¯ãŒã«ãŒã®ãããã§ãç¬æã«èªã¿èŸŒãŸãããªãã©ã€ã³ãŸãã¯äœå質ã®ãããã¯ãŒã¯ã§ãåäœããŸãã
- é«éïŒã¹ã ãŒãºãªã¢ãã¡ãŒã·ã§ã³ãšããã¡ãªãã¹ã¯ããŒã«ããªãããŠãŒã¶ãŒã®æäœã«ãã°ããå¿çããŸãã
- é åçïŒããã·ã¥éç¥ãããŒã ç»é¢ãžã®ã€ã³ã¹ããŒã«æ©èœãªã©ãæ²¡å ¥åã®ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããŸãã
Web App Manifest ã®åœ¹å²
Web App Manifest 㯠PWA ã®èŠã§ãããã©ãŠã¶ã«æ¬¡ã®æ å ±ãæäŸããŸãã
- PWA ã®ã€ã³ã¹ããŒã«ïŒãŠãŒã¶ãŒãããã€ã¹ã« Web ã¢ããªãã€ã³ã¹ããŒã«ã§ããããã«ããããŒã ç»é¢ãŸãã¯ã¢ããªã©ã³ãã£ãŒã«è¿œå ããŸãã
- PWA ã®æ£ãã衚瀺ïŒã¢ããªã®ååãã¢ã€ã³ã³ãããŒãã«ã©ãŒããã®ä»ã®èŠèŠçãªåŽé¢ãå®çŸ©ããŸãã
- PWA ã®åäœã®å¶åŸ¡ïŒã¢ããªã®èµ·åæ¹æ³ïŒäŸïŒãã«ã¹ã¯ãªãŒã³ã¢ãŒããŸãã¯ã¹ã¿ã³ãã¢ãã³ãŠã£ã³ããŠïŒãããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãšã®çµ±åæ¹æ³ãæå®ããŸãã
`manifest.json` ãã¡ã€ã«ã®äœæ
Web App Manifest 㯠JSON ãã¡ã€ã«ã§ãé垞㯠`manifest.json` ãšããååã§ããWeb ã¢ããªã±ãŒã·ã§ã³ã®ã«ãŒããã£ã¬ã¯ããªã«é 眮ããå¿ èŠããããŸããåºæ¬çãªäŸã次ã«ç€ºããŸãã
{
"name": "My Awesome PWA",
"short_name": "Awesome PWA",
"start_url": "/",
"display": "standalone",
"background_color": "#ffffff",
"theme_color": "#000000",
"icons": [
{
"src": "/icons/icon-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/icons/icon-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
]
}
ãããã®åããããã£ãèŠãŠãããŸãããã
`name`
Web ã¢ããªã±ãŒã·ã§ã³ã®ãã«ããŒã ããã®ååã¯ãã¢ããªã®ã€ã³ã¹ããŒã«ãä¿ãã¡ãã»ãŒãžãã¢ããªã©ã³ãã£ãŒã«è¡šç€ºãããŸãã
äŸïŒ
"name": "Global News App"
`short_name`
ã¢ããªã®çãååã§ãããŒã ç»é¢ãã¢ããªã©ã³ãã£ãŒãªã©ãã¹ããŒã¹ãéãããŠããå Žåã«äœ¿çšãããŸããç°¡æœã«ããŠãã ããã
äŸïŒ
"short_name": "Global News"
`start_url`
ã¢ããªã®èµ·åæã«èªã¿èŸŒãŸãã URL ã§ããé垞㯠Web ã¢ããªã±ãŒã·ã§ã³ã®ããŒã ããŒãžã§ãããç¹å®ã®ã©ã³ãã£ã³ã°ããŒãžã«ããããšãã§ããŸãã
äŸïŒ
"start_url": "/"
ã¯ãšãªãã©ã¡ãŒã¿ã䜿çšããŠããŠãŒã¶ãŒãã©ã®ããã« PWA ãèµ·åããŠãããã远跡ããããšãã§ããŸãã
"start_url": "/?utm_source=homescreen"
`display`
èµ·åæã®ã¢ããªã®è¡šç€ºæ¹æ³ãå®çŸ©ããŸããããã€ãã®ãªãã·ã§ã³ããããŸãã
- `standalone`ïŒã¢ããªã¯ãã¢ãã¬ã¹ããŒãªã©ã®ãã©ãŠã¶ UI èŠçŽ ã®ãªãç¬èªã®ãããã¬ãã«ãŠã£ã³ããŠã§éããŸãã
- `fullscreen`ïŒã¢ããªã¯ç»é¢å šäœãå ããã¹ããŒã¿ã¹ããŒãé衚瀺ã«ãªããŸãã
- `minimal-ui`ïŒ`standalone` ãšäŒŒãŠããŸãããæ»ããã¿ã³ãæŽæ°ãã¿ã³ãªã©ãæå°éã®ãã©ãŠã¶ UI ãæäŸãããŸãã
- `browser`ïŒã¢ããªã¯éåžžã®ãã©ãŠã¶ã¿ããŸãã¯ãŠã£ã³ããŠã§éããŸãã
æšå¥šäºé ïŒ PWA ã«ã¯ãéåžž `standalone` ãæé©ãªãªãã·ã§ã³ã§ãã
äŸïŒ
"display": "standalone"
`background_color`
ã¢ããªã®èµ·åæã®ã¹ãã©ãã·ã¥ã¹ã¯ãªãŒã³ã®èæ¯è²ã§ããã¢ããªã®ã¢ã€ã³ã³ãšã¢ããªã®ã³ã³ãã³ãéã®ã·ãŒã ã¬ã¹ãªãã©ã³ãžã·ã§ã³ãæäŸããããã«éèŠã§ãã
äŸïŒ
"background_color": "#ffffff"
`theme_color`
Android ã®ã¹ããŒã¿ã¹ããŒãªã©ãã¢ããªã® UI ã®ã¹ã¿ã€ãªã³ã°ã«äœ¿çšãããããŒãã«ã©ãŒã§ãããã®è²ã¯ãã¢ããªã®ãã©ã³ãã£ã³ã°ãšäžèŽããŠããå¿ èŠããããŸãã
äŸïŒ
"theme_color": "#000000"
`icons`
ã¢ããªã®ã¢ã€ã³ã³ããããã衚ããªããžã§ã¯ãã®é åã§ããããŸããŸãªããã€ã¹ãè§£å床ã§ã¢ããªãé©åã«è¡šç€ºãããããã«ãããŸããŸãªãµã€ãºã®è€æ°ã®ã¢ã€ã³ã³ãæäŸããå¿ èŠããããŸãã
åã¢ã€ã³ã³ã®ããããã£ïŒ
- `src`ïŒã¢ã€ã³ã³ç»åã® URLã
- `sizes`ïŒã¢ã€ã³ã³ã®å¯žæ³ïŒãã¯ã»ã«åäœïŒïŒäŸïŒ"192x192"ïŒã
- `type`ïŒã¢ã€ã³ã³ç»åã® MIME ã¿ã€ãïŒäŸïŒ"image/png"ïŒã
æšå¥šã¢ã€ã³ã³ãµã€ãºïŒ
- 48x48
- 72x72
- 96x96
- 144x144
- 192x192
- 512x512
äŸïŒ
"icons": [
{
"src": "/icons/icon-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/icons/icon-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
]
ãã®ä»ã®ãããã§ã¹ãããããã£
äžèšã®ããããã£ãæãäžè¬çã§ãããWeb App Manifest 㯠PWA ãæ§æããããã®ä»ã®å€ãã®ãªãã·ã§ã³ããµããŒãããŠããŸãã
`id`
PWA ã®äžæã®èå¥åã§ããåãååã®è€æ°ã® PWA ãããå Žåã«ç«¶åãåé¿ããããã«éèŠã§ãã
äŸïŒ
"id": "com.example.myapp"
`scope`
ã¢ããªã®ããã²ãŒã·ã§ã³ã¹ã³ãŒããå®çŸ©ããŸããããã«ãããWebãµã€ãå ã®ã©ã® URL ã PWA ã®äžéšãšèŠãªãããããæ±ºå®ãããŸãããŠãŒã¶ãŒãã¹ã³ãŒãå€ã«ç§»åãããšãã¢ããªã¯éåžžã®ãã©ãŠã¶ã¿ãã§éããŸãã
äŸïŒ
"scope": "/app/"
ãã®äŸã§ã¯ã`/app/` ã§å§ãŸã URL ã®ã¿ã PWA ã®äžéšãšèŠãªãããŸãã
`orientation`
ã¢ããªã®åªå ç»é¢ã®åããæå®ããŸãããªãã·ã§ã³ã«ã¯ã`portrait`ã`landscape`ã`any` ãªã©ããããŸãã
äŸïŒ
"orientation": "portrait"
`related_applications`
é¢é£ãããã€ãã£ãã¢ããªã±ãŒã·ã§ã³ãå®çŸ©ãããªããžã§ã¯ãã®é åã§ããããã«ãããPWA ãæ¢ã«ã€ã³ã¹ããŒã«ããŠãããŠãŒã¶ãŒã«ãã€ãã£ãã¢ããªã宣äŒã§ããŸãã
äŸïŒ
"related_applications": [
{
"platform": "play",
"id": "com.example.myapp"
}
]
ãã®äŸã¯ãGoogle Play ã¹ãã¢ã« `com.example.myapp` ãšãã ID ã®é¢é£ãã€ãã£ãã¢ããªãããããšã瀺ããŠããŸãã
`prefer_related_applications`
ãŠãŒã¶ãŒã PWA ã§ã¯ãªããé¢é£ãããã€ãã£ãã¢ããªã±ãŒã·ã§ã³ãã€ã³ã¹ããŒã«ããããã«ä¿ããã©ããã瀺ãããŒã«å€ã
äŸïŒ
"prefer_related_applications": true
`categories`
ã¢ããªã®ã«ããŽãªã衚ãæååã®é åã§ããããã«ããããŠãŒã¶ãŒãã¢ããªã¹ãã¢ãŸãã¯æ€çŽ¢çµæã§ã¢ããªãèŠã€ããã®ã«åœ¹ç«ã¡ãŸãã
äŸïŒ
"categories": ["news", "information"]
`shortcuts`
ãŠãŒã¶ãŒãããŒã ç»é¢ã®ã¢ããªã¢ã€ã³ã³ããã¢ã¯ã»ã¹ã§ããã·ã§ãŒãã«ããã®ãªã¹ããå®çŸ©ããŸããããã«ããããŠãŒã¶ãŒã¯ã¢ããªå ã§äžè¬çãªã¿ã¹ã¯ããã°ããå®è¡ã§ããŸãã
äŸïŒ
"shortcuts": [
{
"name": "Latest News",
"short_name": "News",
"description": "Read the latest news articles",
"url": "/news",
"icons": [{
"src": "/icons/news.png",
"sizes": "192x192",
"type": "image/png"
}]
}
]
Web ã¢ããªãžã®ãããã§ã¹ãã®ãªã³ã¯
`manifest.json` ãã¡ã€ã«ãäœæããããHTML ã® `
` ã»ã¯ã·ã§ã³ã« `` ã¿ã°ã远å ããŠãWeb ã¢ããªã±ãŒã·ã§ã³ã«ãªã³ã¯ããå¿ èŠããããŸãã
<link rel="manifest" href="/manifest.json">
ãããã§ã¹ãã®æ€èšŒ
`manifest.json` ãã¡ã€ã«ãæ£ãããã©ãŒããããããŠãããå¿ èŠãªãã¹ãŠã®ããããã£ãå«ãŸããŠããããšã確èªããããã«ãæ€èšŒããããšãéèŠã§ãã JSONLint ã Chrome DevTools ãªã©ã®ãªã³ã©ã€ã³ããŒã«ã䜿çšããŠããããã§ã¹ããæ€èšŒã§ããŸãã
PWA ã®ãã¹ã
ãããã§ã¹ããäœæããŠãªã³ã¯ããããããŸããŸãªãã©ãŠã¶ãããã€ã¹ã§ PWA ããã¹ãããŠãæåŸ ã©ããã«åäœããããšã確èªããå¿ èŠããããŸããChrome DevToolsïŒApplication -> ManifestïŒã䜿çšããŠããããã§ã¹ããæ€æ»ããåé¡ã蚺æããŸãã
Web App Manifest èšå®ã®ãã¹ããã©ã¯ãã£ã¹
Web App Manifest ãæ§æããéã«çæãã¹ããã¹ããã©ã¯ãã£ã¹ã次ã«ç€ºããŸãã
- å¿ èŠãªãã¹ãŠã®ããããã£ãæäŸããïŒ `name`ã`short_name`ã`start_url`ã`display`ã`background_color`ã`theme_color`ã`icons` ãªã©ã®å¿ é ããããã£ããã¹ãŠå«ããŠããããšã確èªããŸãã
- é©åãªã¢ã€ã³ã³ãµã€ãºã䜿çšããïŒ ããŸããŸãªããã€ã¹ãè§£å床ããµããŒãããããã«ãããŸããŸãªãµã€ãºã®è€æ°ã®ã¢ã€ã³ã³ãæäŸããŸãã
- é©åãªè¡šç€ºã¢ãŒããéžæããïŒ ã¢ããªã®ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã«æé©ãª `display` ã¢ãŒããéžæããŸããé垞㯠`standalone` ãæé©ãªãªãã·ã§ã³ã§ãã
- ãããã§ã¹ããæ€èšŒããïŒ `manifest.json` ãã¡ã€ã«ãæ£ãããã©ãŒããããããŠããããšã確èªããããã«ãåžžã«æ€èšŒããŸãã
- PWA ããã¹ãããïŒ ããŸããŸãªãã©ãŠã¶ãããã€ã¹ã§ PWA ããã¹ãããŠãæåŸ ã©ããã«åäœããããšã確èªããŸãã
- SEO ã«æé©åããïŒ `name`ã`short_name`ã`description` ã«é¢é£ããŒã¯ãŒãã䜿çšããŠãã¢ããªã®çºèŠæ§ãåäžãããŸãã
- ããŒã«ã©ã€ãŒãŒã·ã§ã³ãæ€èšããïŒ ã¢ããªãã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã察象ãšããŠããå Žåã¯ãããŸããŸãªèšèªã®ããŸããŸãªååã説æãã¢ã€ã³ã³ã䜿çšããŠããããã§ã¹ãã®ããŒã«ã©ã€ãºãããããŒãžã§ã³ãæäŸããããšãæ€èšããŠãã ããã
é©åã«æ§æããã Web App Manifest ã®äŸ
人æ°ã®ãã PWA ããã®ãé©åã«æ§æããã Web App Manifest ã®äŸãããã€ã瀺ããŸãã
Twitter Lite
{
"name": "Twitter Lite",
"short_name": "Twitter",
"icons": [
{
"src": "/static/icons/mstile-150x150.png",
"sizes": "150x150",
"type": "image/png"
},
{
"src": "/static/icons/twitter-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/static/icons/twitter-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
],
"start_url": "/",
"display": "standalone",
"background_color": "#ffffff",
"theme_color": "#1da1f2",
"description": "Twitter Lite is a faster, data-friendly way to see what's happening in the world.",
"orientation": "portrait"
}
Starbucks
{
"name": "Starbucks",
"short_name": "Starbucks",
"icons": [
{
"src": "/static/icons/starbucks-icon-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/static/icons/starbucks-icon-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
],
"start_url": "/",
"display": "standalone",
"background_color": "#f2f0eb",
"theme_color": "#00704a",
"description": "Order your favorite Starbucks drinks and food with the app.",
"orientation": "portrait",
"shortcuts": [
{
"name": "Order Now",
"short_name": "Order",
"description": "Start a new order",
"url": "/order",
"icons": [{
"src": "/static/icons/order-icon.png",
"sizes": "192x192",
"type": "image/png"
}]
}
]
}
Web App Manifest ã®å°æ¥
Web App Manifest ã¯é²åãç¶ããæšæºã§ãããæ°ããæ©èœãšæ©èœãéæè¿œå ãããŠããŸããPWA ãææ°ã®ãã¯ãããžãŒãæå€§éã«æŽ»çšããŠããããšã確èªããããã«ãW3C ããã®ææ°ã®æŽæ°æ å ±ãšæšå¥šäºé ã«æ³šæããŠãã ããã
çµè«
Web App Manifest ã¯ããã¹ãŠã® PWA ã®äžå¯æ¬ ãªã³ã³ããŒãã³ãã§ãããããã§ã¹ããé©åã«æ§æããããšã«ãããã·ãŒã ã¬ã¹ã§é åçãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããWeb ã¢ããªããã€ãã£ãã¢ããªã±ãŒã·ã§ã³ã®ããã«æããããšãã§ããŸãããã®ã¬ã€ãã§ã¯ãWeb App Manifest ã®ããããã£ããã¹ããã©ã¯ãã£ã¹ãäŸãªã©ãWeb App Manifest ã®å æ¬çãªæŠèŠã瀺ããŸããããããã®ã¬ã€ãã©ã€ã³ã«åŸãããšã§ãPWA ã®å¯èœæ§ãæå€§éã«åŒãåºããäžçäžã®ãŠãŒã¶ãŒã«åªãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸã§ããŸãã
Web App Manifest ã®åãæŽ»çšããWebãµã€ããã€ã³ã¹ããŒã«å¯èœãªã¢ããªã®ãããªãšã¯ã¹ããªãšã³ã¹ã«å€ããŠããŠãŒã¶ãŒãåã°ãããšã³ã²ãŒãžã¡ã³ããä¿é²ããŠãã ããã