{"id":4307,"date":"2026-02-03T17:10:50","date_gmt":"2026-02-03T09:10:50","guid":{"rendered":"https:\/\/blog.quantoyo.com\/?p=4307"},"modified":"2026-02-03T17:17:51","modified_gmt":"2026-02-03T09:17:51","slug":"%e4%b8%8d%e4%bc%91%e7%9c%a0%e7%9a%84%e7%b6%b2%e9%a0%81","status":"publish","type":"post","link":"https:\/\/blog.quantoyo.com\/?p=4307","title":{"rendered":"\u4e0d\u4f11\u7720\u7684\u7db2\u9801"},"content":{"rendered":"\n<p>\u5c31\u9019\u6a23\u5beb<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>\u6709\u500b\u9650\u5236\u662f\u9700\u8981https<\/p>\n\n\n\n<pre class=\"wp-block-code has-cyan-bluish-gray-background-color has-background has-small-font-size\"><code>&lt;!DOCTYPE html>\n&lt;html lang=\"zh-TW\">\n&lt;head>\n    &lt;meta charset=\"UTF-8\">\n    &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    &lt;title>\u87a2\u5e55\u6046\u4eae\u5de5\u5177&lt;\/title>\n    &lt;style>\n        body {\n            font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n            background-color: #1a1a1a;\n            color: #ffffff;\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n            justify-content: center;\n            height: 100vh;\n            margin: 0;\n            text-align: center;\n        }\n        #status {\n            margin-top: 20px;\n            font-size: 1.2rem;\n            color: #888;\n        }\n        button {\n            padding: 15px 30px;\n            font-size: 1.5rem;\n            border: none;\n            border-radius: 50px;\n            cursor: pointer;\n            transition: all 0.3s ease;\n            font-weight: bold;\n        }\n        .btn-off {\n            background-color: #444;\n            color: #fff;\n        }\n        .btn-on {\n            background-color: #00d26a;\n            color: #000;\n            box-shadow: 0 0 20px rgba(0, 210, 106, 0.6);\n        }\n        \/* \u96b1\u85cf\u7684\u5f71\u7247\u5143\u7d20\uff0c\u4f5c\u70ba\u820a\u7248 iOS \u7684\u5099\u6848 *\/\n        video {\n            position: absolute;\n            top: 0;\n            left: 0;\n            width: 1px;\n            height: 1px;\n            opacity: 0.01;\n            pointer-events: none;\n        }\n    &lt;\/style>\n&lt;\/head>\n&lt;body>\n\n    &lt;button id=\"toggleBtn\" class=\"btn-off\">\u9ede\u64ca\u958b\u555f\u6046\u4eae\u6a21\u5f0f&lt;\/button>\n    &lt;p id=\"status\">\u76ee\u524d\u72c0\u614b\uff1a\u7cfb\u7d71\u9810\u8a2d\u4f11\u7720&lt;\/p>\n\n    &lt;video id=\"dummyVideo\" playsinline muted loop>\n        &lt;source src=\"data:video\/mp4;base64,AAAAHGZ0eXBNNEVAAAAATTRQVXZlcjIAAgACAAAAHmoK\" type=\"video\/mp4\">\n    &lt;\/video>\n\n    &lt;script>\n        let wakeLock = null;\n        const btn = document.getElementById('toggleBtn');\n        const statusText = document.getElementById('status');\n        const video = document.getElementById('dummyVideo');\n\n        \/\/ \u6aa2\u67e5\u700f\u89bd\u5668\u662f\u5426\u652f\u63f4 Wake Lock API\n        const isWakeLockSupported = 'wakeLock' in navigator;\n\n        async function toggleWakeLock() {\n            if (!wakeLock) {\n                \/\/ --- \u5617\u8a66\u958b\u555f\u6046\u4eae ---\n                try {\n                    \/\/ \u65b9\u6cd5 1: \u4f7f\u7528\u539f\u751f Screen Wake Lock API\n                    if (isWakeLockSupported) {\n                        wakeLock = await navigator.wakeLock.request('screen');\n                        \n                        \/\/ \u76e3\u807d\u91cb\u653e\u4e8b\u4ef6\uff08\u4f8b\u5982\u4f7f\u7528\u8005\u5207\u63db\u5206\u9801\u6642\uff09\n                        wakeLock.addEventListener('release', () => {\n                            console.log('Wake Lock \u5df2\u91cb\u653e');\n                            updateUI(false);\n                            wakeLock = null;\n                        });\n                        console.log('Wake Lock \u555f\u7528\u6210\u529f');\n                    } else {\n                        console.log('\u4e0d\u652f\u63f4 Wake Lock API\uff0c\u4f7f\u7528\u5f71\u7247\u5099\u6848');\n                    }\n\n                    \/\/ \u65b9\u6cd5 2: \u5f71\u7247\u5099\u6848 (\u91dd\u5c0d\u820a\u7248 iOS \u6216 API \u5931\u6548\u6642)\n                    \/\/ \u95dc\u9375\uff1a\u5fc5\u9808\u6709 playsinline \u5c6c\u6027\n                    video.play().catch(e => console.error(\"\u5f71\u7247\u64ad\u653e\u5931\u6557:\", e));\n\n                    updateUI(true);\n\n                } catch (err) {\n                    console.error(`${err.name}, ${err.message}`);\n                    statusText.textContent = `\u932f\u8aa4\uff1a${err.message}`;\n                }\n            } else {\n                \/\/ --- \u95dc\u9589\u6046\u4eae ---\n                if (wakeLock) {\n                    await wakeLock.release();\n                    wakeLock = null;\n                }\n                video.pause();\n                updateUI(false);\n            }\n        }\n\n        function updateUI(isOn) {\n            if (isOn) {\n                btn.textContent = \"\u6046\u4eae\u6a21\u5f0f\uff1a\u958b\u555f\u4e2d\";\n                btn.className = \"btn-on\";\n                statusText.textContent = \"\u87a2\u5e55\u5c07\u4fdd\u6301\u958b\u555f\uff0c\u8acb\u52ff\u95dc\u9589\u6b64\u5206\u9801\";\n                statusText.style.color = \"#00d26a\";\n            } else {\n                btn.textContent = \"\u9ede\u64ca\u958b\u555f\u6046\u4eae\u6a21\u5f0f\";\n                btn.className = \"btn-off\";\n                statusText.textContent = \"\u76ee\u524d\u72c0\u614b\uff1a\u7cfb\u7d71\u9810\u8a2d\u4f11\u7720\";\n                statusText.style.color = \"#888\";\n            }\n        }\n\n        \/\/ \u8655\u7406\u9801\u9762\u53ef\u898b\u6027\u8b8a\u5316\n        \/\/ \u7576\u4f7f\u7528\u8005\u5207\u63db\u5230\u5225\u7684 App \u518d\u5207\u56de\u4f86\u6642\uff0cWake Lock \u5e38\u5e38\u6703\u81ea\u52d5\u65b7\u958b\uff0c\u9700\u8981\u91cd\u65b0\u7533\u8acb\n        document.addEventListener('visibilitychange', async () => {\n            if (wakeLock !== null &amp;&amp; document.visibilityState === 'visible') {\n                try {\n                    wakeLock = await navigator.wakeLock.request('screen');\n                    console.log('\u9801\u9762\u6062\u5fa9\u986f\u793a\uff0c\u91cd\u65b0\u7372\u53d6 Wake Lock');\n                } catch(e) {\n                    console.log('\u91cd\u65b0\u7372\u53d6\u5931\u6557', e);\n                }\n            }\n        });\n\n        btn.addEventListener('click', toggleWakeLock);\n    &lt;\/script>\n&lt;\/body>\n&lt;\/html><\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<p>\u9019\u662f iphone 6s \u80fd\u7528\u7684<\/p>\n\n\n\n<pre class=\"wp-block-code has-cyan-bluish-gray-background-color has-background has-small-font-size\"><code>&lt;!DOCTYPE html>\n&lt;html lang=\"zh-TW\">\n&lt;head>\n    &lt;meta charset=\"UTF-8\">\n    &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no\">\n    &lt;title>\u901a\u7528\u7248\u87a2\u5e55\u6046\u4eae&lt;\/title>\n    &lt;style>\n        \/* \u57fa\u790e\u6a23\u5f0f\uff1a\u5168\u9ed1\u80cc\u666f\u7701\u96fb *\/\n        body {\n            font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n            background-color: #000;\n            color: #fff;\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n            justify-content: center;\n            height: 100vh;\n            margin: 0;\n            overflow: hidden;\n            transition: background-color 0.5s;\n        }\n\n        h1 { font-size: 1.5rem; margin-bottom: 10px; }\n        p { color: #888; margin-bottom: 30px; font-size: 0.9rem; }\n\n        \/* \u4e3b\u6309\u9215\u6a23\u5f0f *\/\n        #toggleBtn {\n            position: relative;\n            z-index: 10;\n            padding: 20px 50px;\n            font-size: 1.2rem;\n            border: 2px solid #333;\n            border-radius: 50px;\n            background-color: transparent;\n            color: #fff;\n            cursor: pointer;\n            transition: all 0.3s ease;\n            font-weight: bold;\n            text-transform: uppercase;\n            letter-spacing: 1px;\n            \/* \u9632\u6b62\u624b\u6a5f\u4e0a\u9ede\u64ca\u7e2e\u653e *\/\n            touch-action: manipulation;\n        }\n\n        \/* \u555f\u52d5\u72c0\u614b\u7684\u7279\u6548 *\/\n        body.awake-active {\n            background-color: #050505;\n        }\n        \n        body.awake-active #toggleBtn {\n            background-color: #00ff88;\n            color: #000;\n            border-color: #00ff88;\n            box-shadow: 0 0 40px rgba(0, 255, 136, 0.4);\n            animation: pulse 2s infinite;\n        }\n\n        @keyframes pulse {\n            0% { box-shadow: 0 0 20px rgba(0, 255, 136, 0.4); }\n            50% { box-shadow: 0 0 50px rgba(0, 255, 136, 0.7); }\n            100% { box-shadow: 0 0 20px rgba(0, 255, 136, 0.4); }\n        }\n\n        \/* \u901a\u7528\u7248\u7b56\u7565\uff1a\u96b1\u85cf\u5f71\u7247 \n           1. \u70ba\u4e86\u76f8\u5bb9 iPhone 6S\uff0c\u4e0d\u80fd display:none \u6216 opacity:0\n           2. \u6211\u5011\u628a\u5b83\u653e\u5728\u6309\u9215\u6b63\u5f8c\u65b9 (z-index: 1)\uff0c\u4e14\u5f88\u5c0f\n        *\/\n        #helperVideo {\n            position: absolute;\n            top: 50%;\n            left: 50%;\n            transform: translate(-50%, -50%);\n            width: 10px;\n            height: 10px;\n            opacity: 1; \/* \u5fc5\u9808\u4e0d\u900f\u660e\u624d\u80fd\u9a19\u904e\u820a iOS *\/\n            z-index: 1; \/* \u5728\u6309\u9215\u5f8c\u9762 *\/\n            pointer-events: none;\n        }\n\n        #debug-info {\n            position: fixed;\n            bottom: 20px;\n            font-size: 12px;\n            color: #444;\n            font-family: monospace;\n        }\n    &lt;\/style>\n&lt;\/head>\n&lt;body>\n\n    &lt;h1 id=\"mainTitle\">\u4f11\u7720\u6a21\u5f0f (\u9810\u8a2d)&lt;\/h1>\n    &lt;p id=\"subTitle\">\u9ede\u64ca\u6309\u9215\u4ee5\u4fdd\u6301\u87a2\u5e55\u958b\u555f&lt;\/p>\n\n    &lt;button id=\"toggleBtn\">\u958b\u555f\u6046\u4eae&lt;\/button>\n\n    &lt;video id=\"helperVideo\" playsinline loop muted>\n        &lt;source src=\"data:video\/mp4;base64,AAAAHGZ0eXBNNEVAAAAATTRQVXZlcjIAAgACAAAAHmoK\" type=\"video\/mp4\">\n    &lt;\/video>\n\n    &lt;div id=\"debug-info\">System Ready&lt;\/div>\n\n    &lt;script>\n        const btn = document.getElementById('toggleBtn');\n        const video = document.getElementById('helperVideo');\n        const body = document.body;\n        const title = document.getElementById('mainTitle');\n        const sub = document.getElementById('subTitle');\n        const debug = document.getElementById('debug-info');\n\n        let isKeepingAwake = false;\n        let wakeLock = null;\n        let watchdogInterval = null;\n\n        \/\/ \u6aa2\u67e5\u662f\u5426\u652f\u63f4\u539f\u751f API\n        const hasWakeLock = 'wakeLock' in navigator;\n\n        btn.addEventListener('click', () => {\n            if (!isKeepingAwake) {\n                activate();\n            } else {\n                deactivate();\n            }\n        });\n\n        async function activate() {\n            isKeepingAwake = true;\n            updateUI(true);\n\n            \/\/ \u7b56\u7565 A: \u5617\u8a66\u539f\u751f Wake Lock (Android \/ iOS 16.4+)\n            if (hasWakeLock) {\n                try {\n                    wakeLock = await navigator.wakeLock.request('screen');\n                    log(\"\u539f\u751f WakeLock \u5df2\u555f\u7528\");\n                    \n                    \/\/ \u76e3\u807d\u610f\u5916\u91cb\u653e\n                    wakeLock.addEventListener('release', () => {\n                        log(\"\u539f\u751f WakeLock \u88ab\u91cb\u653e\");\n                        if(isKeepingAwake) log(\"\u5617\u8a66\u91cd\u65b0\u7372\u53d6...\"); \n                    });\n                } catch (err) {\n                    log(\"\u539f\u751f API \u5931\u6557 (\u53ef\u80fd\u662f HTTP \u74b0\u5883): \" + err.name);\n                }\n            }\n\n            \/\/ \u7b56\u7565 B: \u5f71\u7247\u5faa\u74b0 (\u820a iOS \/ \u5099\u6848)\n            try {\n                await video.play();\n                log(\"\u80cc\u666f\u5f71\u7247\u64ad\u653e\u4e2d\");\n            } catch (err) {\n                log(\"\u5f71\u7247\u64ad\u653e\u5931\u6557: \" + err.message);\n            }\n\n            \/\/ \u7b56\u7565 C: \u770b\u9580\u72d7 (Watchdog) - \u6bcf 1.5 \u79d2\u6aa2\u67e5\u4e00\u6b21\n            if (watchdogInterval) clearInterval(watchdogInterval);\n            watchdogInterval = setInterval(() => {\n                \/\/ \u78ba\u4fdd\u5f71\u7247\u5728\u8dd1\n                if (video.paused) {\n                    video.play().catch(() => {});\n                    log(\"Watchdog: \u91cd\u555f\u5f71\u7247\");\n                }\n                \/\/ \u78ba\u4fdd WakeLock \u9084\u5728 (\u5982\u679c\u5728 HTTPS \u74b0\u5883)\n                if (hasWakeLock &amp;&amp; (!wakeLock || wakeLock.released)) {\n                   navigator.wakeLock.request('screen').then(w => wakeLock = w).catch(()=>{});\n                }\n            }, 1500);\n        }\n\n        async function deactivate() {\n            isKeepingAwake = false;\n            updateUI(false);\n\n            \/\/ \u505c\u6b62 API\n            if (wakeLock) {\n                await wakeLock.release();\n                wakeLock = null;\n            }\n\n            \/\/ \u505c\u6b62\u5f71\u7247\n            video.pause();\n\n            \/\/ \u505c\u6b62\u770b\u9580\u72d7\n            if (watchdogInterval) clearInterval(watchdogInterval);\n            log(\"\u5df2\u505c\u6b62\u6240\u6709\u9632\u4f11\u7720\u63aa\u65bd\");\n        }\n\n        function updateUI(active) {\n            if (active) {\n                body.classList.add('awake-active');\n                btn.innerText = \"\u505c\u6b62\u6046\u4eae\";\n                title.innerText = \"\u87a2\u5e55\u4fdd\u6301\u958b\u555f\u4e2d\";\n                sub.innerText = \"\u8acb\u52ff\u95dc\u9589\u6b64\u5206\u9801\";\n            } else {\n                body.classList.remove('awake-active');\n                btn.innerText = \"\u958b\u555f\u6046\u4eae\";\n                title.innerText = \"\u4f11\u7720\u6a21\u5f0f (\u9810\u8a2d)\";\n                sub.innerText = \"\u9ede\u64ca\u6309\u9215\u4ee5\u4fdd\u6301\u87a2\u5e55\u958b\u555f\";\n            }\n        }\n\n        function log(msg) {\n            console.log(msg);\n            \/\/ \u53ea\u986f\u793a\u6700\u5f8c\u4e00\u884c log \u5728\u756b\u9762\u4e0a\u4f9b\u9664\u932f\n            debug.innerText = msg;\n        }\n\n        \/\/ \u9801\u9762\u53ef\u898b\u6027\u8b8a\u5316\u8655\u7406 (\u5207\u63db App \u5f8c\u56de\u4f86)\n        document.addEventListener('visibilitychange', () => {\n            if (document.visibilityState === 'visible' &amp;&amp; isKeepingAwake) {\n                log(\"\u9801\u9762\u6062\u5fa9\uff0c\u91cd\u65b0\u6fc0\u6d3b...\");\n                activate(); \/\/ \u91cd\u65b0\u8dd1\u4e00\u6b21\u6fc0\u6d3b\u6d41\u7a0b\u78ba\u4fdd\u842c\u7121\u4e00\u5931\n            }\n        });\n    &lt;\/script>\n&lt;\/body>\n&lt;\/html><\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u5c31\u9019\u6a23\u5beb<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[299,3],"tags":[717,94,718,716],"class_list":["post-4307","post","type-post","status-publish","format-standard","hentry","category-duty","category-technology","tag-android","tag-ios","tag-navigator-wakelock","tag-716"],"_links":{"self":[{"href":"https:\/\/blog.quantoyo.com\/index.php?rest_route=\/wp\/v2\/posts\/4307","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.quantoyo.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.quantoyo.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.quantoyo.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.quantoyo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4307"}],"version-history":[{"count":3,"href":"https:\/\/blog.quantoyo.com\/index.php?rest_route=\/wp\/v2\/posts\/4307\/revisions"}],"predecessor-version":[{"id":4310,"href":"https:\/\/blog.quantoyo.com\/index.php?rest_route=\/wp\/v2\/posts\/4307\/revisions\/4310"}],"wp:attachment":[{"href":"https:\/\/blog.quantoyo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4307"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.quantoyo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4307"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.quantoyo.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4307"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}