iOS cookie 设置问题:safari 和 chrome

Posted

技术标签:

【中文标题】iOS cookie 设置问题:safari 和 chrome【英文标题】:iOS cookie setting issue: safari and chrome 【发布时间】:2017-07-10 21:56:17 【问题描述】:

我正在调试一个 cookie 设置问题,该问题仅在 ios 上的 Chrome 和 Safari 中重现。下面的代码块在 OSX 上的 Chrome/Safari/Firefox 上运行良好:

if (navigator.userAgent.indexOf('iPad') > -1) 
    window.onpagehide = placeCookie
 else 
    window.onbeforeunload = placeCookie


function placeCookie () 
    if (isAuthenticated()) 

        var cookie = 'cookieName=' + token + '; max-age=60'

        if (env === 'prod') 
            cookie += '; secure'
        

        document.cookie = cookie
    

此代码用于在窗口检测到导航时放置一个 cookie。在我们的例子中,因为它是 angularjs,我们正在监听页面重新加载,并且我们希望该 cookie 与请求一起使用。

重新加载代码:window.location.reload(true)

为了开发,我使用 Charles Proxy 来嗅探 cookie,并检查节点服务器上的 cookie,因为 safari 检查器在页面重新加载时关闭。当我重新打开检查器窗口时,我可以看到在浏览器中设置了 cookie,但服务器或 Charles 都看不到 cookie。这是 iPad 上 safari 检查器的 cookie 粘贴(server/charlesproxy 看不到):

Name        Value   Domain                      Path Expires 
cookieName  token   localhost.charlesproxy.com  /    7/10/2017, 11:23:13 PM 39

当我在其他浏览器上单步执行时,cookie 随处可见。

有人知道 iOS 不承认 cookie 的任何原因吗?是否有可能在放置 cookie 之前在 iOS 上发出请求?

如果我可以提供更多信息,请告诉我。

【问题讨论】:

为了清楚起见,您试图在他们导航到不同页面之前设置 cookie,并且 cookie 没有在下一页请求中发送? 这是我们正在监听的页面重新加载,因为它是一个 SPA,但除此之外,您是正确的。 如何重新加载页面? window.location.reload(true) 【参考方案1】:

我们使用

function setCookie(name, value, days = 7, path = '/') 
            const expires = new Date(Date.now() + days * 864e5).toUTCString()
            document.cookie = name + '=' + encodeURIComponent(value) + '; expires=' + expires + '; path=' + path
        

setCookie('cookieName', accessToken, 1);

它适用于所有设备/浏览器(据我所知 - 不是每个组合都经过测试,但肯定是在带有 Chrome/Safari 的 iPhone/Mac 和带有 Chrome 的 PC 上。)设置/保留 cookie。

它与您显示的代码(用于基本 cookie 创建)没有显着不同,并且可能仍然无法满足您的使用需求,但可能值得一试....

这是 getCookie 方面(我没有编写此代码 - 在某处捡到它 - 很可能! - 我只知道它很好用!:)

function getCookie(c_name) 
            if (document.cookie.length > 0) 
                c_start = document.cookie.indexOf(c_name + "=");
                if (c_start !== -1) 
                    c_start = c_start + c_name.length + 1;
                    c_end = document.cookie.indexOf(";", c_start);
                    if (c_end === -1) 
                        c_end = document.cookie.length;
                    
                    return unescape(document.cookie.substring(c_start, c_end));
                
            
            return "";
        

【讨论】:

以上是关于iOS cookie 设置问题:safari 和 chrome的主要内容,如果未能解决你的问题,请参考以下文章

$_COOKIE 在 Safari iOS 中不起作用

Safari 不接受 Cookie 而 FF 和 IE 接受

iOS 和 OS X 上的原生应用程序能否写入和读取 Safari 的网站数据,例如 cookie 和 Web Storage?

如何将 cookie 从我的 ios 应用程序共享到移动 safari?

Safari 不使用 JS Fetch API 设置 CORS cookie

iOS 应用程序如何访问 Safari cookie?