From b343565bc1434c2ae1d0a18b084531924c5c2aae Mon Sep 17 00:00:00 2001 From: chpark Date: Tue, 12 May 2026 23:19:42 +0900 Subject: [PATCH] =?UTF-8?q?feat(pwa):=20PWA=20+=20TWA=20=ED=99=94=20(Andro?= =?UTF-8?q?id=20APK=20=EB=B9=8C=EB=93=9C=20=EB=8C=80=EB=B9=84)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - public/manifest.json + service worker(sw.js) 추가 - icon PNG 변환 (192/512/180) - public/.well-known/assetlinks.json placeholder (Bubblewrap 빌드 후 APK 서명 SHA256 채울 자리) - layout.tsx 에 manifest/theme-color/apple-touch-icon 메타데이터 + 서비스 워커 등록 스크립트 추가 Bubblewrap 으로 APK 빌드 시 https://www.momotogether.com/manifest.json 을 source 로 사용. Co-Authored-By: Claude Opus 4.7 (1M context) --- public/.well-known/assetlinks.json | 10 ++++++++ public/icon-180.png | Bin 0 -> 5583 bytes public/icon-192.png | Bin 0 -> 5975 bytes public/icon-512.png | Bin 0 -> 19273 bytes public/manifest.json | 38 +++++++++++++++++++++++++++++ public/sw.js | 27 ++++++++++++++++++++ src/app/layout.tsx | 36 +++++++++++++++++++++++++-- 7 files changed, 109 insertions(+), 2 deletions(-) create mode 100644 public/.well-known/assetlinks.json create mode 100644 public/icon-180.png create mode 100644 public/icon-192.png create mode 100644 public/icon-512.png create mode 100644 public/manifest.json create mode 100644 public/sw.js diff --git a/public/.well-known/assetlinks.json b/public/.well-known/assetlinks.json new file mode 100644 index 0000000..915778b --- /dev/null +++ b/public/.well-known/assetlinks.json @@ -0,0 +1,10 @@ +[ + { + "relation": ["delegate_permission/common.handle_all_urls"], + "target": { + "namespace": "android_app", + "package_name": "com.momotogether.erp", + "sha256_cert_fingerprints": ["REPLACE_WITH_APK_SHA256_AFTER_BUILD"] + } + } +] diff --git a/public/icon-180.png b/public/icon-180.png new file mode 100644 index 0000000000000000000000000000000000000000..b4f42e049ac1ce20de3365005bbf2cce40c64459 GIT binary patch literal 5583 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 literal 0 HcmV?d00001 diff --git a/public/icon-512.png b/public/icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..1a02a06440994658d433b89ad1709394d8aeec1a GIT binary patch literal 19273 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 literal 0 HcmV?d00001 diff --git a/public/manifest.json b/public/manifest.json new file mode 100644 index 0000000..f752f7b --- /dev/null +++ b/public/manifest.json @@ -0,0 +1,38 @@ +{ + "name": "모모유통 ERP", + "short_name": "모모ERP", + "description": "모모유통 유통관리 ERP", + "start_url": "/", + "scope": "/", + "display": "standalone", + "orientation": "portrait", + "background_color": "#ffffff", + "theme_color": "#1f2937", + "lang": "ko", + "icons": [ + { + "src": "/icon-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "any" + }, + { + "src": "/icon-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "any" + }, + { + "src": "/icon-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "/icon-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/public/sw.js b/public/sw.js new file mode 100644 index 0000000..b46112e --- /dev/null +++ b/public/sw.js @@ -0,0 +1,27 @@ +// 모모유통 ERP — Service Worker (PWA install criteria 충족용) +const CACHE = 'momo-erp-v1'; +const PRECACHE = ['/', '/manifest.json', '/icon-192.png', '/icon-512.png']; + +self.addEventListener('install', (e) => { + e.waitUntil(caches.open(CACHE).then((c) => c.addAll(PRECACHE)).catch(() => {})); + self.skipWaiting(); +}); + +self.addEventListener('activate', (e) => { + e.waitUntil( + caches.keys().then((keys) => + Promise.all(keys.filter((k) => k !== CACHE).map((k) => caches.delete(k))) + ) + ); + self.clients.claim(); +}); + +// API 요청은 항상 네트워크 (캐시 안 함). 정적 자원만 캐시. +self.addEventListener('fetch', (e) => { + const url = new URL(e.request.url); + if (url.pathname.startsWith('/api/')) return; + if (e.request.method !== 'GET') return; + e.respondWith( + fetch(e.request).catch(() => caches.match(e.request)) + ); +}); diff --git a/src/app/layout.tsx b/src/app/layout.tsx index df221f9..2074d27 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,9 +1,32 @@ -import type { Metadata } from "next"; +import type { Metadata, Viewport } from "next"; +import Script from "next/script"; import "./globals.css"; export const metadata: Metadata = { title: "모모유통 | 유통관리 ERP", description: "모모유통 유통관리 ERP", + manifest: "/manifest.json", + applicationName: "모모유통 ERP", + appleWebApp: { + capable: true, + title: "모모ERP", + statusBarStyle: "default", + }, + icons: { + icon: [ + { url: "/icon-192.png", sizes: "192x192", type: "image/png" }, + { url: "/icon-512.png", sizes: "512x512", type: "image/png" }, + ], + apple: [{ url: "/icon-180.png", sizes: "180x180", type: "image/png" }], + }, +}; + +export const viewport: Viewport = { + themeColor: "#1f2937", + width: "device-width", + initialScale: 1, + maximumScale: 1, + userScalable: false, }; export default function RootLayout({ @@ -19,7 +42,16 @@ export default function RootLayout({ href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css" /> - {children} + + {children} + + ); }