当前位置: 首页 > 知识库问答 >
问题:

适用于 iOS 12 Safari 的私密/隐身模式检测

訾高飞
2023-03-14

似乎在iOS 11和相应的Safari版本中有效的旧检测方法不再有效了。< br >我试过这个脚本:https://gist.github.com/cou929/7973956
,但它在iOS 12上的safari上不工作,在iOS 12上的Chrome 69上也不工作。

这个相当新的库也不适用于iOS 12浏览器:< br > https://github . com/may konn/js-detect-incognito-private-browsing-pay wall

那么iOS 12浏览器有什么解决方案吗?

BostonGlobe似乎有一个解决方案,但我不知道他们是如何做到的:< br > https://www . BostonGlobe . com/sports/redsox/2018/10/09/redsox/d66j 59 viz 1 qxyzlhi 18 l 8 l/story . html(如果你想以匿名/私人模式阅读bostonglobe.com的文章,你会看到一个要求你登录的屏幕)

共有2个答案

易瀚漠
2023-03-14
//FOR IOS 12
var e = false;
if (window.localStorage && /Safari/.test(window.navigator.userAgent)) {
  if (window.safariIncognito) {
    e = true;
  } else {
    try {
      window.openDatabase(null, null, null, null);
      window.localStorage.setItem("test", 1)
    } catch (t) {
      e = true;
      alert("PRIVATE");
    }
  }
  void !e && (e = !1, window.localStorage.removeItem("test"))
}
卓麒
2023-03-14

Chrome开发工具=

// ./~/detect-private-browsing/index.js

function retry(isDone, next) {
    var current_trial = 0, max_retry = 50, interval = 10, is_timeout = false;
    var id = window.setInterval(
        function() {
            if (isDone()) {
                window.clearInterval(id);
                next(is_timeout);
            }
            if (current_trial++ > max_retry) {
                window.clearInterval(id);
                is_timeout = true;
                next(is_timeout);
            }
        },
        10
    );
}

function isIE10OrLater(user_agent) {
    var ua = user_agent.toLowerCase();
    if (ua.indexOf('msie') === 0 && ua.indexOf('trident') === 0) {
        return false;
    }
    var match = /(?:msie|rv:)\s?([\d\.]+)/.exec(ua);
    if (match && parseInt(match[1], 10) >= 10) {
        return true;
    }
    // MS Edge Detection from this gist: https://gist.github.com/cou929/7973956
    var edge = /edge/.exec(ua); 
    if (edge && edge[0] == "edge") { 
        return true; 
    }
    return false;
}

module.exports = {
    detectPrivateMode: function(callback) {
        var is_private;

        if (window.webkitRequestFileSystem) {
            window.webkitRequestFileSystem(
                window.TEMPORARY, 1,
                function() {
                    is_private = false;
                },
                function(e) {
                    console.log(e);
                    is_private = true;
                }
            );
        } else if (window.indexedDB && /Firefox/.test(window.navigator.userAgent)) {
            var db;
            try {
                db = window.indexedDB.open('test');
            } catch(e) {
                is_private = true;
            }

            if (typeof is_private === 'undefined') {
                retry(
                    function isDone() {
                        return db.readyState === 'done' ? true : false;
                    },
                    function next(is_timeout) {
                        if (!is_timeout) {
                            is_private = db.result ? false : true;
                        }
                    }
                );
            }
        } else if (isIE10OrLater(window.navigator.userAgent)) {
            is_private = false;
            try {
                if (!window.indexedDB) {
                    is_private = true;
                }                 
            } catch (e) {
                is_private = true;
            }
        } else if (window.localStorage && /Safari/.test(window.navigator.userAgent)) {

            // One-off check for weird sports 2.0 polyfill
            // This also impacts iOS Firefox and Chrome (newer versions), apparently
            // @see bglobe-js/containers/App.js:116
            if (window.safariIncognito) {
                is_private = true;
            } else {
                        try {
                           window.openDatabase(null, null, null, null);
                        } catch (e) {
                           is_private = true;
                        }

                try {
                    window.localStorage.setItem('test', 1);
                } catch(e) {
                    is_private = true;
                }
            } 

            if (typeof is_private === 'undefined') {
                is_private = false;
                window.localStorage.removeItem('test');
            }
        }



        retry(
            function isDone() {
                return typeof is_private !== 'undefined' ? true : false;
            },
            function next(is_timeout) {
                callback(is_private);
            }
        );
    }
};
 类似资料:
  • 模式分析用于验证模式、可视化查数据分布和标识数据离群值。首先,在对象选项卡中选择一个集合或视图,然后点击 “分析模式”,或在数据查看器中点击 “分析”。 【注意】仅适用于 MongoDB。 【提示】模式分析配置文件(.nsatmongodb)保存于设置位置。 工具栏 选项或按钮 描述 筛选 筛选文档以进行分析。 投影 包括或排除字段以进行分析。 分析: 从集合中选择样本文档以进行分析。 分析 开始

  • 模式分析用于验证模式、可视化查数据分布和标识数据离群值。首先,在对象选项卡中选择一个集合或视图,然后点击 ,或在数据查看器中点击 。 【注意】仅适用于 MongoDB。 【提示】模式分析配置文件(.nsatmongodb)保存于设置位置。 工具栏 选项或按钮 描述 筛选文档以进行分析。 包括或排除字段以进行分析。 分析: 从集合中选择样本文档以进行分析。 开始分析样本文档。 停止分析样本文档。 结

  • 模式分析用于验证模式、可视化查数据分布和标识数据离群值。首先,在对象选项卡中选择一个集合或视图,然后点击 “分析模式”,或在数据查看器中点击 “分析”。 【注意】仅适用于 MongoDB。 【提示】模式分析配置文件(.nsatmongodb)保存于设置位置。 工具栏 选项或按钮 描述 筛选 筛选文档以进行分析。 投影 包括或排除字段以进行分析。 分析: 从集合中选择样本文档以进行分析。 分析 开始

  • 所以,我在研究一个不和谐机器人。我正在使用on_message()事件,它可以在私人消息和服务器上工作。我想这只工作在私人信息,我不知道如何去做这件事。如果有人能帮助我,那就是拉阿德。

  • 如何通过CBC或ECB模式检测邮件是否为加密? 我已经做了一个函数,它可以在AES 128 CBC或ECB中随机加密,我可以在明文和密文之间进行汉明,但与密码模式无关。 如何检测分组密码模式? 先谢谢你

  • 有很多问题/答案有关的问题,但我有一个问题,非常接近其他问题,但在另一种意义上略有不同。不管怎样,它来了。 错误: 评论: 根据 C Primer 第 5 版第 2.44 页“声明为 constexpr 的变量是隐式的 const,必须通过常量表达式初始化:”。所以这很好。 标签 B -- 似乎对const的引用意味着引用是指一个const对象,而不允许进行修改,而"const引用"是指引用是co