在 iOS 应用程序中,您可以设置
application.idleTimerDisabled = YES
以防止手机自动锁定。
我需要在移动 Safari 中为 Doodle Jump 这样的游戏执行此操作,其中用户可能会长时间不触摸屏幕。有没有任何记录的方法或黑客可以做到这一点?
(更新) 他们似乎在这个网站上以某种方式这样做http://www.uncoveryourworld.com。通过您的 iPhone 进行访问,当您到达建筑物/街道场景并播放背景音乐时,请不要打扰您的手机。它永远不会睡觉。
(更新2) 我花了一些时间仔细研究他们如何防止手机进入睡眠状态。我做了一个准系统测试,看起来他们在街道场景中循环播放音频的方式是阻止它进入睡眠状态的原因。如果您想测试这一点,只需在页面上放置一个简单的音频播放器,然后单击播放即可:
<audio src="loop.mp3" onended="this.play();" controls="controls" autobuffer></audio>
我搜索的每个地方都说这是不可能的,所以很高兴看到至少有某种方法可以做到这一点,即使有点黑客攻击。否则,基于浏览器的涂鸦跳跃式游戏将不可能实现。因此,如果合适的话,您可以在游戏/应用程序中设置循环,或者只是播放无声循环。
NoSleep.js 似乎可以在 iOS 11 上运行,据报道它也可以在 Android 上运行。
这是一个简单的纯 HTML 方法:循环内联自动播放视频(它也可能适用于 Android Chrome 53+)
<video playsinline muted autoplay loop src="https://rawgit.com/bower-media-samples/big-buck-bunny-480p-30s/master/video.mp4" height=60></video>
在 CodePen 上查看相同的演示(包括秒表)
注释video.play()
此解决方法不再有效。目前无法阻止手机在 Safari 中休眠。
是的,您可以使用音频循环防止手机进入睡眠状态。该技巧不会自动开始,您必须在访客触摸屏幕时播放它。
<audio loop src="http://www.sousound.com/music/healing/healing_01.mp3"></audio>
测试页:点击播放,显示屏将保持打开状态,但在某些设备上会变暗,例如运行 iOS 7 的 iPhone。
注意:使用此技巧时要小心,因为它会停止访问者可能正在使用的任何音乐,并且会惹恼他们。
几年后,更新了我的代码
简单步骤:
// unlock audio context
let ctx = null;
// create silent sound
let bufferSize = 2 * ctx.sampleRate,
emptyBuffer = ctx.createBuffer(1, bufferSize, ctx.sampleRate),
output = emptyBuffer.getChannelData(0);
// fill buffer
for(let i = 0; i < bufferSize; i++)
output[i] = 0;
// create source node
let source = ctx.createBufferSource();
source.buffer = emptyBuffer;
source.loop = true;
// create destination node
let node = ctx.createMediaStreamDestination();
source.connect(node);
// dummy audio element
let audio = document.createElement("audio");
audio.style.display = "none";
document.body.appendChild(audio);
// set source and play
audio.srcObject = node.stream;
audio.play();
// background exec enabled
// This will trigger a reload after 30 seconds
setTimeout(function(){
self.location = self.location
}, 30000);
请注意,我使用 iOS7 beta 3 进行了测试
和 iOS Safari 中的屏幕变暗
var stayAwake = setInterval(function () {
location.href = location.href; //try refreshing
window.setTimeout(window.stop, 0); //stop it soon after
}, 30000);
请负责任地使用此代码,不要“仅仅因为”而使用它。如果只需要一点,请将其禁用。
clearInterval(stayAwake); //allow device sleep again when not needed
在 Safari iOS 7、7.1.2 和 8.1 中进行了测试,但它可能无法在 UIWebView 浏览器(例如 Chrome for iOS 或 Facebook 应用程序)中工作。
演示:
为了确保它是由用户交互触发的,
唯一要改变的是而不是
let ctx = null
放
let ctx = new AudioContext()
<video src="..." ... playsinline>
标签替换音频标签,
bfred.it 的答案就有效 - 但前提是页面在 iOS10+ Safari 中打开并且用户已启动视频。您可以使用 CSS 隐藏视频。另外,我怀疑这个功能也会在某个时候被删除。
const wakeLockRef = useRef(null)
if (wakeLockRef.current) {
wakeLockRef.current.release()
wakeLockRef.current = null
}
const startWakeLock = () => {
try {
// @ts-ignore
if ("wakeLock" in navigator && navigator.wakeLock.request) {
// @ts-ignore
wakeLockRef.current = await navigator.wakeLock.request("screen")
console.log("Wake Lock is active")
}
} catch (err) {
console.error(`Could not obtain wake lock: ${err.message}`)
}
}
const stopWakeLock = () => {
if (wakeLockRef.current) {
wakeLockRef.current.release()
wakeLockRef.current = null
console.log("Wake Lock has been released")
}
}