防止iOS mobile safari进入空闲/自动锁定/睡眠状态?

问题描述 投票:0回答:9

在 iOS 应用程序中,您可以设置

application.idleTimerDisabled = YES
以防止手机自动锁定。

我需要在移动 Safari 中为 Doodle Jump 这样的游戏执行此操作,其中用户可能会长时间不触摸屏幕。有没有任何记录的方法或黑客可以做到这一点?

(更新) 他们似乎在这个网站上以某种方式这样做http://www.uncoveryourworld.com。通过您的 iPhone 进行访问,当您到达建筑物/街道场景并播放背景音乐时,请不要打扰您的手机。它永远不会睡觉。

(更新2) 我花了一些时间仔细研究他们如何防止手机进入睡眠状态。我做了一个准系统测试,看起来他们在街道场景中循环播放音频的方式是阻止它进入睡眠状态的原因。如果您想测试这一点,只需在页面上放置一个简单的音频播放器,然后单击播放即可:

<audio src="loop.mp3" onended="this.play();" controls="controls" autobuffer></audio>

我搜索的每个地方都说这是不可能的,所以很高兴看到至少有某种方法可以做到这一点,即使有点黑客攻击。否则,基于浏览器的涂鸦跳跃式游戏将不可能实现。因此,如果合适的话,您可以在游戏/应用程序中设置循环,或者只是播放无声循环。

iphone ios mobile-safari
9个回答
14
投票

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 上查看相同的演示(包括秒表)

注释

    避免为此加载大视频。也许制作一个短小、纯黑色的视频或使用
  • 为了使其完全正常工作,视频需要始终位于视口中
  • 或者您需要通过JS开始播放:video.play()
    
    

8
投票
编辑:

此解决方法不再有效。目前无法阻止手机在 Safari 中休眠。

是的,您可以使用音频循环防止手机进入睡眠状态。该技巧不会自动开始,您必须在访客触摸屏幕时播放它。

<audio loop src="http://www.sousound.com/music/healing/healing_01.mp3"></audio>

测试页:点击播放,显示屏将保持打开状态,但在某些设备上会变暗,例如运行 iOS 7 的 iPhone。

注意:使用此技巧时要小心,因为它会停止访问者可能正在使用的任何音乐,并且会惹恼他们。


3
投票
[编辑]随机错误行为,有时锁屏媒体控件显示,有时不显示

几年后,更新了我的代码

简单步骤:

    解锁音频上下文
  • 创造无声的声音
  • 循环播放并永远播放
  • 保持选项卡处于活动状态
在 Safari iOs 15.3.1 上工作,选项卡和浏览器在后台运行,屏幕关闭

// 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
    

2
投票
不,不幸的是,你不能这样做。实现此目的的唯一方法是创建一个 UIWebView 应用程序并设置您在那里提供的变量。


https://stackoverflow.com/a/7477438/267892


0
投票
即使这种方法可能并不适合所有情况,您也可以通过使用 Javascript 重新加载页面来防止手机锁定。

// This will trigger a reload after 30 seconds setTimeout(function(){ self.location = self.location }, 30000);

请注意,我使用 iOS7 beta 3 进行了测试


0
投票
您可以通过假装每 20-30 秒刷新一次来停止睡眠

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 应用程序)中工作。

演示:

http://jsbin.com/kozuzuwaya/1


0
投票
这是基于nicopowa的答案,它使PWA免于被iOS暂停。 (无任何播放的无限循环会使应用程序保持运行 - 即使屏幕关闭。)

为了确保它是由用户交互触发的,

唯一要改变的是而不是

let ctx = null

let ctx = new AudioContext()
    

0
投票
<video src="..." ... playsinline>

标签替换音频标签,

bfred.it 的答案就有效 - 但前提是页面在 iOS10+ Safari 中打开并且用户已启动视频。您可以使用 CSS 隐藏视频。

另外,我怀疑这个功能也会在某个时候被删除。


0
投票
今天,我尝试使用

WakeLock API 来保持 Safari iOS 的运行状态(目前有效)。看起来他们从 2023 年 3 月开始支持 https。请注意,此时 Typescript 似乎没有赶上 Navigator 对 WakeLock 的使用,因此请随意编写扩展或仅使用 @ts-ignore。这是一个反应解决方案,您可能希望使用某种 useEffect 来调用您的函数,除非您打算持久保持 WakeLock 活动状态。

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") } }

© www.soinside.com 2019 - 2024. All rights reserved.