feat: Android 폰·태블릿 다운로드·앱 내 업데이트 완료
CI에서 APK 버전 자동 bump, 앱 복귀 시 업데이트 확인·시스템 다운로드, 프론트 Android 전용 UI 정리(iPad는 향후). Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -107,12 +107,15 @@ const MobileTab: React.FC = () => {
|
||||
<div className="app-download-hero">
|
||||
<div className="app-download-app-icon" aria-hidden>GC</div>
|
||||
<div>
|
||||
<h3 className="app-download-app-name">GoldenChart Mobile</h3>
|
||||
<h3 className="app-download-app-name">GoldenChart Android</h3>
|
||||
<p className="app-download-meta">
|
||||
{info.version && <span>v{info.version}</span>}
|
||||
{info.sizeBytes != null && <span>{formatBytes(info.sizeBytes)}</span>}
|
||||
{info.updatedAt && <span>{info.updatedAt}</span>}
|
||||
</p>
|
||||
<p className="app-download-muted" style={{ marginTop: 4, fontSize: 12 }}>
|
||||
휴대폰·태블릿(패드) 동일 APK
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -123,7 +126,7 @@ const MobileTab: React.FC = () => {
|
||||
<div className="app-download-qr app-download-qr--placeholder">QR 생성 중…</div>
|
||||
)}
|
||||
<div className="app-download-qr-help">
|
||||
<strong>휴대폰 카메라로 QR 스캔</strong>
|
||||
<strong>휴대폰·태블릿 카메라로 QR 스캔</strong>
|
||||
<p>Android에서 APK 다운로드 페이지가 열립니다. 다운로드 후 설치하세요.</p>
|
||||
<p className="app-download-muted app-download-url" title={downloadUrl}>{downloadUrl}</p>
|
||||
</div>
|
||||
@@ -138,23 +141,20 @@ const MobileTab: React.FC = () => {
|
||||
</button>
|
||||
|
||||
<details className="app-download-steps">
|
||||
<summary>설치 방법 (Android)</summary>
|
||||
<summary>설치 방법 (Android · 패드·폰)</summary>
|
||||
<ol>
|
||||
<li>QR 코드를 스캔하거나 위 버튼으로 APK를 다운로드합니다.</li>
|
||||
<li>「출처를 알 수 없는 앱」 설치 허용이 필요할 수 있습니다.</li>
|
||||
<li>다운로드 완료 후 APK 파일을 탭하여 설치합니다.</li>
|
||||
<li>앱 실행 후 설정 → 「업데이트 확인」으로 새 버전을 받을 수 있습니다.</li>
|
||||
</ol>
|
||||
</details>
|
||||
|
||||
<p className="app-download-ios-note">
|
||||
iPad는 PC 프로그램 탭의 TestFlight 링크를 이용하세요. 이 탭의 QR·APK는 Android 전용입니다.
|
||||
</p>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
const PlatformCard: React.FC<{
|
||||
platform: 'mac' | 'windows' | 'android' | 'ipad';
|
||||
platform: 'mac' | 'windows' | 'android';
|
||||
release?: DesktopAppPlatformReleaseDto;
|
||||
mobile?: MobileAppReleaseInfoDto | null;
|
||||
}> = ({ platform, release, mobile }) => {
|
||||
@@ -162,7 +162,6 @@ const PlatformCard: React.FC<{
|
||||
mac: { label: 'macOS (Apple Silicon · Intel)', icon: '🍎', ext: '.dmg', isLink: false },
|
||||
windows: { label: 'Windows (64-bit)', icon: '🪟', ext: '.exe', isLink: false },
|
||||
android: { label: 'Android (패드 · 폰)', icon: '🤖', ext: '.apk', isLink: false },
|
||||
ipad: { label: 'iPad (TestFlight)', icon: '📱', ext: '', isLink: true },
|
||||
} as const;
|
||||
const { label, icon, ext } = configs[platform];
|
||||
|
||||
@@ -203,43 +202,6 @@ const PlatformCard: React.FC<{
|
||||
);
|
||||
}
|
||||
|
||||
if (platform === 'ipad') {
|
||||
const testFlightUrl = mobile?.iosTestFlightUrl?.trim();
|
||||
if (!mobile?.iosAvailable || !testFlightUrl) {
|
||||
return (
|
||||
<div className="app-download-pc-card app-download-pc-card--empty">
|
||||
<div className="app-download-pc-icon" aria-hidden>{icon}</div>
|
||||
<div>
|
||||
<strong>{label}</strong>
|
||||
<p className="app-download-muted">TestFlight 링크 준비 중</p>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
return (
|
||||
<div className="app-download-pc-card">
|
||||
<div className="app-download-pc-icon" aria-hidden>{icon}</div>
|
||||
<div className="app-download-pc-body">
|
||||
<strong>{label}</strong>
|
||||
<p className="app-download-meta">
|
||||
<span>TestFlight 베타</span>
|
||||
</p>
|
||||
<p className="app-download-muted app-download-url" title={testFlightUrl}>
|
||||
Apple TestFlight 초대 링크
|
||||
</p>
|
||||
</div>
|
||||
<a
|
||||
href={testFlightUrl}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="app-download-pc-btn app-download-pc-btn--link"
|
||||
>
|
||||
TestFlight 열기
|
||||
</a>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
if (!release?.available || !release.downloadUrl) {
|
||||
return (
|
||||
<div className="app-download-pc-card app-download-pc-card--empty">
|
||||
@@ -471,8 +433,7 @@ const DesktopTab: React.FC<{ canBuildDesktop: boolean }> = ({ canBuildDesktop })
|
||||
}
|
||||
}, [canBuildDesktop, buildBusy, isBuilding, reloadBuildStatus]);
|
||||
|
||||
const hasAny = info?.mac?.available || info?.windows?.available
|
||||
|| mobileInfo?.available || mobileInfo?.iosAvailable;
|
||||
const hasAny = info?.mac?.available || info?.windows?.available || mobileInfo?.available;
|
||||
|
||||
if (loading) return <p className="app-download-muted">PC 프로그램 정보 불러오는 중…</p>;
|
||||
if (error) return <p className="app-download-error">{error}</p>;
|
||||
@@ -534,7 +495,7 @@ const DesktopTab: React.FC<{ canBuildDesktop: boolean }> = ({ canBuildDesktop })
|
||||
<div className="app-download-empty-icon" aria-hidden>💻</div>
|
||||
<h3>설치 파일 준비 중</h3>
|
||||
<p>
|
||||
macOS(.dmg), Windows(.exe), Android(.apk) 또는 iPad TestFlight 링크가 아직 준비되지 않았습니다.
|
||||
macOS(.dmg), Windows(.exe) 또는 Android(.apk)가 아직 준비되지 않았습니다.
|
||||
<br />
|
||||
{canBuildDesktop
|
||||
? '우측 상단 「앱 빌드」 버튼으로 Jenkins 빌드를 시작하세요.'
|
||||
@@ -554,7 +515,6 @@ const DesktopTab: React.FC<{ canBuildDesktop: boolean }> = ({ canBuildDesktop })
|
||||
<PlatformCard platform="mac" release={info?.mac} />
|
||||
<PlatformCard platform="windows" release={info?.windows} />
|
||||
<PlatformCard platform="android" mobile={mobileInfo} />
|
||||
<PlatformCard platform="ipad" mobile={mobileInfo} />
|
||||
</div>
|
||||
)}
|
||||
|
||||
@@ -573,9 +533,8 @@ const DesktopTab: React.FC<{ canBuildDesktop: boolean }> = ({ canBuildDesktop })
|
||||
</li>
|
||||
<li><strong>Windows</strong>: setup.exe를 실행하고 안내에 따라 설치합니다.</li>
|
||||
<li><strong>Android (패드·폰)</strong>: APK를 다운로드한 뒤 설치합니다. 패드와 폰은 동일 APK입니다.</li>
|
||||
<li><strong>iPad</strong>: TestFlight 링크로 베타 앱을 설치합니다 (App Store 정책상 ipa 직접 다운로드 불가).</li>
|
||||
<li>설치된 PC 앱은 메뉴 우측 상단 <strong>업데이트</strong> 버튼으로 자동 업데이트할 수 있습니다.</li>
|
||||
<li>Android 앱은 시작 시 또는 설정에서 새 APK 버전을 안내합니다.</li>
|
||||
<li>Android 앱은 시작·복귀 시 또는 설정 → <strong>업데이트 확인</strong>으로 새 APK를 안내합니다.</li>
|
||||
<li>빌드는 Git <code>main</code> 최신 커밋 기준이며, 완료 후 설치 파일이 자동으로 배포됩니다.</li>
|
||||
</ol>
|
||||
</details>
|
||||
|
||||
Reference in New Issue
Block a user