防止 iOS 移动 Safari 闲置/自动锁定/休眠?

Posted

技术标签:

【中文标题】防止 iOS 移动 Safari 闲置/自动锁定/休眠?【英文标题】:Prevent iOS mobile safari from going idle / auto-locking / sleeping? 【发布时间】:2012-03-14 20:36:25 【问题描述】:

ios 应用中,您可以设置 application.idleTimerDisabled = YES 以防止手机自动锁定。

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

(更新) 他们似乎在这个网站http://www.uncoveryourworld.com 上以某种方式做到了这一点。从您的 iPhone 访问,当您到达建筑物/街景并在背景中播放音乐时,请不要理会您的手机。它从不睡觉。

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

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

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

【问题讨论】:

***.com/questions/7477424/…的可能重复 我不知道 application.idleTimerDisabled = YES 用于 iOS 编程(或者当我这样做时它在 iOS3 中不存在),所以我过去每分钟左右播放一次静音.播放之间的延迟应该会增加电池寿命,而不是持续循环。 (但你需要测试它是否仍然保持清醒) 我厌倦了添加音频循环,但手机仍然进入睡眠状态。 这方面有什么更新吗?我希望我的网络应用程序保持“清醒”,而不会总是自动锁定。 这似乎适用于 iOS 和 android:github.com/richtr/NoSleep.js 【参考方案1】:

NoSleep.js 似乎适用于 iOS 11,据报道它也适用于 Android。


旧答案

这是一个简单的纯 html 方法:循环内联自动播放视频(它可能也适用于 Android Chrome 53+)

&lt;video playsinline muted autoplay loop src="https://rawgit.com/bower-media-samples/big-buck-bunny-480p-30s/master/video.mp4" height=60&gt;&lt;/video&gt;

查看相同的演示 on CodePen(包括秒表)

注意事项

避免为此加载大视频。也许制作一个简短、微小、纯黑色的视频或使用 要使其充分发挥作用,视频需要始终在视口中您需要通过 JS 开始播放:video.play()

【讨论】:

哎呀,我在撒谎!我在我的设备上使用 Firefox 作为浏览器对其进行了测试,使用 Safari 可以正常工作。确认在 10.2 上工作? 在运行 iOS 10.2 的 iPhone 5S 上确认 NoSleep.js。 请再次编辑您的答案以提及 NoSleep.js 有效:您的答案以“编辑:此页面上当前的解决方案均不适用于 iOS 10.2+”开头,这是误导性的。 您好,目前有效吗?因为对我来说不是。我在 iOS 12.2 中。谢谢! 不适用于IOS15.1【参考方案2】:

编辑:这种解决方法不再有效。目前无法阻止手机在 Safari 中休眠。

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

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

Test page:点按播放,显示屏会一直亮着,但在某些设备上会变暗,例如装有 iOS 7 的 iPhone。

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

【讨论】:

是否需要整个过程来防止屏幕关闭?哪个部分是关键部分? @eykanal 我清理了它。一个&lt;audio&gt; 标签就足够了。 不应该是循环播放的视频吗?在 Chrome 中观看视频时,Android 绝对不会进入睡眠状态(例如在 YouTube 上,即网站)。 iOS 有吗??【参考方案3】:

不,很遗憾,您不能这样做。实现这一点的唯一方法是制作一个 UIWebView 应用程序并设置您在其中提供的变量。https://***.com/a/7477438/267892

【讨论】:

我添加了一个指向我找到的网站的链接,这似乎是在移动 Safari 中实现的。 您可能想向他们发送电子邮件并询问他们。我没有制作那个网站;)【参考方案4】:

[edit] 随机错误行为,有时显示锁屏媒体控件,有时不显示

多年后,更新了我的代码

简单的步骤:

解锁音频上下文 创造安静的声音 循环播放并一直播放 保持标签页处于活动状态

在 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

【讨论】:

【参考方案5】:

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

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

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

【讨论】:

它适用于 Safari iOS 7.1.2 iOS 8。演示:jsbin.com/nekizeloca/1 但它不适用于 Chrome 和 Facebook 等 WebViews。 我正在 Safari iOS 7.1.2、iPhone 4s 和 iPad 上进行测试,但我也无法让它与这个演示一起工作...... 使用iframe和一遍遍设置iframe的来源怎么样?有点假装重载而不真正重载?【参考方案6】:

您可以通过假装每 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 中测试,但它可能无法在 iOS 版 Chrome 或 Facebook 应用等 UIWebView 浏览器中运行。

演示:http://jsbin.com/kozuzuwaya/1

【讨论】:

它在 iOS 7.1.2 和 iOS 8 上运行良好。试试demo。即使自动锁定计时器为 1 分钟,我的两台设备也会在 4 分钟后唤醒。 演示不适用于 iPad 和 iPhone,iOS 7.1.2。不知道为什么,尊重自动锁定。 这种方法似乎没有什么问题。首先,当当前 URL 中有散列时,这是行不通的。可能是因为更新具有哈希字符串的位置不会触发页面加载。这可以通过使用没有哈希字符串的位置来解决(例如,只有“/”)。这适用于 iOS 8.3,但给我们带来了第二个问题,在 Android 上它显然不起作用,并且似乎当设备进入睡眠状态时,它会在不停止的情况下执行位置更改。 与上面的评论相关,所以我最终使用的是带有location.href = "/"; 的这个解决方案的一个版本,然后只在iOS上执行这个代码(从用户代理检查操作系统),这似乎工作据我测试过。 另外,如果将页面添加到主屏幕,它就不起作用(可能出于同样的原因,它在其他浏览器中不起作用),它只适用于 Safari。【参考方案7】:

如果您将音频标签替换为enter code here -tag,bfred.it 的答案有效 - 但前提是页面在 iOS10+ Safari 中打开并且用户已开始播放视频。您可以使用 CSS 隐藏视频。

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

【讨论】:

以上是关于防止 iOS 移动 Safari 闲置/自动锁定/休眠?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 iOS Safari 输入标签中的自动大写?

MobileSafari(iOS Safari):有没有办法防止水平/垂直滚动“捕捉”?

iOS 9 Web 应用程序阻止在移动 Safari 中打开链接

当用户按下回车键时,是不是有另一种方法可以在移动 Safari(iOS 上)上触发自动更正/自动完成?

键盘和鼠标闲置超时时关闭显示器并锁定电脑桌面的AutoHotkey脚本 2019年11月24日写

为媒体禁用 iOS Safari 锁定屏幕擦除器