"use client"; import { useEffect, useState } from "react"; import { Download, X } from "lucide-react"; import { Button } from "@/components/ui/button"; interface BeforeInstallPromptEvent extends Event { prompt: () => Promise; userChoice: Promise<{ outcome: "accepted" | "dismissed" }>; } export default function PwaProvider() { const [deferred, setDeferred] = useState( null, ); const [dismissed, setDismissed] = useState(false); const [isIos, setIsIos] = useState(false); const [isStandalone, setIsStandalone] = useState(false); useEffect(() => { if ("serviceWorker" in navigator) { navigator.serviceWorker.register("/sw.js").catch(() => {}); } setIsStandalone( window.matchMedia("(display-mode: standalone)").matches || (window.navigator as Navigator & { standalone?: boolean }).standalone === true, ); const ua = window.navigator.userAgent; setIsIos(/iPad|iPhone|iPod/.test(ua)); const handler = (e: Event) => { e.preventDefault(); setDeferred(e as BeforeInstallPromptEvent); }; window.addEventListener("beforeinstallprompt", handler); return () => window.removeEventListener("beforeinstallprompt", handler); }, []); if (isStandalone || dismissed) { return null; } if (deferred) { return (

安装知命阁

添加到主屏幕,像 App 一样使用

); } if (isIos) { return (

安装到 iPhone / iPad

点击 Safari 底部分享按钮 → 「添加到主屏幕」

); } return null; }